Marco Ceppi está certo em awk
ser uma ferramenta melhor para isso, mas o awk também é uma ferramenta melhor do que sort
e uniq
uma vez que essa lógica pode ser movida para awk
. Não faz muita diferença se você está apenas seguindo 1000 linhas, mas se você quiser olhar para um enorme arquivo de log de vários gig, pode ser uma ordem de magnitude mais rápida para mudar isso awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
fará o que você precisa, mas é muito mais rápido para arquivos grandes. Ele cria uma matriz de IPs no awk, usando o endereço IP como chave e o número de vezes que os IPs ocorrem como valor.
A velocidade ocorre porque o awk repassa os dados e faz a maior parte do trabalho, exceto para classificar a saída final. Usando o outro método, se você tiver 1.000.000 de linhas no log de transferência, o awk lê essas 1.000.000 de linhas cuspindo 1.000.000 de IPs e, em seguida, a classificação percorre os 1.000.000 de IPs inteiros, enviando os 1.000.000 de IP agora classificados para o uniq, reduzindo-o para um tamanho muito menor quantidade de dados antes de fornecer a classificação. Em vez de usar várias passagens em 1.000.000 IPs, o awk faz quase tudo de uma só vez.
Usando um log apache de 5.513.132 linhas (1,1 GB) no meu laptop, aqui está uma comparação de velocidade:
- 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