zgrep 또는 sed를 사용하여 xml 파일에서 여러 탭을 추출하는 방법

zgrep 또는 sed를 사용하여 xml 파일에서 여러 탭을 추출하는 방법

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 파서 하위 문자열이 포함된 명령줄이 포함되어 있습니다 .PmJobpmJobIDNOOSSxmlstarlet

xmlstarlet sel -t -c '//PmJob[contains(pmJobId,"NOOSS")]' -nl file.xml

이 명령은 값에 하위 문자열이 포함된 PmJob하위 노드가 있는 모든 노드를 선택합니다 . 이 유틸리티는 선택한 노드와 모든 하위 노드의 복사본을 반환합니다 .pmJobIdNOOSSPmJob

답변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 배포판에 기본적으로 설치됩니다.

관련 정보