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 comandogrep
-
[[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]]
- corresponde cada linha$l
à expressão regulariptosearch=(([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 índice0
é a parte da cadeia que corresponde à expressão regular inteira. O elemento com índicen
é 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ávelip
para o script awk -
$0~ip && /blah/
- imprima apenas linhas que contenham o valor atualip
e a palavra-chaveblah