Cada linha do log do Apache tem essa aparência:
66.249.75.122 - - [24/May/2013:00:01:17 -0300] "GET /a.html HTTP/1.1" 403 213
Meu objetivo era obter uma lista de IPs organizados por números de acessos. Após lutar com os parâmetros de xargs e grep, descobri que algumas opções do sort e do uniq resolvem o problema.
A solução final foi esta:
cat access_log | cut -d - -f 1 | sort | uniq -c | sort -nr
Os detalhes são estes:- cat imprime o arquivo;
- cut -d - -f 1 corta cada linha em campos separados por "-" e extrai o primeiro deles;
- sort ordena as linhas
- uniq -c elimina as linhas repetidas e adiciona o número de linhas
- sort -nr ordena as linhas numericamente (usando o primeiro número em cada uma) em ordem decrescente.
3149 66.249.75.122
3108 66.249.75.22
2747 66.249.75.143
Para descobrir a quem pertencem esses IPs, posso usar o nslookup adicionando o seguinte:
| sed -n '1,3p'
| cut -d ' ' -f 5 | nslookup
As adições foram estas:- sed -n '1,3p' imprime as 3 primeiras linhas (os 3 IPs com mais ocorrências no log);
- cut -d ' ' -f 5 recorta o IP (porque eles estão acompanhados do número de ocorrências);
- nslookup procura os nomes associados aos IPs.