ファイルから「include」と「exclude another term」をgrepするにはどうすればいいですか?

ファイルから「include」と「exclude another term」をgrepするにはどうすればいいですか?

特定の用語を含め、別の用語を除外する grep 検索を構築しようとしています。複数の -E "パターン" オプションを使用しようとしましたが、うまくいきませんでした。

以下は私が試したコマンドの例です。

grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv

しかし、出力結果は2番目の制約grep -Eiv "10.10.210.154"にのみ一致します

答え1

\,17\:31IPアドレスからではなく、検索したい場合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場合、最初のものはパイプが壊れていることを通知され、終了します。grepgrep

または、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つの利点があり、これはこれは私のもう一つの答えです

関連情報