Grep

定期過濾更改文件並將過濾後的輸出重定向到新文件

  • February 10, 2022

假設我有log.txt

log.txt 的樣本格式如下: Code Data Timestamp

...
C:57 hello 1644498429
C:56 world 1644498430
C:57 water 1644498433
...

如果我想要包含的過濾字元串列,C:57我可以用

cat log.txt | grep C:57

然後我將輸出重定向到新文件,因此

cat log.txt | grep C:57 > filtered_log.txt

但是,當 log.txt 有新變化時,我應該再次重複執行該命令。我希望它定期執行或針對文件中的每個新更改執行,或者僅在有包含 string 的新行時執行C:57

您可以這樣使用tail -f

tail -f log.txt|grep C:57 >> filtered_log.txt

這會不斷讀取log.txtgrepping 令牌C:57並將任何匹配項添加到filtered.log.txt.

使用cat來讀取日誌和管道grep是無用的catgrep可以直接讀取文件。您通過組合 acat和 a來浪費 I/O grep

這裡的一個缺點是過濾輸出的出現可能由於緩衝而延遲。這可以通過以下方式規避:

tail -f log.txt|grep --line-buffered C:57 >> filtered_log.txt

或使用以下stdbuf -o0命令:

tail -f log.txt|stdbuf -o0|grep C:57 >> filtered_log.txt C:57

引用自:https://unix.stackexchange.com/questions/690080