我每天在 UNIX 主机上都有一个日志文件(相当大,>500 MB),其中打印出 XML,并将其发送到其他系统。
XML 结构可能如下:
2021-01-04 08:44:43,174 Not related message
2021-01-04 08:45:45,174 [Sender] INFO com....router.MessageRouter - Publishing Message: <?xml version="1.0" encoding="UTF-8"?>
<Q1:book>
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
<id>6AA2BC</id>
<metadata>
<isbn>123-432-234</isbn>
<catalogId>111</catalogId>
</metadata>
<relatedBook>
<metabook id="3AA345">Everyday Italian. Part 2</metabook>
<metabook id="7ANNN2">Everyday Italian. Part 3</metabook>
</relatedBook>
</Q1:book>
2021-01-04 08:46:23,174 Not related message
2021-01-04 08:46:51,174 Not related message
2021-01-04 08:47:21,174 Not related message
2021-01-04 08:49:45,174 Message: <?xml version="1.0" encoding="UTF-8"?>
<Q1:book>
<title lang="en">Everyday Italian. Part 2</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
<id>3AA345</id>
<metadata>
<isbn>123-432-235</isbn>
<catalogId>115</catalogId>
</metadata>
<relatedBook>
<metabook id="6AA2BC">Everyday Italian. Part 2</metabook>
<metabook id="7ANNN2">Everyday Italian. Part 3</metabook>
</relatedBook>
</Q1:book>
日志中有几十个这样的 XML。
我有所需 xml 的 ID(例如 6AA2BC),我需要使用 Linux 命令提取与其相关的完整 XML。
如果我做类似 grep 6AA2BC file.log
的事情
我将收到唯一的一行 <id>3AA345</id>
我尝试了社区描述的不同方法,并且能够使用获取所有 XML
grep -Poz '(?<=<Q1:book)(.*?\n)*?.*?(?=</Q1:book>)' file.log
但如果我将 id 添加到请求中,则不起作用
预期输出:具有特定 id=6AA2BC 的完整 XML
<Q1:book>
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
<id>6AA2BC</id>
<metadata>
<isbn>123-432-234</isbn>
<catalogId>111</catalogId>
</metadata>
<relatedBook>
<metabook id="3AA345">Everyday Italian. Part 2</metabook>
<metabook id="7ANNN2">Everyday Italian. Part 3</metabook>
</relatedBook>
</Q1:book>
任何人都可以解释一下执行此操作的最佳方法是什么吗?
最佳答案
另一个使用 GNU awk 测试的
awk '/<Q1/{f=1}f{i = i $0 ORS }/<\/Q1/{if(i~/<id>6AA2BC/){printf "%s", i} i=f="" }' file.log
关于regex - 根据标签中的值从日志中提取多行 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65564189/