이것은 샘플 로그 줄입니다.
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
해당 위치는 고정되어 있지 않습니다. 내가 원하는 출력은 다음과 같습니다.LoginName
CustId
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 for
MsgUID`로 재사용할 수 있습니다. 성공하지 못하면 질문에 코드를 게시하십시오.