Analisando apenas linhas que possuem 9 pontos

Analisando apenas linhas que possuem 9 pontos

Tenho 90 GB de dados extraídos de 13,5 Terabytes.

Eu tentei sort -u | uniqdados que foram detectados nos 13,5T de dados do syslog.

Alguns dados malformados eram aparentes, então executei novamente a análise com awk e 'vi' assim:

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

Este acabou sendo o meio mais eficiente em termos de tempo, mas também incluiu alguns dados malformados ... talvez haja entradas de log malformadas ou na classificação uniq'ing e awk'ing algumas linhas foram apagadas. Não me importo se existe uma maneira melhor/melhor de analisar os dados originais, já que tenho um tamanho de amostra grande o suficiente - o que significa que perder alguns dados de 13,5T é aceitável.

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

Como existem 3 pontos em um endereço IP, preciso de algo que analise apenas as linhas que tenham 9 "."

Responder1

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 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 sem ponto seguido por um ([^.]*\.){9}corresponde exatamente a nove sequências de zero ou mais caracteres sem ponto seguidos por um ponto. O ^início requer que a regex corresponda começando no início da linha. Isso [^.]*$significa que, entre o final das nove sequências e o final da linha, apenas caracteres que não sejam de ponto final são permitidos.

Usando sed

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

A -nopção diz ao sed para não imprimir, a menos que solicitemos explicitamente. A pseguir, o regex pede 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 capacidade do awk de definir um caractere para campos separados (dica:Jeff Schaller):

$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12  Keep

informação relacionada