Encontrar endereços IP visitando / page1 mas não / page2 do arquivo de log de acesso nginx

4

Eu preciso selecionar dados específicos dos arquivos de log. Eu preciso de dois scripts:

  1. Preciso selecionar todos os endereços IP que visitaram apenas /page1
  2. Preciso selecionar todos os endereços IP que visitaram /page1 , mas nunca visitaram /page2

Eu tenho meus logs desejados em um arquivo .tar . Quero que eles sejam extraídos em uma pasta e, depois, usarei o script para analisá-los e excluí-los. TODOS os endereços IP duplicados.

Isso é o que eu tenho até agora:

# filter /page1 visitors
cat access.log | grep "/page1" > /tmp/res.txt
# take the IP portion of record
cat res.txt | grep '^[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*' -o > result.txt

O registro de acesso típico é semelhante a

162.158.86.83 - - [22/May/2016:06:31:18 -0400] "GET /page1?vtid=nb3 HTTP/1.1" 301 128 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
    
por Delirium 26.05.2016 / 15:05

2 respostas

2
awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

Se você quiser uma contagem de cada IP exclusivo, altere sort -u para sort | uniq -c

Se você quiser corresponder apenas o campo do caminho de solicitação do log (em vez da linha inteira) em relação a /page1 :

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

Nota: Acho que os logs de acesso do nginx são os mesmos que os logs de acesso do apache. Caso contrário, conte os campos (contenha todos os espaços, incluindo aquele entre a Data: Hora e o Fuso Horário) no log do nginx, e use o número do campo correto em vez de $7

Por fim, se você quiser imprimir o endereço IP (ou o nome do host, se já tiverem sido resolvidos) e o caminho da solicitação:

awk -v OFS='\t' '$7 ~ /^\/page1?/ {print $1, $7}' /path/to/access.log |
    sort -u > result.txt

Para ver os endereços IP que visitaram /page1 , mas nunca visitaram /page2 :

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result1.txt
awk '$7 ~ /^\/page2?/ {print $1}' /path/to/access.log | sort -u > result2.txt
comm -2 -3 result1.txt result2.txt
A opção comm do -2 suprime as linhas que aparecem apenas em result2.txt e -3 suprime as linhas que aparecem nos dois arquivos. a saída é, portanto, linhas que aparecem apenas em results1.txt .

veja man comm para mais detalhes.

    
por 26.05.2016 / 15:27
0
  • Crie uma lista classificada de IPs que visitaram a página1
  • Crie uma lista classificada de IPs que visitaram a página2
  • Use "diff" nas duas listas para encontrar aqueles que visitaram uma página sem visitar a outra (o símbolo '>' ou '<' no início da lista distingue os da Página1 daqueles da Página2)
por 26.05.2016 / 17:00