내 질문은 bash 스크립트에서 노드 값을 얻기 위해 XML을 구문 분석하는 것과 관련이 없습니까? 또한 회사 정책으로 인해 새로운 XML 파서를 설치/사용할 수 없습니다. 이를 위해서는 shell/perl/awk/sed를 사용해야 합니다.
내 질문을 다시 표현해 보겠습니다.
1) 텍스트 데이터가 많고 그 사이에 일부 XML 데이터를 게시하는 process.log 파일이 있습니다.
2) 수천 개의 다양한 XML 및 기타 텍스트 데이터가 로그에 게시됩니다.
3) 이제 나중에 게시할 XML 파일을 선택하기만 하면 됩니다.발신 XML:값
4) 또한 선택하여 새 파일에 복사해야 하는 XML 파일은 다음과 같아야 합니다.ALERTID 태그의 값과 일치하는 것.
5) ALERTID 값은 스크립트 입력에 제공됩니다. 그래서 우리의 예에서는mGMjhgHgffHhhFdH1u4입력으로 제공되므로 이 경고에 대해 게시된 전체 XML 파일을 선택해야 합니다. 시작 태그는 from이고 종료 태그는
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와 관련된 파일을 추출하는 방법을 잘 모르겠습니다.
예를 들어:
awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
답변1
한 가지 방법은아니요특히 이 작업에 적합하지만 작동해야 하는 사항은 다음과 같습니다.
- 모든 것이 한 줄에 표시되도록 LF를 제거하십시오.
</Alert>
그러나 모든 XML이 한 줄에 있도록 그 뒤에 LF를 넣으십시오.grep
필수 코드에 대해서는- 라인 출력 및 청소
이는 다음과 같이 번역될 수 있습니다.
tr -d "\r\n" < log_file \
| sed -e 's/\<?xml/\n&/g' -e 's/\<\/Alert>/&\n/g' \
| grep -F '<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>'
결과를 파이프로 xmllint --format -
보기 좋게 인쇄할 수도 있습니다.