Tengo 90 gigas de datos seleccionados de 13,5 terabytes.
Probé sort -u | uniq
datos 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 -n
opción le dice a sed que no imprima a menos que se lo solicitemos explícitamente. A p
continuació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