XMLノード間のGrepは「マスターノードセットのパターン」を出力する。

XMLノード間のGrepは「マスターノードセットのパターン」を出力する。

これを達成する方法があるかどうか疑問に思います。 XML形式:

<Main>
<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>854789</Node3>
<Node4>999999</Node4>
</Master>
<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>123456</Node3>
<Node4>999999</Node4>
<Node5>qwerty</Node5>
<Node6>123456</Node6>
<Node7>999999</Node7>
</Master>
<Master>
</Master>
<Master>
</Main>

Grepを使用して999999を検索する場合、私が望むのは、からまでのノードセット全体を印刷することです。ただし、ノードの行数が異なる場合があります(固定されていません)。 1 つは 5 個、もう 1 つは 20 個を持つことができるため、次のようなものは使用できません。 Grep -HrnA10 -B10 "9999999" これは別のノードセットが印刷されるためです。そして、ビューデータがめちゃくちゃです。

何千ものXMLファイルがあるため、まずファイル検索を使用してファイルを照会し、最初の30日間のファイルのみを抽出します。

例:

find . -name "*.xml" -type f -mtime -30 -exec grep --colour=always -HrnA13 -B20 -E 'Pattern' {} \;

出力はい、「854789」を検索すると、次の出力が表示されると予想されます。

<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>854789</Node3>
<Node4>999999</Node4>
</Master>

ベストアンサー1

使用しても問題ない場合は、以下を使用してくださいawk

find -name '*.xml' -type f -exec awk 'BEGIN{RS="</Master>"}/999999/' {} \;

ファイル名も出力するには、次のようにします。

find -name '*.xml' -type f -exec awk 'BEGIN{RS="</Master>"}/999999/' {} \; -exec echo -e {}"\n" \;

おすすめ記事