extrai campos de “tail -f” de um fluxo de syslog

5
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

Eu quero fazer um

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

Isso retornará

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

No plainspeak, quero poder extrair campos específicos do texto. Eu não quero selecionar esses campos com base em um número de campo (posição na linha) porque a ordem das coisas pode mudar um pouco com o sistema que gera esse arquivo, portanto, não funciona.

Aberto a sugestões, mas preferiria que fosse um de uma linha.

    
por LVLAaron 01.08.2012 / 16:42

5 respostas

4

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

    
por 01.08.2012 / 16:46
3
sed 's/^.*\(src=[0-9.][0-9.]*\).*\(dst=[0-9.][0-9.]*\).*$/ /'

Veja Extraindo um regex correspondido com 'sed' sem imprimir os caracteres adjacentes

    
por 02.08.2012 / 02:26
1

grep tem uma opção --line-buffered que permite seguir tail -f

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

não é tão bonito, mas outra solução implementada com o awk:

tail -f /var/log/log.log | awk 'FS="src=" { print "src="$2 }' | awk 'FS=":" { print $1$4 }''


Atualização: editada como uma linha para tail -f

    
por 01.08.2012 / 18:59
0

Ou, melhorando um pouco sobre o warlOck:

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

(Ainda não descobri como comentar uma resposta ...)

    
por 02.08.2012 / 16:08