regex - 根据标签中的值从日志中提取多行 XML

标签 regex linux xml awk grep

我每天在 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/

相关文章:

mysql - 从 MySQL 中的文本字段中选择仅数字模式

javascript - 如何在 JavaScript 正则表达式匹配中查找组索引?

regex - 多行 C# 正则表达式在空行后匹配

java - 测试 Spring 配置错误需要什么 XML 文件?

C#。匹配任何字符串的最快正则表达式

linux - 在编译时启用 AVX512 支持会显着降低性能

python - 安装了多个 pip : what can I remove?

python - 在 linux 机器上检测 python 3 中按键的最简单方法是什么?

javascript - jQuery .append() 没有换行符

xml - 在 XML 中添加多个元素