regex - 从日志文件中提取特定的 XML
问题描述
我有大型日志文件(每个大约 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
不过会有一个额外的换行符。
推荐阅读
- ios - SwiftUI - 将 post.id 传递给 ViewModel
- flutter - _SplashScreenViewState#32282(ticker active) 被设置为一个活动的 Ticker
- azure - 如何在 Azure Linux Function 中安装字体?
- vuejs2 - 如何在Vuejs中将表单循环三次
- amazon-web-services - 在 Redshift 中构建渐变维度类型 2
- android - 如何在 Android 网络浏览器上通过 agora 使用通话声音而不是媒体声音?
- flutter - setState 不重建小部件
- javascript - 使用 vuejs 和 i18n 的数据库存储语言
- javascript - 我不断从 node js express post 请求正文中获取未定义
- apache-spark - Spark:如何在数据框中单独处理某些列内容?