Encontrando uma string com o awk e imprimindo a correspondência no word boundry

2

Sou um pouco novo no awk, então essa pergunta pode ter sido feita, mas não consigo encontrar uma solução para minha pergunta.

Usando o awk, eu gostaria de procurar por uma string no syslog, e só imprimir o valor até o próximo limite de palavras.

Rules:

  • Only awk can be used
  • Should be a one line Command in Linux

Dados de teste: O syslog contém entradas feitas pelo Firewall quando os pacotes são descartados. Essas linhas de informação contém vários valores e variam em tamanho (esqueça NF). O IP de origem sempre começa com SRC =

O que eu tenho até agora:

awk '/SRC=/ { print $13 }' /var/log/syslog*

No entanto, o problema é que o campo 13 nem sempre é o valor SRC.

O restante da solução pode ser visto nesta Pergunta: Listando um resumo com limites

    
por Willem P. Botha 12.01.2018 / 15:44

2 respostas

4
Solução

GNU awk :

awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' /var/log/syslog*

Isso restringirá os registros de processamento a apenas um campo que corresponda ao padrão SRC=[^[:space:]]+

Verificação de desempenho de tempo ( testlog tem 22756 linhas):

$ time(awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' testlog > /dev/null)

real    0m0.186s
user    0m0.164s
sys 0m0.000s

$ time(awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' testlog > /dev/null)

real    0m0.282s
user    0m0.256s
sys 0m0.000s
    
por 12.01.2018 / 15:51
3

Solução KISS (deve funcionar em qualquer sabor do awk) - basta passar por cima dos campos e testar um por um:

awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' /var/log/syslog
    
por 12.01.2018 / 15:54