
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 sed
para 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 awk
programa 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 1
no final fará com que awk
o 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 awk
você 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 cut
epaste
paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')