![¿Cómo puedo separar estas dos salidas usando el comando awk?](https://rvso.com/image/31645/%C2%BFC%C3%B3mo%20puedo%20separar%20estas%20dos%20salidas%20usando%20el%20comando%20awk%3F.png)
Aquí está mi salida:
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
Sólo quiero el tiempo.
¿Cómo puedo separarlos?
Respuesta1
Analizar la estructura de la entrada:
key1=value1;key2=value2
Estos son campos separados por ;
, que puede analizar haciendo ;
el separador de campo. Luego, para extraer el valor de un campo, use la sub
función para eliminar la key=
parte (o split
on /=/
y tome la segunda parte, o tome la subcadena después de index
of =
). Si la hora siempre está en el segundo campo, este es un enfoque simple:
awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'
Si desea acceder al campo por nombre (que probablemente sea más sólido), puede recorrer los campos:
awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'
Si solo tiene una línea para analizar, es más sencillo crear ;
el separador de registros y =
el separador de campos.
awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'
Tenga en cuenta que esto imprime una nueva línea adicional. Esto no es una preocupación si está utilizando este comando en una sustitución de comando en un script de shell (… | awk …)
. Si no desea esta nueva línea adicional, establezca ORS
(separador de registros de salida) en la cadena vacía:
awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'
También existe el enfoque de expresión regular directa, que aquí da buenos resultados.
awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'
Respuesta2
Tienes varias respuestas extrañas, aquí tienes una forma de hacerlo con bash. Primero evalúe la configuración de la variable:
source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")
Ahora puedes acceder EsbTiming
directamente, por ejemplo:
printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}
Producción:
Date: 2013-04-12
Time: 01:07:46.099
Respuesta3
awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file
O
awk '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}' input_file
O
awk -F: '/Timing/{$1=""; print}' input_file
Solución grep
grep -oP '(?<=EsbTiming=.{14}).*' Input_file
Respuesta4
Si no te importa usarlo awk
, sed
aquí tienes una forma bastante sencilla de hacerlo:
sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'
sed
La porción colapsa todo hasta la cadena "Timing=" inclusive, dejándote con:
2013-04-12T01:07:46.099
awk
se divide en el carácter "T" e imprimimos el segundo campo que es su tiempo.
01:07:46.099