我想在日誌檔案中(即時)搜尋 msg="yxyxyx" 的內容,然後將唯一值寫入 outfile.txt
我寫了這個:
tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt
輸出檔案已建立但為空。它完美地寫入控制台,沒有 >> outfile.txt 部分。
謝謝你!
答案1
您可以在 awk 指令之前使用 stdbuf -oL 或 stdbuf -o0 嗎,如下所示;
tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
尾-f 防火牆.log | sed -nu '/msg=/{s/.味精=//;s/\S=.*//;p}' | stdbuf -o0 awk '!seen[$0]++' >> outfile.txt
人 sed;
-u, --無緩衝
從輸入檔加載最少量的資料並更頻繁地刷新輸出緩衝區
人stdbuf;
stdbuf - 執行指令,並修改其標準流的緩衝操作。
-o, --output=MODE 調整標準輸出流緩衝
如果 MODE 為“L”,則相應的流將被行緩衝。此選項對於標準輸入無效。
如果 MODE 為“0”,則對應的流將不會被緩衝。
例如;
首先運行這個;
user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
運行另一個終端;echo msg="1" >> firewall.log
,輸出如下;
user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
user@host$ cat outfile.txt
1
再次運行同樣echo msg="1" >> firewall.log
,輸出沒有變化;
運行後;echo msg="2" >> firewall.log
,輸出如下;
user@host$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
user@host$ cat outfile.txt
1
2