これを達成する方法があるかどうか疑問に思います。 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" \;