grep para conteúdo AFTER padrão no delimitador

grep para conteúdo AFTER padrão no delimitador

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ó quero saber quais palavras impressas $3 aparecem depois de "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, gostaria apenas de imprimir onde $3 obtém a palavra depois de "modesc =". Existe uma maneira de fazer isso?

Responder1

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

Isso serve sedpara substituir todo o último campo pelo conteúdo depois modesc=do próximo espaço.


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

Este awkprograma modifica a terceira coluna com duas substituições. O primeiro remove tudo até e inclusive modesc=, e o segundo remove tudo após o primeiro espaço restante. O solitário 1no final fará com que awko registro modificado seja impresso (isso pode ser substituído por { print }).


Paraapenasobter a string após modesc=a terceira coluna dos dados originais (e nada mais), você pode usar qualquer um dos comandos acima e canalizá-la cut -d '|' -f3, ou pode usar

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

ou

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file

Responder2

Com awkvocê pode usar delimitadores de multiplicação e fazer isso de forma bastante amostra:

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

No line pipe acima |, o sinal de equiv . =e o espaço são delimitadores.

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

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

Responder3

Usando awk:

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

Responder4

Isto será menos eficiente, mas a tarefa se adapta perfeitamente cutepaste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')

informação relacionada