regex - 从日志文件中提取特定的 XML

标签 regex linux awk sed xmlstarlet

我有很大的日志文件(每个大约 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 格式如图所示,这应该可以...

$ 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

虽然会有一个额外的换行符。

关于regex - 从日志文件中提取特定的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52669345/

相关文章:

linux - 交叉编译 NTFS-3G

linux - 使用 awk 计算文件中特定列的出现次数

linux - AWK - END 语句中的 3 for 循环不是期望的结果

javascript - 查找文本中的日期

javascript - 正则表达式以防止输入中的重音字母

python - 从列表生成 wxPython 小部件组

c - scsi 错误代码和字符串转换

linux - 从 csv 文件中删除非 ascii 特殊字符

c# - 使用正则表达式转换数据值

regex - 从 VB.Net 中的字符串获取协议(protocol)和域