組合linux指令不寫入outfile.txt

組合linux指令不寫入outfile.txt

我想在日誌檔案中(即時)搜尋 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

相關內容