从 grep 到 awk 的管道无法正常工作

从 grep 到 awk 的管道无法正常工作

我正在尝试grep持续的tail文件日志并n从一行中获取第 th 个单词。示例文件:

$ 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}'

无论我等多久都没有任何结果。我怀疑这与流的工作方式有关。

有人有任何线索吗?

答案1

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

但您不需要将 grep 的输出通过管道传输到 awk。 awk 可以自己进行正则表达式模式匹配。

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

答案2

使用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 正在等待该缓冲区被填满,因此它什么也不发送。

答案3

请参阅--line-buffered的选项grep

相关内容