Pode haver muitas maneiras de fazer isso, mas em awk
podemos fazer algo como
awk 'gsub(/^[0-9.]+ \[ /,$1 " ") { a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } ; a++ } }'
Vamos dividir isso em algo mais legível:
gsub(/^[0-9.]+ \[ /,$1 " ") { .... }
Isso corresponderá às linhas que começam com números e pontos, seguidas por um espaço e [
. Então, ele corresponderá a 10.20.30.40 [
, mas não corresponderá a junk23
. Ele irá substituí-lo pelo primeiro campo e depois executar o material dentro do {...}
.
Então, uma linha como
198.0.12.20 [ joker penguin character=villian ] blah
entrará nessa seção com a aparência
198.0.12.20 joker penguin character=villian ] blah
Agora, a parte do meio, que pode ser mais fácil de entender, se for escrita em várias linhas:
a=2;
while (a<=NR && $a != "]")
{
if ($a !~ /=/) {print $1 " " $a }
a++;
}
Então começamos no 2º campo ("coringa" nesse caso) e continuamos até que ficamos sem palavras ou vemos o ]
. Para cada palavra que encontramos, se ela não contiver um =
, imprimiremos o primeiro campo (o endereço IP) e a palavra.
Os resultados:
198.0.12.20 joker
198.0.12.20 penguin
198.0.13.20 super_man
198.0.13.20 bat_man
198.0.14.20 lois_lane
(Há provavelmente melhores maneiras de fazer isso!)