我正在嘗試建立一個工作系統來監視特殊日誌。我通常只想要一個非常特定的模式,我使用它grep
和一個管道從中提取該模式tail -f
。我注意到 grep 不會輸出所有內容,而是保留一些行進行緩衝。我想如果您有一個管道可以輸出所有內容然後終止並關閉流,那麼這是有意義的。
但這tail -f
對我來說不起作用。
同樣的問題也出現在sed
.
這是我想使用的範例命令:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'
舉個例子:
上面命令的最後一行是這樣的:
2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x
並使用這個指令:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g
最後一行是這樣的:
2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y
刪除更多的管道可以讓我進一步了解最新的條目。
我怎樣才能避免管道中的這種快取?
答案1
新增grep
's 選項--line-buffered
和sed
's 選項--unbuffered
。
答案2
使用grep
的--line-buffered
選項。
預設情況下,如果實用程式的標準輸出是終端,則使用行緩衝,但當其輸出連接到檔案描述符或管道時,則使用更大的緩衝區(可能為 4 或 8 kB)。
您很幸運,tail -F
預設使用行緩衝,並且grep
有一個命令列選項來啟用它。我不知道為任意命令啟用行緩衝的通用方法。