Imprime vários campos com base na correspondência parcial de substring dentro de um dos campos

3

A partir desses dados:

"STRING1","c45621396a774a7a79b095a1b73b1d3b","2016-04-14T19:39:41.529978","1.0.4.4","7-sp1.0-amd64","","10.224.241.219|0.0.0.0|0.0.0.0|192.168.0.6|0.0.0.0"
"STRING2","c5815139f3051de2ab67909b03a01203","2016-04-14T19:37:47.991569","1.0.4.4","7-sp1.0-amd64","","10.230.16.188"
"STRING3","c837513923e2abfe4df41c2240d1c869","2016-04-14T19:40:10.385759","1.0.4.4","7-sp1.0-amd64","","0.0.0.0|0.0.0.0|0.0.0.0|10.226.41.43"
"STRING4","c837544923e2abfe4df41c2240d1c869","2016-04-14T19:40:10.385779","1.0.4.4","7-sp0.0-amd64","","8.8.8.8|0.0.0.0|0.0.0.0|0.0.0.0|10.226.41.43"
"STRING5","c837544003e2abfe4df41c2240d1c869","2016-04-14T19:40:10.382379","1.0.4.4","7-sp0.0-amd64","","0.0.0.0|10.20.40.6|0.0.0.0|10.226.41.43"

Gostaria de manter apenas

  • o primeiro campo (que é uma string com tamanho / comprimento imprevisível) e
  • do sexto campo, somente endereços IP (pode haver um ou mais) começando com 10.

Com base no exemplo abaixo, aqui está a saída desejada:

STRING1 10.224.241.219
STRING2 10.230.16.188
STRING3 10.226.41.43
STRING4 10.226.41.43
STRING5 10.20.40.6 10.226.41.43

Qual é a magia sed / awk que pode conseguir isso? Eu posso usar qualquer utilitário de processamento de texto padrão em um sistema GNU / Linux ou cygwin para conseguir isso.

Obrigado

    
por wmln 04.05.2016 / 14:02

1 resposta

1

Se seus campos nunca contiverem vírgulas, tente:

$ perl -F, -lane '@k=split(/["|]/,$F[6]); 
                  @l=grep{/^10\./}@k; 
                  print "$F[0] @l"' file | 
    sed 's/"//g'
STRING1 10.224.241.219
STRING2 10.230.16.188
STRING3 10.226.41.43
STRING4 10.226.41.43
STRING5 10.20.40.6 10.226.41.43

Explicação

A opção -a do Perl faz com que funcione como awk , ele dividirá seus arquivos de entrada no valor dado por -F e salvará cada campo resultante como um elemento na matriz @F . Assim, o primeiro campo será $F[0] , o segundo $F[1] etc. A opção -l adiciona uma nova linha a cada print e o -n diz perl para ler seu arquivo de entrada linha por linha e aplique o script dado por -e a cada linha.

  • @k=split(/["|]/,$F[6]); : divida o sétimo campo em " ou | e salve-o como a matriz @k . Esses serão os IPs.
  • @l=grep{/^10\./}@k; : salve todos os campos de @k que começam com 10 na matriz @l .
  • print "$F[0] @l" : imprima o primeiro campo e o que estiver em @l .
  • sed 's/"//g' : remova as cotações. Como perl dividirá as linhas de entrada antes de executar qualquer outra coisa, é mais fácil usar outro programa para isso.

Você também pode encurtar o script Perl sem usar variáveis de matriz temporárias:

perl -F, -lane 'print "$F[0] ", join " ", grep{/^10\..*/} split(/["|]/,$F[6])' file
    
por 04.05.2016 / 15:13