설명하다

설명하다

이것은 샘플 로그 줄입니다.

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

답변2

나는 sed그것을 사용할 것입니다 :

sed 's/\(.*:[0-9]* \).*<_0:MsgUID>\([^<]*\).*/\1, \2/'

타임스탬프와 MsgUID에 사용됩니다. LoginName 및 CustId를 포함하도록 쉽게 확장할 수도 있습니다. 이러한 부분을 일치시키는 정규식을 구성하고 유지하려는 부분을 묶습니다 \(\). 대체 문자열에서 이러한 부분을 \1' for the first,\2 for the second and so on. Try to solve it by understanding the expession forMsgUID`로 재사용할 수 있습니다. 성공하지 못하면 질문에 코드를 게시하십시오.

관련 정보