2017-08-09 29 views
1

我想解析一些大型的日誌文件來檢測編碼錯誤的發生。識別缺陷的方法是在不同的行上找到一系列字符串,並在中間加上日期。我在描述事情,所以張貼的例子可怕:解析包含2個字符串和其間的行的日誌文件

<Result xmlns=""> 
    <Failure exceptionClass="processing" exceptionDetail="State_Open::Buffer Failed - none"> 
     <SystemID>ffds[sid=EPS_FFDS, 50] Version:01.00.00</SystemID> 
     <Description>Lo 
ck Server failed </Description> 
    </Failure> 
    </Result> 
</BufferReply> 
7/22/2017 8:41:15 AM | SomeServer | Information | ResponseProcessing.TreatEPSResponse() is going to process a response or event. Response.ServiceID [Server_06] Response.Response [com.schema.fcc.ffds.BufferReply] 

我會通過多種日誌中搜索出該序列的多個實例:Buffer Failed後面是Server_#Server_#可以是任何2位數字,並且永遠不會在同一行上。 Buffer failed在找到Server_#之前將不會重複。 中間的日期和時間,但猜測如果這是可能的,它也會被捕獲。

理想情況下,我覺得應該是這樣的,以另一個文件

 
Buffer Failed - none" 7/22/2017 8:41:15 AM [Server_06] 

我已經嘗試了一些東西像

Select-String 'Failed - none(.*?)Response.Response' -AllMatches 

,但它似乎並沒有跨線工作。

+1

您的日誌文件是XML嗎?我建議'Import-CliXml' – TheIncorrigible1

+2

如果你的文件是一個XML文件,使用XML命令而不是字符串命令。 http://www.tomsitpro.com/articles/powershell-read-xml-files,2-895.html – Manu

+0

它不是一個XML文件,但即使它是我將無法使用任何第三方實用程序因爲文件所在的服務器對信用卡交易具有PCI合規性。我正在搜索的錯誤以XML格式報告到日誌記錄中,但日誌記錄不是XML我想只能將XML數據過濾到另一個文件中,然後嘗試在那裏通過它,如果這是唯一的解決方案,我可以拿出 –

回答

1

Select-String只能匹配跨越多行的文本,如果它接收到輸入爲單個字符串。另外,.通常與任何字符匹配,但換行(\n)除外。如果您希望它與換行符匹配,則必須在修飾符(?s)前面添加正則表達式前綴。否則,您需要一個包含換行符的表達式,例如[\s\S](.|\n)

也可以建議將匹配定位在expressionDetail而不是實際的細節,因爲這會使比賽更加靈活。

像這樣的東西應該給你你正在尋找的結果是:

$re = '(?s)exceptionDetail="(.*?)".*?(\d+/\d+/\d+ \d+:\d+:\d+ [AP]M).*?\[(.*?)\] Response\.Response' 

... | Out-String | 
    Select-String -Pattern $re -AllMatches | 
    Select -Expand Matches | 
    ForEach-Object { '{0} {1} [{2}]' -f $_.Groups[1..3] } 

表達式使用非貪婪的比賽和3個捕獲組抽取異常詳細信息,時間戳和服務器名。

+0

在這裏得到「一個未轉義的分隔符必須用反斜槓(\)」轉義,並且不知道爲什麼(\ d +/\ d +/\ d + \ d +:\ d +:\ d + [AP] M) –

+0

@ NoodlesPokerandSportsMedia regex101.com不喜歡未經轉義的正斜槓。請在實際的PowerShell控制檯中進行測試。 –

相關問題