从grep到awk的管道不起作用


34

我正在尝试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}'

我等了多久都没有。我怀疑这与流的工作方式有关。

有人有任何线索吗?

Answers:


55

它可能是grep的输出缓冲。您可以使用禁用它grep --line-buffered

但是您不需要将grep的输出通过管道传输到awk。awk可以自己完成regexp模式匹配。

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


8

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

这里的问题是是awk逐行接收数据还是作为一个较大的数据块接收。由于grep的GNU版本效率更高,因此它以较大的块发送输出,但它awk需要逐行读取才能逐行输出。

这样说:grep只会在缓冲区已满时发送数据,awk正在等待该缓冲区已满,因此它什么也不发送。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.