如何使用 Unix shell 脚本从日志中提取 XML 数据?

如何使用 Unix shell 脚本从日志中提取 XML 数据?

我的问题与解析 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 -漂亮的打印。

相关内容