Bash

從 grep 到 awk 的管道不起作用

  • August 25, 2016

我正在嘗試grep進行tail文件日誌並n從一行中獲取第一個單詞。範例文件:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

現在如果我做一個tail

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

如果我grep這樣tail

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

但如果我awk這樣grep

$ tail -f test.txt | grep Beam | awk '{print $3}'

不管我等多久都沒有。我懷疑這與流的工作方式有關。

有人有任何線索嗎?

它可能是來自 grep 的輸出緩衝。你可以用grep --line-buffered.

但是您不需要將 grep 的輸出通過管道傳輸到 awk。awk 可以自己進行正則表達式模式匹配。

tail -f test.txt | awk '/Beam/ {print $3}'

使用tail -f test.txt | awk '/Beam/{print $3}'對我有用。以及使用tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep)。

這裡的問題是,是awk逐行接收數據還是作為一個更大的數據塊接收數據。GNU 版本的 grep 以更大的塊發送輸出,因為它更高效,但awk需要逐行讀取才能逐行輸出。

這樣說:grep只有當緩衝區被填滿時才會發送數據,awk 正在等待緩衝區被填滿,所以它什麼也不發送。

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