Tengo un archivo en el siguiente formato:
$ cat file.txt
27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1
¿Cuál es la mejor manera de analizar el archivo file.txt
en un formato como:
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
En otras palabras, quiero recorrer el archivo y contar la cantidad de veces que aparece cada dirección IP. Ya lo he revisado sort
para que todas las direcciones IP estén en orden y directamente una tras otra.
Respuestas:
Estas buscando
uniq -c
Si el resultado no es de su agrado, puede analizarse y formatearse fácilmente.
Por ejemplo:
fuente
uniq
yawk
no parece ser un gran enfoque para mí ...uniq
solo funciona en entradas ordenadas (coincide con líneas coincidentes adyacentes, no con ninguna línea del archivo).sort
.uniq
parece ser la solución más inteligente, de hecho. La manera awk:fuente
sort
a mi respuesta es aún más rápido ya que hay que ordenar menos elementos. ;-)archivo de clasificación más rápido y luego contar por unic -c
sort filename | uniq -c
fuente
uniq -c
funcionaría pero proporcionaría la salida en el formato incorrecto. Esta es la razón por la cual la respuesta aceptada no usasort
y en su lugar formatea la salida deuniq -c
.Yo usaría python. Todos los sistemas Linux actualmente tienen python2 instalado.
Agregue cada dirección IP a un dict (matriz asociativa) como pares clave = valor, es decir, {"12.34.56.78": 1, "87.76.43.21": 3}.
Usted 'verifica' la dirección IP como una clave e incrementa el valor en 1. Si usa defaultdict ("ip"), si la clave no existe, se crea con un valor predeterminado de 0. Si la clave existe ya, defaultdict no hace nada. El valor se incrementa en la siguiente línea.
archivo de salida:
Sé que estaba buscando una solución de línea de comando, pero como puede ver, es una pantalla con formato elegante que solo tomó una docena de líneas más o menos. Python es una excelente herramienta para la administración.
fuente