Bash:如何在“实时”管道中进行替换?

4
在我的办公室防火墙中,我使用类似以下命令的语句:
$ sudo tcpdump -v -s 1500 -i eth0 port 25 | grep 'smtp: S'

要监控局域网客户端发送的邮件(我需要尽早检测出可能来自某个客户端的垃圾邮件机器人,我们在这里有非常宽松的安全政策... :-()。

到目前为止,情况还不错:只要有任何客户端发电子邮件,就会有持续的输出。

但是,如果我添加一些过滤器来获得更干净的输出,类似于这样:

$ sudo tcpdump -v -s 1500 -i eth0 port 25 | grep 'smtp: S' | perl -pe 's/(.*?\)) (.*?)\.\d+ \>(.*)/$2/'

我想要获取源IP/名称,但在tcpdump输出超过(bash?)缓冲区大小之前,我没有获得任何输出...(或者至少我是这样认为的...)。

使用'sed'代替'perl'也没有改变什么...

有什么提示可以连续输出过滤后的数据吗?

3个回答

4
在第一个命令之前加上stdbuf:
sudo stdbuf -o0 tcpdump ...

2

但是,如果我添加一些过滤器来获得更干净的输出,就像这样:

使用--line-buffered选项进行grep

   --line-buffered
          Use  line  buffering  on  output.   This can cause a performance
          penalty.

0

尝试使用sed --unbuffered(或类似AIX上的-u)以获得流版本(不等待EOF)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接