Bash: how to make a substitution in a "live" pipe?

Viewed 336

In my office firewall I use a command like this:

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

to monitor LAN clients sending mail (I need to early detect any possible spammer bot from some client, we have very looooose security policies, here... :-().

So far, so good: I have a continuous output as soon any client sends an email.

But, if I add some filter to get a cleaner output, something like this:

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

(here I intend to get only source ip/name), I do not get any output until tcpdump output is more than (bash?) buffer size... (or at least I suppose so...).

Nothing changes using 'sed' instead of 'perl'...

Any hint to get a continuous output of filtered data?

3 Answers
Related