我想知道是否有什么办法可以实现这一点。 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>
答案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" \;