Marco Ceppi tiene razón acerca de awk
ser una mejor herramienta para esto, pero awk también es una mejor herramienta que sort
y uniq
desde que esa lógica se puede trasladar awk
. No hace mucha diferencia si solo estás siguiendo 1000 líneas, pero si quieres ver un gran archivo de registro de múltiples conciertos, puede ser mucho más rápido moverlo awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
hará lo que necesite pero es mucho más rápido para archivos grandes. Crea una matriz de IP en awk, utilizando la dirección IP como clave y la cantidad de veces que las IP se producen como valor.
La aceleración se produce porque awk pasa una vez por los datos y hace la mayor parte del trabajo, excepto para ordenar la salida final. Usando el otro método, si tiene 1,000,000 de líneas en el registro de transferencia, awk lee esas 1,000,000 de líneas que escupen 1,000,000 de IPs, luego ordena las 1,000,000 de IPs completas, enviando las 1,000,000 de IP ahora clasificadas a uniq, lo que lo reduce a un tamaño mucho más pequeño cantidad de datos antes de dar eso para ordenar. En lugar de pasar / hacer múltiples pases con 1,000,000 de IP, awk hace casi todo en un solo paso.
Utilizando un registro de apache de 5.513.132 líneas (1.1 gigas) en mi computadora portátil, aquí hay una comparación de velocidad:
- 2m 45s
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0m 40s
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n