Como analisar um arquivo de dados para extrair dados específicos e formatar para outro uso?

1

Dado um arquivo de dados que contém vários conteúdos, eu gostaria de primeiro ignorar qualquer linha que não comece com um endereço IP, em seguida, imprima o endereço IP seguido por qualquer string encontrada nas chaves que não contenham = placa. Qualquer linha dada pode ter uma ou várias strings.

Por exemplo:

ENTRADA:

junk12  
junk34  
198.0.12.20 [ joker penguin character=villian ] blah  
198.0.13.20 [ super_man bat_man character=hero ] blah  
198.0.14.20 [ lois_lane character=damsel ] blah  
junk56  
junk78  

OUTPUT:

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  
    
por Bernie 17.08.2016 / 18:31

1 resposta

2

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!)

    
por 17.08.2016 / 19:03