Bash
從 grep 到 awk 的管道不起作用
我正在嘗試
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 正在等待緩衝區被填滿,所以它什麼也不發送。