连续管道的grep不起作用

时间:2017-02-10 11:20:24

标签: linux bash grep pipe stdout

(也许是" tcpflow"问题)

我编写了一个脚本来监控http流量,然后安装tcpflow,然后安装grep

有效(您应该发出http请求,例如curl www.163.com

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: '

它输出像这样(连续)

Host: config.getsync.com
Host: i.stack.imgur.com
Host: www.gravatar.com
Host: www.gravatar.com

但我无法继续使用竖管

不起作用(没有输出)

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' | cut -b 7- 

不起作用(没有输出)

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | grep '^Host: ' | grep H

当我将sudo tcpflow替换为cat foo.txt时,它可以正常运行:

cat foo.txt | grep '^Host: ' | grep H

那么管道或grep或tcpflow出了什么问题呢?

更新

这是我的最终剧本:https://github.com/zhengkai/config/blob/master/script/monitor_outgoing_http.sh

2 个答案:

答案 0 :(得分:8)

grep连续信息流使用--line-buffered选项:

sudo tcpflow -p -c -i eth0 port 80 2> /dev/null | grep --line-buffered '^Host'
  

<强> - 行缓冲

     

在输出上使用线缓冲。这可能会导致性能下降。

还提到了有关缓冲输出(stdbuf工具)的一些反思:

Pipes, how do data flow in a pipeline?

答案 1 :(得分:5)

我认为问题是由于stdio buffering,您需要在调用GNU stdbuf之前使用grep

sudo tcpflow -p -c -i eth0 port 80 2>/dev/null | stdbuf -o0 grep '^Host: '

使用-o0,它基本上意味着来自stdout的输出(tcpflow)流将是无缓冲的。默认行为是在发送到管道中的下一个命令之前自动将数据缓冲到4096 1 字节块中,这是使用stdbuf覆盖的内容

<子> 1.将此nice detail引用到主题中。