Awk

將部分日誌提取到其他文件

  • January 15, 2018
  1. 我們有一個 process.log 文件,其中有很多文本數據,在這之間我們發布了一些 XML 數據。

  2. 日誌中發布了數千個不同的 XML 以及其他文本數據。

3)現在我只需要選擇在**傳出 XML 之後發布的 XML 文件:**值

4)此外,必須選擇並複製到新文件的 XML 文件應該是與 ALERTID 標記中的值匹配的文件。

  1. ALERTID 值將在腳本輸入中提供。所以在我們的例子mGMjhgHgffHhhFdH1u4中將在輸入中提供,我們需要選擇為此 alertid 發布的完整 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

假設您的 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/!ddeletes blocks without the`$ALERTID``

`Maybe better to read:

sed '/Outgoing XML/!d;:a
    $d;N
    s/.*\(<xml version.*<\/Alert>\).*/\1/;Ta
    /'$ALERTID'/!d' yourfile.log

引用自:https://unix.stackexchange.com/questions/417277