これは私の結果です。
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
私が望むのは時間だけです。
どのように分離できますか?
答え1
入力構造を分析します。
key1=value1;key2=value2
これはで区切られたフィールドであり;
、;
フィールド区切り文字を設定して解析できます。次に、フィールドの値を抽出するには、関数を使用してその部分sub
を削除しますkey=
(または2番目の部分を引き続き取得するか、次の部分文字列を取得します)。時間が常に2番目のフィールドにある場合、簡単なアプローチは次のとおりです。split
/=/
index
=
awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'
名前でフィールドにアクセスするには(より信頼性が高い)、フィールドを繰り返すことができます。
awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'
;
解析する行が1つしかない場合は、レコード区切り文字とフィールド区切り文字を作成する方が簡単です=
。
awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'
これは追加の改行文字を印刷します。シェルスクリプトでコマンドの置き換えにこのコマンドを使用する場合は、心配する必要はありません(… | 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を使用して実行できる1つの方法があります。まず、変数設定を評価します。
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
以下を使用することが気に入らない場合は、非常に簡単な方法がありますawk
。sed
sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'
sed
文字列 "Timing=" を含むすべてを部分的に縮小し、次を残します。
2013-04-12T01:07:46.099
awk
文字「T」を分割し、時間を表す2番目のフィールドを印刷します。
01:07:46.099