mycommand.shを一度だけ実行して、フィルタリングされた出力を複数のファイルにリダイレクトできますか?
サンプル出力は次のようになります。
mycommand.sh | grep --line-buffered -B 1 A >> file1 ; my command.sh | grep --line-buffered -A 1 B >> file2
または何とかegrepを使用することができます...
答え1
そしてawk
注文する:
mycommand.sh | awk '/A/{ print > "file1" }/B/{ print > "file2" }'
/A/{ print > "file1" }
- 記録がパターンと一致する場合は、記録A
全体を次に印刷/リダイレクトします。file1
答え2
awk
grep
より速く、分岐や何度も必要とせず、必要な数のファイルの書き込みに合わせて簡単に拡張できるため、より良いツールです。 .NETなどのperl
他のほとんどのスクリプト言語でも同様ですpython
。
シェルでは次のものを使用できますtee
。プロセスの交換。例えば
mycommand.sh |
tee >(grep --line-buffered -A 1 B >> file2) |
grep --line-buffered -B 1 A >> file1
(読みやすくするために改行とインデントを追加します。見苦しくて読みにくいコンテンツが好きなら、すべてが1行で機能します)
tee
入力内容を次のように書き込みます。両方stdout(たとえば、端末に、ファイルにリダイレクトされるか、パイプの次のコマンドにパイプされる)そしてコマンドラインで指定されたファイルに移動します。
この場合、「ファイル」は、プロセスの置き換え(grep
たとえば、上記の例のようにリダイレクトされた出力を持つ他のコマンド)によって提供されるファイル記述子です。
tee
複数の出力ファイル(またはプロセス置換ファイル記述子)を同時に書き込むことができます。たとえば、
mycommand.sh |
tee >(grep --line-buffered -A 1 B >> file2) \
>(grep --line-buffered -A 1 C >> file3) \
>(grep --line-buffered -A 1 D >> file4) |
grep --line-buffered -B 1 A >> file1
これはうまくいきますが、個人的に@RomanPerekhrestのawk
答えを使用します。