grep 的输出重定向未按预期工作

grep 的输出重定向未按预期工作

管道

sudo ngrep -W byline -qilw 'get' tcp dst port 80 | grep -i ".*" |tee /tmp/output

或者

sudo ngrep -W byline -qilw 'get' tcp dst port 80 | grep -i ".*" > /tmp/output

/tmp/output当我执行 HTTP GET 请求时,不会写入任何内容。

如果没有重定向,我可以在标准输出上获得一些输出。为什么?

答案1

grep当实用程序未连接到终端时,它将对其输出进行缓冲。在填充并刷新 的/tmp/output输出缓冲区之前,您将不会在文件中看到任何输出。grep

只要ngrep运行,这就会成为一个问题。一旦ngrep终止,grep将在终止之前刷新其输出缓冲区。

进行此缓冲是出于性能原因。将一行文本刷新到输出需要很短的时间,但是当涉及大量数据时,这会减慢管道速度。

您可以关闭缓冲grep,或者更确切地说,启用行缓冲。对于 BSD 和 GNU grep,这是通过非标准选项完成的--line-buffered,所以你会得到

sudo ngrep -W byline -qilw get tcp dst port 80 |
grep --line-buffered -i '.*' |
tee /tmp/output

或者,您可以完全删除它,grep因为它将传递所有行ngreptee正则表达式.*在每一行上匹配,无论它是否为空)。

相关内容