次の順序で表示される他の行には、次のデータがあります。
trackingID=QsSDsad2yP80Q82G5Y8V2QRWhGQCYy97bX; ***************Some other Data ********************** Trn-status: INCOMPLETE", ***************Some other Data **********************
trackingID=QsSDsad2yP80Q82G5Y8V2QRWhGQCYy97bX; ***************Some other Data **********************
trackingID=QsSDsad2yP80Q82G5Y8V2QRWhGQCYy97bX; ***************Some other Data **********************:{\"details\":[{\"errorCode\":\"MyErrorCode\",\"message\":\"TECHNICAL EXCEPTION\",\"timeStamp\":\"2019-10-03T09:08:56.886Z\"}],***************Some other Data **********************
trackingID=E32878dfgdf45ddf567u5V2QRsdfdsj657V; ***************Some other Data **********************:{\"details\":[{\"errorCode\":\"Test0001\",\"message\":\"Valiadtion EXCEPTION\",\"timeStamp\":\"2019-10-03T09:08:56.886Z\"}],***************Some other Data **********************
この行は後続の行ではなく、これらの行間に異なるデータがある可能性があります。
message
errorCodeプロパティの値を抽出したいと思います。TECHNICAL EXCEPTION
そして Trn-status
INCOMPLETE
Unix/linux コマンドを使用します。 (複数のペアがあっても、一致するすべての行ペアのデータを抽出したいと思います.)
どちらの行も同じトレースIDを持ちます。
私はUnix / Linuxを初めて使用します。コマンドからエラーコードを取得するのに役立ちますか?
ベストアンサー1
以下を使用できますawk
。
常に家庭がTrn-status
優先ですTECHNICAL EXCEPTION
awk -F'[\;\=]' '
{ if ( $0 ~ /Trn-status: INCOMPLETE/ ) checkid[$2]=$2 ;
if ( $2 == checkid[$2] ) {
if ( $0 ~ /TECHNICAL EXCEPTION/ ) print checkid[$2]
}
}' logfile
説明する:
-F'[\;\=]'
;
または、フィールド区切り記号として使用=
:角かっこを使用すると、複数のフィールド区切り文字を定義できます。セミコロンと等号は特殊文字なので、awk
バックスラッシュでエスケープする必要があります。- 最初の行:
$0
全行を表し~
(サブ)パターン一致演算子と/PATTERN/
検索文字列。したがって、Trn-status: INCOMPLETE
行が見つかると、インデックスはID自体の名前である配列にID(別のフィールドで区切られた2番目のフィールド)を格納します(文字列を;
インデックスカウンタとして使用できます)。=
checkid
awk
- 2番目の行:別の行でIDを見つけたら...
- 行3:IDが表示されていることを確認し、表示
TECHNICAL EXCEPTION
されたら印刷してください。 - (
logfile
ファイル名です)