sort e uniq no awk

4

Eu sei que existem "sort" e "uniq" por aí, no entanto, a pergunta de hoje é sobre como utilizar o AWK para fazer esse tipo de trabalho. Diga se eu tenho uma lista de qualquer coisa realmente (ips, nomes ou números) e quero classificá-los;

Aqui está um exemplo que estou tirando os números IP de um registro de e-mail:

awk 'match($0,/\[[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\]/) { if ( NF == 8 && $6 == "connect" ) {print substr($0, RSTART+1,RLENGTH-2)} }' maillog

É possível classificá-los, ips, "on the go" dentro do mesmo comando awk? Eu não preciso de uma resposta completa para a minha pergunta, mas algumas dicas por onde começar.

Felicidades!

    
por Peter 30.03.2015 / 10:10

1 resposta

10

Para classificar, você pode usar um pipe também dentro de um comando awk , como em:

awk '{ print ... | "sort ..." }'

A sintaxe significa que todas as respectivas linhas do arquivo de dados serão passadas para a mesma instância de classificação.

É claro que você também pode fazer isso de maneira equivalente no nível do shell:

awk '{ print ... }' | sort ...

Ou você pode usar o GNU awk , que tem algumas funções de classificação definidas nativamente.

O uniq é em awk normalmente obtido salvando o "elemento ou chave de dados exclusivos" em uma matriz associativa e verificando se novos dados precisam ser memorizados. Um exemplo para ilustrar:

awk '!a[$0]++'

Isso significa: Se a linha atual não estiver na matriz, a condição é verdadeira e a ação padrão para imprimir a linha é acionada. Linhas subseqüentes com os mesmos dados resultarão em uma condição falsa e os dados não serão impressos.

    
por 30.03.2015 / 10:46

Tags