1) 我们有一个 process.log 文件,其中有大量文本数据,在其间我们发布了一些 XML 数据。
2) 日志中发布了数千个不同的 XML 以及其他文本数据。
3)现在我只需要选择之后发布的XML文件传出 XML:价值
4) 此外,必须选择并复制到新文件的 XML 文件应该是与 ALERTID 标记中的值相匹配的一个。
5) ALERTID 值将在脚本输入中提供。因此,在我们的例子中mGMjhgHgffHhhFdH1u4
,将在输入中提供,我们需要选择为此警报发布的完整 XML 文件。开始标记是 from <xml version..>
,结束标记是</Alert>
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 相关的文件。
另外,根据公司政策,我无法安装/使用任何新的 XML 解析器。这需要使用 shell/perl/awk/sed 来实现
例如:
awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
答案1
假设您的 ID 在名为 的变量中给出ALERTID
:
sed -e '/Outgoing XML/!d;:a' -e '$d;N;s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta' -e "/$ALERTID/!d" yourfile.log
解释:
/Outgoing XML/!d;:a
删除内容直到Outgoing XML
行并开始循环然后$d
删除文件末尾未完成的记录N;s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
追加行直到</Alert>
找到标记并删除所需块“/$ALERTID/!d
deletes blocks without the
$ALERTID`之前和之后的所有内容
也许更好地阅读:
sed '/Outgoing XML/!d;:a
$d;N
s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
/'$ALERTID'/!d' yourfile.log
答案2
创建一个 shell 脚本 getalert.sh,包含以下内容:
awk '
/^Debug .* Outgoing XML/{
sub(/^.* Outgoing XML: /,"")
H=$0
LC=0
next
}
/<\/Alert>/ {
sub(/Alert>.*$/,"Alert>")
if (LC>0) {print}
LC=0
next
}
/<AlertID>'$1'<\/AlertID>/{
print H
print
LC=1
next
}
/<AlertID>.*<\/AlertID>/{
H=""
LC=0
next
}
{ if (LC > 0) {
print
} else {
H = H $0
}
}' $2
运行它作为
getalert.sh mGMjhgHgffHhhFdH1u4 process.log