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ディストリビューションにデフォルトでインストールされます。

関連情報