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/'
答案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]+)/;'
(我还没弄清楚如何评论答案......)