Extrai todo o tráfego correspondente a um pedido com um parâmetro

2

Para cada linha de access.log com o padrão /mypattern :

www.example.com:80 192.0.2.17 - - [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5  

Eu gostaria de extrair o parâmetro iptosearch e mostrar todas as linhas de access.log que possuem este IP e que contém blah . Exemplo:

 [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: 
    www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
    www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ...
    www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ...

 [27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: 
    www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
    www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ...

Estou tentando fazer isso com:

grep -f <(grep -o 'mypattern.*iptosearch=(.*)' access.log) access.log |grep blah

mas:

  • provavelmente não será classificado como no meu exemplo anterior: com um cabeçalho e a lista abaixo correspondente à% relevanteiptosearch

  • o cabeçalho do meu exemplo ( [29/Sep/2017:13:49:02 +0200] "GET /test?foo=bar&iptosearch=198.51.100.5: ) não será exibido porque não contém blah

Como fazer isso, para ter a exibição como antes? Deve-se usar um loop em tal caso, como?

    
por Basj 04.10.2017 / 12:04

2 respostas

1

Abordagem estendida bash + grep + awk :

Amostra access.log content:

www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ...
[29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: 
www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ...
www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
[27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: 
www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ...

O trabalho:

grep '/mypattern' access.log | while read -r l; do 
    if [[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]]; then 
        echo "$l"
        awk -v ip="${BASH_REMATCH[1]}" '$0~ip && /blah/;END{ print "" }' access.log
    fi
done

A saída:

[29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5:
www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ...
www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ...

[27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5:
www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ...
www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ...

Detalhes:

  • while read -r l ... - iterando sobre as linhas que contêm /mypattern , retornadas pelo comando grep

  • [[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]] - corresponde cada linha $l à expressão regular iptosearch=(([0-9]+\.){3}[0-9]+) .
    BASH_REMATCH é uma variável de matriz cujos membros são atribuídos pelo operador binário " =~ " ao comando condicional [[ . O elemento com índice 0 é a parte da cadeia que corresponde à expressão regular inteira. O elemento com índice n é a parte da sequência que corresponde à n th subexpressão entre parênteses (...) . Esta variável é somente leitura.

  • -v ip="${BASH_REMATCH[1]}" - passando a variável ip para o script awk

  • $0~ip && /blah/ - imprima apenas linhas que contenham o valor atual ip e a palavra-chave blah

por 04.10.2017 / 13:07
-1
awk '/blah/ && $2 == "198.51.100.5" { print }' access.log

Procure por todas as linhas com o texto blah dentro. Se o segundo espaço delimitado for também "198.51.100.5", imprima a linha.

    
por 04.10.2017 / 12:37