将部分日志提取到其他文件

将部分日志提取到其他文件

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

相关内容