AWK imprime padrão de regex

0

Estou tentando imprimir um padrão de regex para o seguinte log de email. Em particular, estou tentando obter o ID entre os colchetes (veja a segunda linha para referência).

Mar 29 03:48:13 mx-150 clamsmtpd: 14114F: accepted connection from: 127.0.0.1
Mar 29 03:48:13 mx-150 postfix/smtpd[7445]: connect from unknown[127.0.0.1]
Mar 29 03:48:13 mx-150 spamd[15674]: prefork: child states: II

e usando o seguinte comando:

awk '/\[\d+\]/ { print }' maillog

De acordo com o link , estou recebendo 1 correspondência; no entanto, o awk não está retornando nada. Por que isso?

    
por Peter 29.03.2015 / 21:57

4 respostas

5

Tente regexps padrão (em vez de perl regexps). Isso imprimirá as linhas correspondentes:

awk '/\[[[:digit:]]+\]/ { print }' maillog

Para extrair e imprimir o valor correspondente dentro dos colchetes:

awk 'match($0,/\[[[:digit:]]+\]/) { print substr($0,RSTART+1,RLENGTH-2)}' maillog
    
por 29.03.2015 / 22:00
3

Outra abordagem:

awk -F'[][]' 'NR>1{print $2}' maillog
7445
15674
    
por 29.03.2015 / 22:09
1

Se você gosta de awk , o próximo script imprime cada segundo campo se a string for dividida por [] (isso significa dentro dela)

awk -F [][] '{for(i=2;i<=NF;i+=2)print $i}' maillog

Mas faça o mesmo com grep de muito simples

grep -o '\[[^]]*\]' maillog
    
por 29.03.2015 / 23:06
0

Dependendo do que você deseja combinar

awk -F"[][]" '/postfix|spamd/{print $2}' maillog
    
por 30.03.2015 / 01:41