grepを使用して出力を2つのファイルに分割するにはどうすればよいですか?

grepを使用して出力を2つのファイルに分割するにはどうすればよいですか?

mycommand.sh2回実行できないスクリプトがあります。出力を2つの異なるファイルに分割したいと思います。 1 つは正規表現に一致する行を含み、もう 1 つは正規表現に一致しない行を含みます。私が望むものは基本的に次のようになります。

./mycommand.sh | grep -E 'some|very*|cool[regex].here;)' --match file1.txt --not-match file2.txt

出力をファイルにリダイレクトし、-vオプションを使用または使用せずに2つの異なるgrepにリダイレクトし、その出力を2つの異なるファイルにリダイレクトできることを知っています。しかし、grepでできることを知りたいです。

それでは、一行で私が望むことを達成できますか?

ベストアンサー1

これを達成する方法はいくつかあります。

awkを使う

次のコマンドは、coolregexfile1 と一致するすべての行を送信します。他のすべての行はfile2に移動します。

./mycommand.sh | awk '/[coolregex]/{print>"file1";next} 1' >file2

仕組み:

  1. /[coolregex]/{print>"file1";next}

    正規表現に一致するすべての行はcoolregexに印刷されますfile1。その後、残りのすべてのコマンドをスキップして再起動しますnext

  2. 1

    他のすべての行は標準出力に送信されます。 1awkのprint-the-lineの不思議な略語です。

また、複数のストリームに分割することもできます。

./mycommand.sh | awk '/regex1/{print>"file1"} /regex2/{print>"file2"} /regex3/{print>"file3"}'

プロセス交換の使用

これはawkソリューションほどエレガントではありませんが、完全性のためにプロセス置換と組み合わせた複数のgrepを使用することもできます。

./mycommand.sh | tee >(grep 'coolregex' >File1) | grep -v 'coolregex' >File2

複数のストリームに分割することもできます。

./mycommand.sh | tee >(grep 'coolregex' >File1) >(grep 'otherregex' >File3) >(grep 'anotherregex' >File4) | grep -v 'coolregex' >File2

おすすめ記事