我希望從文件中提取多個片段,或至少監視日誌檔案中的片段(如果它們應該發生),但我不想設定多個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
以便在管道中的 tee 部分可以將匹配直接匹配到文件?
答案1
假設 shell 具有進程替換,>(...)
:
tail -f /var/log/syslog |
tee >(grep cron1 >CRON) |
tee >(grep cloud-init2 >CLOUD-INIT)
這將導致為管道中的tail
第一個生成數據。tee
它將tee
複製資料並將副本傳送到下一個副本,tee
並將另一個副本傳送到進程替換。此過程替換將grep
在來自 的資料上運行tee
,結果將寫入檔案CRON
。
管道的最後階段將以類似的方式運作。
在進程取代不可用的 shell 中,例如或/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'