我的问题与解析 XML 以获取 bash 脚本中的节点值无关?另外,根据公司政策,我无法安装/使用任何新的 XML 解析器。这需要使用 shell/perl/awk/sed 来实现
我将尝试重新表述我的问题:
1) 我们有一个 process.log 文件,其中有大量文本数据,在其间我们发布了一些 XML 数据。
2) 日志中发布了数千个不同的 XML 以及其他文本数据。
3)现在我只需要选择之后发布的XML文件传出 XML:值
4) 此外,必须选择并复制到新文件的 XML 文件应该是与 ALERTID 标记中的值相匹配的一个。
5) ALERTID 值将在脚本输入中提供。所以在我们的例子中mGMjhgHgffHhhFdH1u4将在输入中提供,我们需要选择为此警报发布的完整 XML 文件。开始标记是 from,结束标记是
5) 因此,我需要根据特定的 ALERTID 在新文件中选择相关的传出 XML 文件,以便可以在不同的环境中重播。
日志格式:
Info Jan 11 17:30:26.12122 The process is not responding to heartbeats
Debug Jan 11 17:30:26.12123 Incoming XML :<xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderReject</Alerttype>
<AlertID>ghghfsjUtYuu78T1</AlertID>
<Order>uusingas</Order>
<Quantity>1254</Quanity>
</Alert> (CreateInitEventHandler. C:356)
Debug Jan 11 17:30:26.12199 The process is going down with warnings
Debug Jan 11 17:30:26.148199 Outgoing XML: <xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderheld</Alerttype>
<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>
<Order>uwiofhdf</Order>
<Quantity>7651</Quanity>
</Alert>(CreateEventHandler. C:723)
Debug Jan 11 17:30:26.13214 The process has restarted and thread opened
Debug Jan 11 17:30:26.13215 The heartbeat is recieved from alertlistener process
现在的要求是在输入中获取 AlertID,扫描进程日志并在单独的文件中提取匹配的传出 XML。
使用 awk,我能够提取所有传出的 xml 文件,但不确定如何提取与特定 AlertID 相关的文件。
例如:
awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
答案1
一种方法是不是特别适合这项任务,但应该有效的是:
- 删除 LF,以便所有内容都显示在一行上
- 但在后面放置一个 LF
</Alert>
,以便所有 XML 都在自己的一行中 grep
对于所需的代码- 输出该行并清理它
这可以翻译为:
tr -d "\r\n" < log_file \
| sed -e 's/\<?xml/\n&/g' -e 's/\<\/Alert>/&\n/g' \
| grep -F '<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>'
您甚至可以通过管道将结果进行xmllint --format -
漂亮的打印。