awkコマンドを使用してこれら2つの出力を分離する方法

awkコマンドを使用してこれら2つの出力を分離する方法

これは私の結果です。

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}'

おすすめ記事