Situación:
Tengo un archivo grande (millones de líneas) que contiene direcciones IP y puertos de una captura de red de varias horas, una ip / puerto por línea. Las líneas son de este formato:
ip.ad.dre.ss[:port]
Resultado deseado:
Hay una entrada para cada paquete que recibí al iniciar sesión, por lo que hay muchas direcciones duplicadas. Me gustaría poder ejecutar esto a través de un script de shell de algún tipo que pueda reducirlo a líneas del formato
ip.ad.dre.ss[:port] count
donde count
es el número de ocurrencias de esa dirección específica (y puerto). No hay que hacer ningún trabajo especial, trate los diferentes puertos como diferentes direcciones.
Hasta ahora, estoy usando este comando para eliminar todas las direcciones IP del archivo de registro:
grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt
A partir de eso, puedo usar una expresión regular bastante simple para eliminar todas las direcciones IP que fueron enviadas por mi dirección (que no me importa)
Entonces puedo usar lo siguiente para extraer las entradas únicas:
sort -u ips.txt > intermediate.txt
No sé cómo puedo agregar los recuentos de líneas de alguna manera con sort.
-bgr
casualmente parece un mnemotécnicobigger
, que es lo que queremos en la parte superior..bashrc
o.bash_aliases
archivo:function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }
. Llamar porcountuniquelines myfile.txt
.sort -nr
.Para contar el número total de líneas únicas (es decir, sin considerar líneas duplicadas) podemos usar
uniq
o Awk conwc
:Las matrices de Awk son asociativas, por lo que pueden ejecutarse un poco más rápido que la ordenación.
Generando archivo de texto:
fuente
Esta es la forma más rápida de obtener el recuento de las líneas repetidas y hacer que se impriman de forma agradable, de las menos frecuentes a las más frecuentes:
Si no le importa el rendimiento y desea algo más fácil de recordar, simplemente ejecute:
PD:
sort -n analiza el campo como un número, eso es correcto ya que estamos ordenando usando los recuentos.
fuente
!
en{!seen[$0]++}
es redundante en este caso, ya que sólo hacemos la impresión en elEND
.