real - linux tail用法




如何'grep'連續的流? (7)

可以在連續流上使用grep嗎?

我的意思是排序一個tail -f <file>命令,但是在輸出中使用grep來保留只有我感興趣的行。

我試過tail -f <file> | grep pattern tail -f <file> | grep pattern但似乎grep只能在tail完成時執行,也就是說永遠不會執行。


sed將是正確的命令( 編輯器)

tail -n0 -f <file> | sed -n '/search string/p'

然後如果您希望tail命令在您找到特定字符串時退出:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

很明顯,bashism:$ BASHPID將是tail命令的進程ID。 sed命令在管道尾部後面,因此sed進程ID將為$ BASHPID + 1。


你可以考慮這個答案作為增強..通常我正在使用

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F在文件旋轉的情況下更好(如果文件旋轉,-f將無法正常工作)

-A和-B對於在模式出現之前和之後獲取線是有用的。這些塊將出現在虛線分隔符之間


使用awk(另一個偉大的bash實用程序)而不是grep,你沒有行緩衝選項! 它將持續不斷地從尾部流式傳輸數據。

這是你如何使用grep

tail -f <file> | grep pattern

這是你將如何使用awk

tail -f <file> | awk '/pattern/{print $0}'

在大多數情況下,你可以tail -f /var/log/some.log |grep foo ,它會工作得很好。

如果您需要在運行的日誌文件中使用多個grep,並且您發現沒有輸出,則可能需要將--line-buffered開關插入中間 grep(s),如下所示:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

我使用tail -f <file> | grep <pattern> tail -f <file> | grep <pattern>

它會等到grep刷新,直到完成(我使用的是Ubuntu)。


我認為你的問題是grep使用了一些輸出緩衝。 嘗試

tail -f file | stdbuf -o0 grep my_pattern

它會將grep的輸出緩沖模式設置為無緩衝。


沒有看到任何人提供了我通常的做法:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

我更喜歡這個,因為你可以使用ctrl + c來停止和瀏覽文件,然後點擊shift + f返回實時流媒體搜索。





tail