ファイルから複数のフラグメントを抽出したい場合、またはフラグメントが発生する必要がある場合は、少なくともログファイルを監視したいが、複数の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
使用できます。awk
sed
そしてawk
:
tail -f /var/log/syslog |
awk '{ print }
/cron1/ { print >"CRON" }
/cloud-print/ { print >"CLOUD-INIT" }'
以下を使用してください(コマンドは常にファイルにデータを追加するため、sed
出力ファイルが存在しないことを確認する必要があります)。w
sed
rm -f CLOUD CLOUD-INIT
tail -f /var/log/syslog |
sed -e '/cloud/w CLOUD' \
-e '/cloud-print/w CLOUD-INIT'