パイプラインのtee部分をファイルと直接一致させるために「tee」と「grep」を結合するコマンドはありますか?

パイプラインのtee部分をファイルと直接一致させるために「tee」と「grep」を結合するコマンドはありますか?

ファイルから複数のフラグメントを抽出したい場合、またはフラグメントが発生する必要がある場合は、少なくともログファイルを監視したいが、複数のtail | grepセッションを設定したくありません。代わりに、各grepの出力を追跡したいと思います。

私はこれを行うために使用できると思いますawkが、おそらくこのアイデアに近いものがすでにあるでしょう。

たとえば、コマンドは次のようになります。

tail -f /var/log/syslog | teegrep cron1 -f CRON | teegrep cloud-init2 -f CLOUD-INIT

出力はCRONファイルとCLOUD-INITファイルになり、最終的にすべてがstdoutに送信されます。 「cron1」および「cloud-init2」行が一致するエントリのみがそのファイルに表示されます。

おそらく、それはすでに命令の一部ですが、私はそれを知らないかもしれません。あるいは、同じことをするためのbash / zshトリックがあるかもしれません。どちらにしても:パイプラインのティー部分でファイルと直接一致させるためにtee合計を結合するコマンドはありますか?grep

答え1

シェルにプロセス置換があると仮定すると、次のようになります>(...)

tail -f /var/log/syslog | 
tee >(grep cron1 >CRON) | 
tee >(grep cloud-init2 >CLOUD-INIT)

これにより、パイプラインのtail最初のデータのデータが生成されます。データをteeコピーしtee、あるコピーを次のコピーに送信し、もうtee一方のコピーをプロセス交換に送信します。プロセス置換はgrepのデータで実行され、tee結果はファイルに書き込まれますCRON

パイプラインの最後のステップも同様に機能します。


たとえば、プロセス置換を使用できないシェルでは、またはを/bin/sh使用できます。awksed

そしてawk

tail -f /var/log/syslog | 
awk '{ print }
     /cron1/       { print >"CRON" }
     /cloud-print/ { print >"CLOUD-INIT" }'

以下を使用してください(コマンドは常にファイルにデータを追加するため、sed出力ファイルが存在しないことを確認する必要があります)。wsed

rm -f CLOUD CLOUD-INIT

tail -f /var/log/syslog | 
sed -e '/cloud/w CLOUD' \
    -e '/cloud-print/w CLOUD-INIT'

関連情報