特定の用語を含め、別の用語を除外する grep 検索を構築しようとしています。複数の -E "パターン" オプションを使用しようとしましたが、うまくいきませんでした。
以下は私が試したコマンドの例です。
grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv
しかし、出力結果は2番目の制約grep -Eiv "10.10.210.154"にのみ一致します
答え1
\,17\:31
IPアドレスからではなく、検索したい場合10\.10\.210\.154
これを使えばいいですよ。
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
答え2
注記:もう一つの答え動作するはずですが、何も説明されていません。したがって、私の説明的な回答です。
2 番目にgrep
を読み取るように指示したので、そのとおりになります。ファイルを操作するときにはfile.csv
これが実行されるため、標準入力は無視されます。grep
実際には、2 番目のgrep
コマンドは最初のコマンドが存在しないかのように動作します。ファイルの処理と出力 (ある場合) の印刷後に終了します。
最初のものgrep
は入力を待ちます (対話型シェルで実行する場合は、通常はキーボードから)。パイプ バッファーが出力を 2 番目のものに渡すことを決定するまで、多くの行を受け取り、標準出力に多くの (一致する) 行を出力することさえできます。その後、2 番目のものが存在しなくなったgrep
場合、最初のものはパイプが壊れていることを通知され、終了します。grep
grep
または、Ctrl+を押してD入力の終了を示すか、Ctrl+を押してC最初の入力grep
(およびまだ有効な場合は 2 番目の入力) を終了できます。ただし、これではデータ フローは修正されません。
適切なデータ フローは次のようになります。最初にgrep
ファイルを読み取り、その結果を 2 番目にパイプする必要があります。
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"
後者の構文には少なくとも1つの利点があり、これはこれは私のもう一つの答えです。