grep 和 sed 以及 tail -f 的管道似乎正在緩存

grep 和 sed 以及 tail -f 的管道似乎正在緩存

我正在嘗試建立一個工作系統來監視特殊日誌。我通常只想要一個非常特定的模式,我使用它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-bufferedsed's 選項--unbuffered

答案2

使用grep--line-buffered選項。

預設情況下,如果實用程式的標準輸出是終端,則使用行緩衝,但當其輸出連接到檔案描述符或管道時,則使用更大的緩衝區(可能為 4 或 8 kB)。

您很幸運,tail -F預設使用行緩衝,並且grep有一個命令列選項來啟用它。我不知道為任意命令啟用行緩衝的通用方法。

相關內容