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.
 
