grep para conteúdo APÓS padrão no delimitador

2

diga que tenho um arquivo

#cat file.log
abc|123|text1 modesc=bpp123 raw_info=clear
abc|123|text2 modesc=pmk123 severity=minor
abc|123|text3 modesc=pnj123 info=good

só quer saber que palavras impressas 3 aparecem após "modesc=" até o espaço,

Eu preferiria que a saída desse comando fosse assim:

abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Usando o bash, eu gostaria apenas de imprimir onde $ 3 apenas obtêm a palavra depois de "modesc=". Existe uma maneira de fazer isso?

    
por Anggoro Setiawan 04.06.2018 / 09:39

4 respostas

1
$ sed 's/[^|]*modesc=\([^ ]*\).*$//' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Isso usa sed para substituir todo o último campo pelo conteúdo depois de modesc= até o próximo espaço.

$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Este programa awk modifica a terceira coluna com duas substituições. O primeiro remove tudo até e incluindo modesc= e o segundo remove tudo após o primeiro espaço restante. O único 1 no final fará com que awk imprima o registro modificado (isso pode ser substituído por { print } ).

Para somente obter a string após modesc= da terceira coluna dos dados originais (e nada mais), você pode usar qualquer um dos comandos acima e então canalizar isso através de cut -d '|' -f3 , ou você pode usar

sed 's/.*modesc=\([^ ]*\).*$//' file

ou

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file
    
por 04.06.2018 / 10:27
1

Com awk , você pode usar vários delimitadores e fazer isso com uma amostra:

awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log

No canal de linha acima, | , sinal de igualdade = e espaço são delimitadores.

Você pode definir delimitador de saída explicitamente assim:

awk -F'[|= ]' 'BEGIN { OFS="|"}  {print $1,$2,$5}' /tmp/file.log
    
por 04.06.2018 / 10:27
0

Usando awk :

awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\1","g",$3)}' /tmp/file.log
    
por 04.06.2018 / 09:46
0

Isso será menos eficiente, mas a tarefa se encaixa muito bem com cut e paste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')
    
por 04.06.2018 / 13:09