
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 sed
para 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 awk
programa 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 1
al final hará awk
que 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 awk
puedes 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 cut
ypaste
paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')