从系统日志流的“tail -f”中提取字段

从系统日志流的“tail -f”中提取字段
Example line from syslog file:
Aug  1 10:25:50 10.10.10.1 id=firewall sn=XXXX time="2012-08-01 14:35:18 UTC" fw=x.x.x.x pri=6 c=1024 m=537 msg="Connection Closed" f=11 n=195273698 src=x.x.x.x:60246:X3: dst=x.x.x.x:443:X6:host.domain.com proto=tcp/https sent=181793 rcvd=649678

我想做一个

$ tail -f /var/log/log.log | SOMETHING

那将会返回

"src=x.x.x.x dst=x.x.x.x"

简单地说,我希望能够从文本中提取特定字段。我不想根据字段编号(行中的位置)选择这些字段,因为随着生成此文件的系统,事物的顺序可能会略有变化,因此它不起作用。

愿意接受建议,但更希望它是一句俏话。

答案1

tail -f log | perl -e 'while (<>) { print "src=$1 dst=$2\n" if $_ =~ /src=([^\s]+) dst=([^\s]+)/; }'

答案2

sed 's/^.*\(src=[0-9.][0-9.]*\).*\(dst=[0-9.][0-9.]*\).*$/\1 \2/'

提取与“sed”匹配的正则表达式而不打印周围的字符

答案3

grep 有一个--line-buffered选项可以让你跟随tail -f

tail -f /var/log/messages | grep --line-buffered  'src=[0-9.]+\s+dst=[0-9.]+'

答案4

或者,对 warlOck 进行一些改进:

tail -f log | perl -n -e 'print "$1 $2\n" if /(src=[^\s]+) (dst=[^\s]+)/;'

(我还没弄清楚如何评论答案......)

相关内容