syslog 스트림의 "tail -f"에서 필드 추출

syslog 스트림의 "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

--line-bufferedgrep에는 다음을 수행할 수 있는 옵션이 있습니다.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]+)/;'

(아직 답변에 댓글을 달 방법을 찾지 못했습니다...)

관련 정보