Tenho 90 GB de dados extraídos de 13,5 Terabytes.
Eu tentei sort -u | uniq
dados 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 -n
opção diz ao sed para não imprimir, a menos que solicitemos explicitamente. A p
seguir, 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