Grep

XML節點之間的Grep輸出“主節點集中的模式”

  • October 19, 2016

我想知道是否有任何方法可以做到這一點。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 我想要的,是要列印的整個節點集。但是節點可以有不同的行數(它不是固定的)一個可能有 5 另一個可能有 20 所以我不能使用類似的東西: Grep -HrnA10 -B10 “9999999” 因為這最終會列印其他節點集並進行查看數據混亂。

我有數千個 XML 文件,所以我首先使用 find 查詢文件,只提取前 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>

如果您不介意使用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" \;

引用自:https://unix.stackexchange.com/questions/317406