管道
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
因为它将传递所有行ngrep
(tee
正则表达式.*
在每一行上匹配,无论它是否为空)。