Aqui está minha saída:
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
Eu quero apenas o tempo.
Como posso separá-los?
Responder1
Analise a estrutura da entrada:
key1=value1;key2=value2
Esses são campos separados por ;
, que você pode analisar criando ;
o separador de campos. Então, para extrair o valor de um campo, use a sub
função para remover a key=
parte (ou split
on /=/
e pegue a segunda parte, ou pegue a substring após index
of =
). Se a hora estiver sempre no segundo campo, esta é uma abordagem simples:
awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'
Se quiser acessar o campo pelo nome (o que provavelmente é mais robusto), você pode percorrer os campos:
awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'
Se você tiver apenas uma linha para analisar, é mais simples fazer ;
o separador de registros e =
o separador de campos.
awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'
Observe que isso imprime uma nova linha extra. Isso não é uma preocupação se você estiver usando este comando em uma substituição de comando em um script de shell (… | awk …)
. Se você não quiser essa nova linha extra, defina ORS
(separador de registro de saída) como a string vazia:
awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'
Há também a abordagem direta de expressão regular, que aqui dá bons resultados.
awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'
Responder2
Você tem várias respostas do awk. Aqui está uma maneira de fazer isso com o bash. Primeiro avalie a configuração da variável:
source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")
Agora você pode acessar EsbTiming
diretamente, por exemplo:
printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}
Saída:
Date: 2013-04-12
Time: 01:07:46.099
Responder3
awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file
OU
awk '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}' input_file
OU
awk -F: '/Timing/{$1=""; print}' input_file
Solução Grep
grep -oP '(?<=EsbTiming=.{14}).*' Input_file
Responder4
Se você não se importa em usar awk
, sed
aqui está uma maneira bastante simples de fazer isso:
sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'
sed
parte recolhe tudo, incluindo a string "Timing=", deixando você com:
2013-04-12T01:07:46.099
awk
divide-se no caractere “T” e imprimimos o 2º campo que é o seu tempo.
01:07:46.099