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

时间:2013-12-13 11:51:18

标签: perl bash pipe

在我的办公室防火墙中,我使用如下命令:

$ sudo tcpdump -v -s 1500 -i eth0 port 25 | grep 'smtp: S'

监控发送邮件的LAN客户端(我需要从某个客户端提前发现任何可能的垃圾邮件机器人,我们有非常宽松的安全策略,这里......: - ()。

到目前为止,非常好:任何客户发送电子邮件后我都会连续输出。

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

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

(这里我打算只获取源ip /名称),直到tcpdump输出超过(bash?)缓冲区大小...(或者至少我想是这样......),我才得到任何输出。 / p>

使用'sed'代替'perl'没有任何变化......

任何提示连续输出过滤数据的提示?

3 个答案:

答案 0 :(得分:4)

stdbuf放在第一个命令之前:

sudo stdbuf -o0 tcpdump ...

答案 1 :(得分:2)

  

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

使用--line-buffered的{​​{1}}选项:

grep

答案 2 :(得分:0)

尝试使用sed --unbuffered(或有时像AIX上的-u)来获得蒸汽版本(不等待EOF)