AWK + pesquisa de host

2

Atualmente, usamos a seguinte linha para obter os 20 principais ips classificados por solicitações:

grep 'GET /' /var/log/nginx/access.log | awk '{ print $1 }' | sort -n | uniq -c | sort -rn | head -20

Saída:

575 66.249.*.*
570 66.249.*.*
534 207.46.*.*
511 157.55.*.*
493 66.249.*.*
435 207.46.*.*
383 66.249.*.*
378 157.55.*.*
368 66.249.*.*
336 66.249.*.*
334 188.165.*.*
332 174.24.*.*
292 54.209.*.*
251 66.249.*.*
241 66.249.*.*
234 66.249.*.*
226 66.249.*.*
225 89.145.*.*
221 89.145.*.*
209 66.249.*.*

Eu gostaria de procurar cada ip usando "host"

É possível fazer isso em uma linha?

Obrigado

    
por Bastien 31.05.2015 / 17:06

2 respostas

0

Você poderia fazer algo assim:

awk '/GET / {print $1}' /var/log/nginx/access.log | sort -n | uniq -c | \ 
sort -rn | head -20 | awk '{print $2}' | while read row; do host $row; done

Eu adicionei um linebreak para torná-lo mais redably aqui.

Eu removi grep porque você pode filtrar com awk diretamente.

Esse trecho de código: awk '{print $2}' | while read row; do host $row; done executará o comando host em cada linha (endereço ip).

EDITAR

Isso manterá a contagem inicial e a ordem:

awk '/GET / {print $1}' /var/log/nginx/access.log | sort -n | uniq -c | \ 
sort -rn | head -20 | while read row; do z=$( echo $row | awk '{print $2}' ); \
echo "$row $(host $z)"; done

Não é exatamente uma solução bonita, mas funciona.

    
por 31.05.2015 / 18:14
2

Observe que, em geral, você deve tentar evitar pesquisas de DNS supérfluas, pois isso pode levar a problemas de capacidade com servidores DNS e pode impedir o armazenamento em cache no cliente (por isso, pode ser muito mais lento também). Use getent hosts para fazer a pesquisa.

Eu tenho um exemplo de AWK na página do meu blog link

Amostra Nice e amigável ao script. Vamos ver como puxar isso no AWK (ou GAWK), com um exemplo simples primeiro. Vamos começar com alguma entrada - talvez linhas com um endereço IP e alguns contam. Também incluí um limite, apenas como um lembrete de que é bom minimizar o número de pesquisas.

$ echo -e '1.1.1.1 2\n8.8.8.8 12\n8.8.4.4 25' \
  | awk '
    BEGIN {threshold = 5}
    $2 > threshold {
      "getent hosts " $1 | getline getent_hosts_str;
      split(getent_hosts_str, getent_hosts_arr, " ");
      print $1, getent_hosts_arr[2], $3
    }'
8.8.8.8 google-public-dns-a.google.com
8.8.4.4 google-public-dns-b.google.com
    
por 01.06.2015 / 05:51

Tags