【问题标题】:Extract specific XMLs from log file从日志文件中提取特定的 XML
【发布时间】:2018-10-05 15:52:12
【问题描述】:

我有很大的日志文件(每个大约 50mb),其中包含 java 调试信息以及各种 XML 响应

这是我尝试从日志中提取的内容的示例

<envelope>
    <response>
        <ATTR name="uniqueid" value="XYZ_00000-00-00_12345_1"/>
        <ATTR name="status" value="Activated"/>
        <ATTR name="datecreated" value="2018/10/04 09:39:05"/>
    </response>
</envelope>

我只需要 uniqueid 属性包含“12345”且状态属性设置为“已激活”的 XML

通过使用“sed”,我能够提取所有信封,目前我正在使用正则表达式检查其中是否存在上述条件(通过在循环中运行所有这些条件)。

sed -n '/<envelope>/,/<\/envelope>/p' logfile

从文件中提取我需要的内容的正确解决方案是什么?

谢谢!

【问题讨论】:

  • 生成该 XML 的人显然不知道如何最好地使用 XML。
  • 您应该使用 XML 解析器来解析 XML 数据。此日志文件中还有什么?显示更多。
  • @glennjackman 大部分不是 XML,而是各种 java 日志(调试/信息/错误)。
  • 有人将属性重新发明为标签,但仍需要名称/值属性?
  • 我们可以专注于手头的问题吗?我没有生成那些 XML,所以我无法回答其结构的质量

标签: regex linux awk sed xmlstarlet


【解决方案1】:

假设您的 xml 格式如图所示,这应该可以工作...

$ awk '/<envelope>/ {line=$0; p=0; next} 
             line   {line=line ORS $0} 
    /uniqueid/ && $3~/12345/ {p=1}
   /<\/envelope>/ && p {print line}' file

使用开始标签,开始累积行,如果找到所需的行设置标志,如果设置标志,则使用结束标签打印记录。

gawk 你可以这样做

$ awk -F'\n' -v RS='</envelope>\n'    \
    '$3~/uniqueid.*12345/ && $4~/status.*Activated/{print $0, RT}' file

不过会有一个额外的换行符。

【讨论】:

  • 谢谢!这很好用!您能否在此模式中也包含“状态”属性作为“已激活”?
  • 状态已激活
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 2021-10-12
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2011-02-19
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多