1) 텍스트 데이터가 많고 그 사이에 일부 XML 데이터를 게시하는 process.log 파일이 있습니다.
2) 수천 개의 다양한 XML 및 기타 텍스트 데이터가 로그에 게시됩니다.
3) 이제 나중에 게시할 XML 파일을 선택하기만 하면 됩니다.발신 XML:값
4) 또한 선택하여 새 파일에 복사해야 하는 XML 파일은 다음과 같아야 합니다.ALERTID 태그의 값과 일치하는 것.
5) ALERTID 값은 스크립트 입력에 제공됩니다. 따라서 우리의 경우 mGMjhgHgffHhhFdH1u4
입력에서 이 경고에 대해 게시된 전체 XML 파일을 선택해야 합니다. 시작 태그는 from <xml version..>
이고 종료 태그는 </Alert>
5) 따라서 다른 환경에서 재생할 수 있도록 특정 ALERTID를 기반으로 새 파일에서 관련 나가는 XML 파일을 선택해야 합니다.
로그 파일의 형식은 다음과 같습니다.
Info Jan 11 17:30:26.12122 The process is not responding to heartbeats
Debug Jan 11 17:30:26.12123 Incoming XML :<xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderReject</Alerttype>
<AlertID>ghghfsjUtYuu78T1</AlertID>
<Order>uusingas</Order>
<Quantity>1254</Quanity>
</Alert> (CreateInitEventHandler. C:356)
Debug Jan 11 17:30:26.12199 The process is going down with warnings
Debug Jan 11 17:30:26.148199 Outgoing XML: <xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderheld</Alerttype>
<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>
<Order>uwiofhdf</Order>
<Quantity>7651</Quanity>
</Alert>(CreateEventHandler. C:723)
Debug Jan 11 17:30:26.13214 The process has restarted and thread opened
Debug Jan 11 17:30:26.13215 The heartbeat is recieved from alertlistener process
이제 요구 사항은 입력에서 AlertID를 가져오고, 프로세스 로그를 스캔하고, 일치하는 나가는 XML을 별도의 파일로 추출하는 것입니다.
awk를 사용하면 나가는 모든 XML 파일을 추출할 수 있지만 특정 AlertID와 관련된 파일을 추출하는 방법을 잘 모르겠습니다.
또한 회사 정책으로 인해 새로운 XML 파서를 설치/사용할 수 없습니다. 이를 위해서는 shell/perl/awk/sed를 사용해야 합니다.
예를 들어:
awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
답변1
귀하의 ID가 다음과 같은 변수에 제공되었다고 가정합니다 ALERTID
.
sed -e '/Outgoing XML/!d;:a' -e '$d;N;s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta' -e "/$ALERTID/!d" yourfile.log
설명하다:
/Outgoing XML/!d;:a
행 까지 내용을 삭제Outgoing XML
하고 루프를 시작한 다음$d
파일 끝에서 완료되지 않은 레코드 삭제N;s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
</Alert>
마커를 찾을 때까지 줄을 추가 하고 필수 블록"/$ALERTID/!d $ALERTID`
deletes blocks without the
앞뒤의 모든 내용을 제거합니다.
아마도 읽는 것이 더 나을 것입니다:
sed '/Outgoing XML/!d;:a
$d;N
s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
/'$ALERTID'/!d' yourfile.log
답변2
다음 내용으로 쉘 스크립트 getalert.sh를 작성하십시오.
awk '
/^Debug .* Outgoing XML/{
sub(/^.* Outgoing XML: /,"")
H=$0
LC=0
next
}
/<\/Alert>/ {
sub(/Alert>.*$/,"Alert>")
if (LC>0) {print}
LC=0
next
}
/<AlertID>'$1'<\/AlertID>/{
print H
print
LC=1
next
}
/<AlertID>.*<\/AlertID>/{
H=""
LC=0
next
}
{ if (LC > 0) {
print
} else {
H = H $0
}
}' $2
다음과 같이 실행
getalert.sh mGMjhgHgffHhhFdH1u4 process.log