Então, eu invadi isso juntos enquanto passava por um ataque DDoS para puxar safado IPs fora dos meus logs. Alguém tem alguma melhoria ou outras sugestões para melhorar?
Aqui está a ideia geral:
E a corda O'Pipes:
[.____] cut --delim " " -f7 /var/log/Apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
Eu sempre usei isso:
tail -1000 /var/log/Apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
Com tail
Eu sou capaz de definir o limite de quão longe eu realmente quero ir - bom se você não usar log girar (por qualquer motivo), segundo eu estou fazendo uso de awk
- Como a maioria dos logs é o espaço delimitado pela qual me deixei com a capacidade de extrair informações adicionais (possivelmente quais URLs estavam batendo, status, navegadores, etc) adicionando o $
variável. Por fim, uma falha em uniq
só funciona em pares tocantes - ou seja:
A
A
A
A
B
A
A
Vai produzir:
4 A
1 B
2 A
Não a saída desejada. Portanto, classificamos a primeira coluna (neste caso, o IPS, mas poderíamos classificar outras colunas) então uniq
eles, finalmente classificar a contagem ascendente para que eu possa ver os mais altos infratores.
Marco Ceppi está certo sobre awk
ser uma ferramenta melhor para isso, mas awk também é uma ferramenta melhor do que sort
e uniq
desde que essa lógica pode ser movida para awk
. Não faz muita diferença se você está apenas rejeito de 1000 linhas, mas se você quiser olhar para um enorme arquivo de log multi gig, ele pode ser ordens de magnitude mais rápido para mover isso em 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 uma chave e o número de vezes que o IPS ocorre como o valor.
A velocidade vem porque a AWK passa por cima dos 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 linhas no log de transferência, a AWK lê essas 1.000.000 linhas cuspindo 1.000.000 IPs, então classificar passa por todos os 1.000.000 IPs, enviando os 1.000.000 IPs agora classificados para UNIQ, o que reduz a um pouco menor quantidade de dados antes de dar isso para classificar. Em vez de aceitar/fazer vários passes em 1.000.000 IPs, a AWK faz quase tudo em uma passagem.
Usando um log de 5,513,132 linhas do Apache (1.1 Gigs) no meu laptop, aqui está uma comparação de velocidade:
cat ./Apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
cat ./Apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n