Analisando apenas linhas que possuem 9 períodos

0

Eu tenho 90 gig de dados selecionados de 13,5 terabytes.

Eu tentei sort -u | uniq em dados que foram awk'd do 13.5T de dados do syslog.

Alguns dados malformados eram aparentes, então eu reran o parse com awk e 'visto' assim:

 awk -F, '!seen[$1]++' inputfile > outputfile

Este acabou por ser o meio mais eficiente, mas também incluiu alguns dados malformados ... talvez existam entradas de log malformadas ou na ordenação de uniq'ing e awk'ing algumas linhas foram munged. Eu não me importo se existe uma maneira mais / melhor de analisar os dados originais, já que eu tenho um tamanho de amostra grande o suficiente - o que significa que perder alguns dados de 13.5T é OK.

Existem 3 endereços IP por linha válida.

Como há três períodos em um endereço IP, preciso de algo que analise apenas as linhas com 9 ".".

    
por 0xffffff 29.11.2017 / 20:46

1 resposta

1

Vamos considerar isso como um arquivo de teste:

$ cat testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep
1.2.3.4 5.6.7.8 9.10.11     Bad: Missing 1
1.2.3.4 5.6.7.8 9.10.11.12. Bad: Extra period

Usando o grep

Para selecionar linhas com exatamente nove períodos:

$ grep -E '^([^.]*\.){9}[^.]*$' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

[^.]*\. corresponde a qualquer número de caracteres não periódicos seguido por um ([^.]*\.){9} corresponde exatamente a nove sequências de zero ou mais caracteres não periódicos seguidos por um período. O ^ no início requer que a correspondência de expressão regular comece no início da linha. O [^.]*$ significa que, entre o final das nove seqüências e o final da linha, apenas caracteres não periódicos são permitidos.

Usando sed

$ sed -En '/^([^.]*\.){9}[^.]*$/p' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

A opção -n diz ao sed para não imprimir, a menos que seja explicitamente solicitado. O p após o regex solicita explicitamente ao sed para imprimir as linhas que correspondem ao regex.

Usando o awk

$ awk '/^([^.]*\.){9}[^.]*$/' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

Ou, usando a habilidade do awk para definir um personagem para separar campos (dica do chapéu: Jeff Schaller ) :

$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep
    
por 29.11.2017 / 20:58