Como posso separar essas duas saídas usando o comando awk?

2

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?

    
por user38425 03.05.2013 / 04:00

6 respostas

3

Analise a estrutura da entrada:

key1=value1;key2=value2

Estes são campos separados por ; , que você pode analisar fazendo ; o separador de campos. Em seguida, para extrair o valor de um campo, use a função sub para remover a key= part (ou split on /=/ e obter a segunda parte ou obter a subsequência após index de = ). Se a hora estiver sempre no segundo campo, essa é uma abordagem simples:

awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'

Se você quiser acessar o campo pelo nome (que provavelmente é mais robusto), poderá fazer um loop pelos 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 tornar ; o separador de registro e = o separador de campo.

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 de expressão regular direta, que fornece bons resultados.

awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'
    
por 04.05.2013 / 16:28
2

Você tem várias respostas 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")

Você agora pode acessar o 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
    
por 04.05.2013 / 13:52
1
awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file

OR

awk  '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}'  input_file

OR

awk -F: '/Timing/{$1=""; print}'  input_file

Solução Grep

grep -oP '(?<=EsbTiming=.{14}).*' Input_file
    
por 03.05.2013 / 04:10
1

Simples, dividido por "T"

awk -F 'T' {'print $3'} input_file
    
por 03.05.2013 / 09:53
0

Se você não se importa em usar awk e sed , aqui está uma maneira bastante simples de fazer isso:

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

sed parcela recolhe tudo até e inclui a string "Timing=" deixando você com:

2013-04-12T01:07:46.099

awk divide o caractere "T" e imprimimos o segundo campo que é o seu tempo.

01:07:46.099
    
por 03.05.2013 / 05:00
0

Uma solução grep:

grep -oP "(?<=EsbTiming=).*" input

-o para imprimir apenas a correspondência, não linha inteira

-P para usar o regex Perl, para que possamos usar ...

(?<=lookahead_expr) retornará uma correspondência para o regex seguinte é "lookbehind positivo" - no nosso caso, retornando a string de tempo que segue a string 'EsbTiming ='

    
por 03.05.2013 / 04:56