mycommand.sh
2回実行できないスクリプトがあります。出力を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を使う
次のコマンドは、coolregex
file1 と一致するすべての行を送信します。他のすべての行はfile2に移動します。
./mycommand.sh | awk '/[coolregex]/{print>"file1";next} 1' >file2
仕組み:
/[coolregex]/{print>"file1";next}
正規表現に一致するすべての行は
coolregex
に印刷されますfile1
。その後、残りのすべてのコマンドをスキップして再起動しますnext
。1
他のすべての行は標準出力に送信されます。
1
awkの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