grep para contenidos DESPUÉS del patrón en el delimitador

grep para contenidos DESPUÉS del patrón en el delimitador

decir que tengo un archivo

#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ólo quiero saber qué palabras en print $3 aparecen después de "modesc=" hasta el espacio,

Preferiría que la salida de ese comando se viera así:

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

Usando bash, me gustaría imprimir dónde $3 obtiene la palabra después de "modesc=". ¿Hay alguna forma de hacer esto?

Respuesta1

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

Esto se utiliza sedpara reemplazar todo el último campo con el contenido después modesc=del siguiente espacio.


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

Este awkprograma modifica la tercera columna con dos sustituciones. El primero elimina todo hasta , inclusive modesc=, y el segundo elimina todo después del primer espacio restante. El único 1al final hará awkque se imprima el registro modificado (este puede ser reemplazado por { print }).


Asoloobtener la cadena después modesc=de la tercera columna de los datos originales (y nada más), puede usar cualquiera de los comandos anteriores y luego canalizarlo cut -d '|' -f3, o puede usar

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

o

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

Respuesta2

Con awkpuedes usar delimitadores multiplicados y hacerlo bastante muestra:

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

En la línea anterior |, el signo equivalente =y el espacio son delimitadores.

Puede definir el delimitador de salida explícitamente de esta manera:

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

Respuesta3

Usando awk:

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

Respuesta4

Esto será menos eficiente, pero la tarea encaja muy bien con cutypaste

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

información relacionada