是否有一個命令結合了“tee”和“grep”,以便在管道中 tee 部分可以直接匹配到文件?

是否有一個命令結合了“tee”和“grep”,以便在管道中 tee 部分可以直接匹配到文件?

我希望從文件中提取多個片段,或至少監視日誌檔案中的片段(如果它們應該發生),但我不想設定多個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可以使用。awksed

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'

相關內容