5GB와 같은 큰 파일이 있습니다 .gz
. 해당 파일에는 이러한 값이 존재할 경우 검색하고 추출하려는 값이 포함된 여러 XML 파일이 있습니다.
NOOSS
예를 들어 파일에서 해당 태그의 이름과 하위 콘텐츠를 포함하는 태그를 추출하고 싶습니다( 예 <pmJobId>
: , <requestedJobState>
, <reportingPeriod>
,<jobPriority>
.gz
<Pm xmlns="urnCmwPm">
<pmId>1</pmId>
<PmJob>
<pmJobId>NOOSSCONTROLExample</pmJobId>
<requestedJobState>ACTIVE</requestedJobState>
<reportingPeriod>FIVE_MIN</reportingPeriod>
<jobType>MEASUREMENTJOB</jobType>
<jobPriority>HIGH</jobPriority>
<granularityPeriod>FIVE_MIN</granularityPeriod>
<jobGroup>Sla</jobGroup>
<reportContentGeneration>CHANGED_ONLY</reportContentGeneration>
<MeasurementReader>
<measurementReaderId>mr_2</measurementReaderId>
<measurementSpecification struct="MeasurementSpecification">
<measurementTypeRef>Anything</measurementTypeRef>
</measurementSpecification>
<thresholdRateOfVariation>PER_SECOND</thresholdRateOfVariation>
</MeasurementReader>
<MeasurementReader>
<measurementReaderId>mr_1</measurementReaderId>
<measurementSpecification struct="MeasurementSpecification">
<measurementTypeRef>ManagedElement=1,SystemFunctions=1,Pm=1,PmGroup=OSProcessingLogicalUnit,MeasurementType=CPULoad.Total</measurementTypeRef>
</measurementSpecification>
<thresholdRateOfVariation>PER_SECOND</thresholdRateOfVariation>
</MeasurementReader>
</PmJob>
</Pm>
사용하고 있지만 cat *gz 1 zgrep -a "PmJobId"
출력에는 <pmJobId>
값만 표시되고 나머지 정보나 레이블은 표시되지 않습니다.
저를 도와주세요. 저는 이것에 아주 익숙하지 않습니다.
CentOS-RedHat Linux를 사용하고 있습니다.
감사해요
답변1
의 XML 문서가 모든 측면에서 잘 구성되어 있고 정확하다고 가정하면 (질문의 예에 잘못된 네임스페이스 선언이 있음) 다음 값을 사용하여 노드에 해당하는 문서 부분을 file.xml
추출할 수 있습니다 . XML 파서 하위 문자열이 포함된 명령줄이 포함되어 있습니다 .PmJob
pmJobID
NOOSS
xmlstarlet
xmlstarlet sel -t -c '//PmJob[contains(pmJobId,"NOOSS")]' -nl file.xml
이 명령은 값에 하위 문자열이 포함된 PmJob
하위 노드가 있는 모든 노드를 선택합니다 . 이 유틸리티는 선택한 노드와 모든 하위 노드의 복사본을 반환합니다 .pmJobId
NOOSS
PmJob
답변2
XML 문서의 형식이 올바르고 유효하다고 가정하면 이 xmllint
유틸리티를 사용하여 필요한 노드를 출력할 수 있습니다.
$ xmllint --xpath '//PmJob[contains(pmJobId,"NOOSS")]' file.xml
<PmJob>
<pmJobId>NOOSSCONTROLExample</pmJobId>
<requestedJobState>ACTIVE</requestedJobState>
<reportingPeriod>FIVE_MIN</reportingPeriod>
<jobType>MEASUREMENTJOB</jobType>
<jobPriority>HIGH</jobPriority>
<granularityPeriod>FIVE_MIN</granularityPeriod>
<jobGroup>Sla</jobGroup>
<reportContentGeneration>CHANGED_ONLY</reportContentGeneration>
<MeasurementReader>
<measurementReaderId>mr_2</measurementReaderId>
<measurementSpecification struct="MeasurementSpecification">
<measurementTypeRef>Anything</measurementTypeRef>
</measurementSpecification>
<thresholdRateOfVariation>PER_SECOND</thresholdRateOfVariation>
</MeasurementReader>
<MeasurementReader>
<measurementReaderId>mr_1</measurementReaderId>
<measurementSpecification struct="MeasurementSpecification">
<measurementTypeRef>ManagedElement=1,SystemFunctions=1,Pm=1,PmGroup=OSProcessingLogicalUnit,MeasurementType=CPULoad.Total</measurementTypeRef>
</measurementSpecification>
<thresholdRateOfVariation>PER_SECOND</thresholdRateOfVariation>
</MeasurementReader>
</PmJob>
$
이 유틸리티는 많은 Linux 배포판에 기본적으로 설치됩니다.