Contar e ordenar a quantidade de ocorrências de cada linha em um arquivo
Dica publicada em Shell Script / Introdução
Contar e ordenar a quantidade de ocorrências de cada linha em um arquivo
Problema
Eu precisava levantar quais eram os IPs que mais estavam acessando meu servidor web e como fonte de dados usei o arquivo access.log do NGinx.Solução
Uma linha de log do NGinx tem o seguinte formato:
201.xx.157.10 - - [24/Sep/2019:12:48:59 -0300] "GET /imagens/banners/udemy-cert.png HTTP/1.1" 200 26546 ".../artigo/Linux-no-Pendrive-Definitivamente-configuravel-e-persistente?pagina=2" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
O dado que eu preciso é o primeiro campo, o IP do usuário. Então vamos criar um segundo arquivo de log com apenas o primeiro campo de cada entrada:
cat access.log | cut -d ' ' -f 1 > ip_log.txt
Foi criado um arquivo chamado ip_log.txt com o seguinte formato:
18.184.94.52
54.83.152.140
52.58.160.43
3.86.142.166
35.158.131.185
46.229.168.145
18.185.28.42
3.120.174.144
3.123.35.240
54.83.152.140
52.58.160.43
3.86.142.166
35.158.131.185
46.229.168.145
18.185.28.42
3.120.174.144
3.123.35.240
Quero fazer o levantamento de quantas vezes cada IP acessou o site neste dia. Para isso vamos usar o comando sort combinado com uniq:
sort ip_log.txt | uniq -c | sort -bnr
A saída será algo como:
9220 23.100.232.233
2671 18.231.162.74
2668 18.229.142.235
2223 18.228.188.56
2178 52.67.166.246
Até a próxima!