tailをgrepにパイプするときに結果から特定の単語を除外したい

tailをgrepにパイプするときに結果から特定の単語を除外したい

私は「tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep -e Ban -e BLOCK -e ALLOW」(引用符なし) を使用しており、これは機能していますが、UDP と ICMP という単語を含む結果を除外したいと考えています。「tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep -e Ban -e BLOCK -e ALLOW -v UDP -v ICMP」を試みると、「grep: UDP: No such file or directory」というエラーが発生します。パイプ処理時に -v を使用して単語を除外することは機能しないようです。

ここに画像の説明を入力してください

答え1

最初の出力を別の grep にパイプして、次のように別の「フィルター」として使用することができます。

tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep "Ban\|BLOCK\|ALLOW" | grep -v "UDP\|ICMP"

grep は、パイプ「|」で区切られた二重引用符を使用すると、正規表現であっても異なる文字列をスタックできますが、奇妙な結果にならないように「\」で文字をエスケープする必要があります。

-vパラメータは文字通りmanで言う

-v, --invert-match 一致の意味を反転して、一致しない行を選択します。

したがって、決定した一致を反転するだけなので、それをパラメーター化することはできません。

概要にあるように、3 種類のパラメータを指定できます。オプション、パターン、ファイルです。

オプション全体は常に - または -- で始まり、複数のオプションを配置できます。

-e または -f を使用するか、または何も指定せずに、単一のパターンまたは特定のタイプのパターンを決定できます。

そして、最後は常にファイルまたはディレクトリである必要があります (ディレクトリを再帰的に処理するには -R パラメータが必要ですが、ディレクトリ/* と入力するだけで済みます)。指定されていない場合は、実行しているように標準入力を読み取ろうとします。

   SYNOPSIS
   grep [OPTION...] PATTERNS [FILE...]
   grep [OPTION...] -e PATTERNS ... [FILE...]
   grep [OPTION...] -f PATTERN_FILE ... [FILE...]

とにかくこれはすでに答えたもっと基本的な意味で

答え2

この問題を回避するには、2 つの ssh セッションを使用します。最初の grep ステートメントの結果をファイルにパイプし、2 番目の ssh セッションで grep にパイプされた結果を tail します。(最初の ssh セッション) - tail -f /var/log/fail2ban.log -f /var/log/ufw.log | grep -v ICMP >/home/user/staging (2 番目の ssh セッション) - tail -f /home/user/staging | grep -e ALLOW -e BLOCK 少し変わっていますが、機能します。

関連情報