如何使用 awk 指令分離這兩個輸出

如何使用 awk 指令分離這兩個輸出

這是我的輸出:

MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099

我想要的只是時間。

我怎樣才能將它們分開?

答案1

分析輸入的結構:

key1=value1;key2=value2

這些是由 分隔的字段;,您可以透過設定;字段分隔符號來解析它們。然後,要提取欄位的值,請使用該sub函數刪除該key=部分(或spliton/=/並取得第二部分,或取得indexof後面的子字串=)。如果時間始終在第二個欄位中,這是一個簡單的方法:

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

如果您想按名稱存取欄位(這可能更可靠),您可以循環遍歷欄位:

awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'

如果只有一行要解析,則製作;記錄分隔符號和=欄位分隔符號會更簡單。

awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'

請注意,這會列印一個額外的換行符。如果您在 shell 腳本的命令替換中使用此命令,則不必擔心(… | awk …)。如果您不需要這個額外的換行符,請將ORS(輸出記錄分隔符)設為空字串:

awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'

還有直接正則表達式方法,這裡給出了很好的結果。

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

答案2

您有幾個 awk 答案,這是您可以使用 bash 實現的一種方法。首先評估變數設定:

source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")

您現在可以EsbTiming直接訪問,例如:

printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}

輸出:

Date: 2013-04-12
Time: 01:07:46.099

答案3

awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file

或者

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

或者

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

格雷普解決方案

grep -oP '(?<=EsbTiming=.{14}).*' Input_file

答案4

如果你不介意使用awksed這裡有一個非常簡單的方法:

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

sed部分折疊所有內容,直到並包括字串“Timing=”,留下:

2013-04-12T01:07:46.099

awk在字元「T」上分割,我們列印出第二個字段,即您的時間。

01:07:46.099

相關內容