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 com10
na matriz@l
. -
print "$F[0] @l"
: imprima o primeiro campo e o que estiver em@l
. -
sed 's/"//g'
: remova as cotações. Comoperl
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