Linux

組合的 linux 命令不寫 outfile.txt

  • November 2, 2016

我想在日誌文件(實時)中搜尋 msg=“yxyxyx” 的內容,然後將唯一值寫入 outfile.txt

我寫了這個:

tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt

Outfile 已創建但為空。它在沒有 >> outfile.txt 部分的情況下完美地寫入控制台。

謝謝!

您可以在 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 - 執行 COMMAND,並為其標準流修改緩衝操作。

-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

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