【问题标题】:Bash: how to make a substitution in a "live" pipe?Bash:如何在“实时”管道中进行替换?
【发布时间】:2014-01-01 04:23:32
【问题描述】:

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

$ 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?)缓冲区大小...(或者至少我想是这样...),我才会得到任何输出。

使用 'sed' 而不是 'perl' 没有任何改变...

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

【问题讨论】:

    标签: perl bash pipe


    【解决方案1】:

    stdbuf放在第一个命令之前:

    sudo stdbuf -o0 tcpdump ...
    

    【讨论】:

      【解决方案2】:

      但是,如果我添加一些过滤器以获得更清晰的输出,例如 这个:

      grep 使用--line-buffered 选项:

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

      【讨论】:

        【解决方案3】:

        尝试使用 sed --unbuffered(或 -u,有时就像在 AIX 上一样)拥有一个 stram 版本(不等待 EOF)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-07
          • 2011-11-07
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 2018-04-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多