コマンドを一度実行し、複数のファイルの出力をフィルタリングします。

コマンドを一度実行し、複数のファイルの出力をフィルタリングします。

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

awkgrepより速く、分岐や何度も必要とせず、必要な数のファイルの書き込みに合わせて簡単に拡張できるため、より良いツールです。 .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答えを使用します。

関連情報