Unix / Linuxコマンドは、他の行に単語が含まれている場合は単語をキャプチャします(2行に共通の属性があります)。

Unix / Linuxコマンドは、他の行に単語が含まれている場合は単語をキャプチャします(2行に共通の属性があります)。

次の順序で表示される他の行には、次のデータがあります。

 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 **********************

この行は後続の行ではなく、これらの行間に異なるデータがある可能性があります。

messageerrorCodeプロパティの値を抽出したいと思います。TECHNICAL EXCEPTION そして Trn-statusINCOMPLETEUnix/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番目のフィールド)を格納します(文字列を;インデックスカウンタとして使用できます)。=checkidawk
  • 2番目の行:別の行でIDを見つけたら...
  • 行3:IDが表示されていることを確認し、表示TECHNICAL EXCEPTIONされたら印刷してください。
  • logfileファイル名です)

おすすめ記事