¿Cómo puedo separar estas dos salidas usando el comando awk?

¿Cómo puedo separar estas dos salidas usando el comando awk?

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 subfunción para eliminar la key=parte (o spliton /=/y tome la segunda parte, o tome la subcadena después de indexof =). 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 EsbTimingdirectamente, 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, sedaquí tienes una forma bastante sencilla de hacerlo:

sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'

sedLa porción colapsa todo hasta la cadena "Timing=" inclusive, dejándote con:

2013-04-12T01:07:46.099

awkse divide en el carácter "T" e imprimimos el segundo campo que es su tiempo.

01:07:46.099

información relacionada