Analizando solo líneas que tienen 9 puntos

Analizando solo líneas que tienen 9 puntos

Tengo 90 gigas de datos seleccionados de 13,5 terabytes.

Probé sort -u | uniqdatos que se habían extraviado de los 13,5 T de datos de syslog.

Algunos datos con formato incorrecto eran evidentes, así que volví a ejecutar el análisis con awk y lo "visto" así:

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

Este resultó ser el medio más eficiente en términos de tiempo, pero también incluyó algunos datos con formato incorrecto... tal vez haya entradas de registro con formato incorrecto o al ordenar uniq'ing y awk'ing algunas líneas se modificaron. No me importa si hay una forma más/mejor de analizar los datos originales, ya que tengo un tamaño de muestra lo suficientemente grande, lo que significa que perder un poco de datos de 13,5T está bien.

Hay 3 direcciones IP por línea válida.

Dado que hay 3 puntos en una dirección IP, necesito algo que analice solo las líneas que tienen 9 "."

Respuesta1

Tomemos esto como un archivo de prueba:

$ 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 seleccionar líneas con exactamente nueve puntos:

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

[^.]*\.coincide con cualquier número de caracteres sin punto seguidos de un ([^.]*\.){9}coincide exactamente con nueve secuencias de cero o más caracteres sin punto seguidos de un punto. Al ^principio requiere que la expresión regular coincida comenzando al principio de la línea. Esto [^.]*$significa que, entre el final de las nueve secuencias y el final de la línea, solo se permiten caracteres que no sean puntos.

Usando sed

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

La -nopción le dice a sed que no imprima a menos que se lo solicitemos explícitamente. A pcontinuación, la expresión regular le pide explícitamente a sed que imprima aquellas líneas que coinciden con la expresión regular.

Usando awk

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

O bien, utilizando la capacidad de awk para definir un carácter para separar campos (consejo:Jeff Schaller):

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

información relacionada