Linux
組合的 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 已創建但為空。它在沒有 >> 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