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 我想要的,是要列印的整個節點集。但是節點可以有不同的行數(它不是固定的)一個可能有 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" \;