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