説明する

説明する

これはサンプルログ行です。

03 Jun 2017/13:51:32:553 DEBUG connectors.BaseConnector [] [] [] - Request Message is <soapenv:Envelope xmlns:_0="abc" xmlns:_1="abcd" xmlns:soapenv="abcde" xmlns:v1="abcdef"><soapenv:Header><_0:Trace mustUnderstand="false"></_0:Trace><_0:MsgDetl mustUnderstand="false"><_0:MsgUID>20150103135132968917</_0:MsgUID></_0:MsgDetl><_0:ExtendedHeader><CredentialsRqHdr><PartyId>123456789</PartyId><LoginName>Userid</LoginName><PartyAuth><SecTokenKey><SessKey>SessionID</SessKey></SecTokenKey></PartyAuth></CredentialsRqHdr></_0:ExtendedHeader></soapenv:Header><soapenv:Body><v1:actionList><_1:CommonRq><_1:OrgCode>2009</_1:OrgCode></_1:CommonRq><_1:CustId>12345678</_1:CustId><v1:e123><v1:SortOrder>L</v1:SortOrder><v1:SortSeq>D</v1:SortSeq></v1:e123></v1:actionList></soapenv:Body></soapenv:Envelope>

キーワードには、、、が含まれ、そのMsgUID場所は固定されていません。私が望む出力は次のとおりです。LoginNameCustId

03 Jun 2017/13:51:32:553 MsgUID, LoginName, CustId

ベストアンサー1

GNUを使用すると、sed次のことができます。

sed -Ee '
   s/^/\n\n/
   s/\n\n/&\n/;s/[[:blank:]]+/\n/3;s/(.*)\n\n(.*)\n(.*)\n/\1\3\n\n\2/
   s|<_0:MsgUID>|\n|;s|</_0:MsgUID>|\n|;s/(.*)\n\n(.*)\n(.*)\n/\1 \3\n\n\2/
   s|<LoginName>|\n|;s|</LoginName>|\n|;s/(.*)\n\n(.*)\n(.*)\n/\1 \3\n\n\2/
   s|<_1:CustId>|\n|;s|</_1:CustId>|\n|;s/(.*)\n\n(.*)\n(.*)\n/\1 \3\n\n\2/
   s/\n\n.*//
' log.file

説明する

  • \n\n行の先頭にマーカーを配置します。この行で見つかったすべての一致は、このマーカーの左側に表示されます。
  • まず、日付/時刻部分を分離してマーカーの左に移動します。
  • すべての後続のステップでは、同様に目的のラベルを分離し、ラベル値をマーカーの左側に配置します。
  • 完了したら、マーカーの右側にあるすべてのアイテム(マーカーを含む)を削除し、パターンスペースに残っていることが私たちが望むものです。
  • 注:この方法は、必要な数のタグを含むように拡張できます。

結果

03 Jun 2017/13:51:32:553 20150103135132968917 Userid 12345678

別の方法はPerl正規表現を使用することです。

perl -lne '$,=$";
print /^(?:\S+\s+){2}\S+|<(?:_0:MsgUID|LoginName|_1:CustId)>\K(?:.*?)(?=<)/g' log.file

ここOFS $,では に設定します。 Perl正規表現は、リスト内のすべての非検索一致を出力し、OFS値があるため印刷スペースを分離します。$"space/..../g

おすすめ記事