2013-01-22 73 views
0

我有一個日誌,我正在尋找一個特定的字符串(「超時期」)。我可以使用下面的拿起這種情況在我的日誌:Powershell選擇字符串匹配

Get-Content mylog.txt | select-string 'the timeout period' | select-object 

說我有是,這是一個XML文件的PowerShell是唯一的選擇了錯誤的行,而我的問題真的需要數據/時間信息。我需要的是在匹配「超時期限」的行實例之前匹配「線程」的行實例。例如:

Thread 3423 - 6:34:00 
Info following. ..... .... 
Error .... the timeout period 

所以我想輸出是:

Thread 3423 - 6:34:00 
+0

它可以做到這一點,但你是說它實際上是一個XML文件?我們可以得到一個樣本嗎?如果數據在xml中的不同元素中分離,則更容易。 –

+0

我意識到它實際上並不是XML,它只是以這種方式進行格式化,使得很難過濾行,因爲它們一起運行。 –

+0

查看我提供的答案。應該工作;) –

回答

1

我猜信息部分可以是多行。所以這是我的嘗試:

$content = Get-Content .\test.txt 
$content | select-string "the timeout period" | % { 
    $i = ($_.linenumber -1) 

    while ($content[$i] -notlike "Thread*") { 
     $i-- 
    } 

    $content[$i] 
} 

它顯示上一行以每個錯誤的「Thread」開頭。防爆。輸出:

Thread 3423 - 1:34:00 
Thread 3423 - 2:34:00 
Thread 3423 - 3:34:00 
Thread 3423 - 4:34:00 
+0

這個人創建了一些重複的條目。我用get-unique來清理它們。謝謝! –

1

如果該文件是XML我會考慮使用選擇的XML和一個XPath搜索模式。也就是說,你可以使用Select-String像這樣:

Get-Content mylog.txt | select-string "the timeout period" -context 2 | 
    Foreach {$_.Context.PreContext[0]} 
+0

這很接近,但有一些例子,上下文沒有達到「線程」行。爲了獲得所有的線程信息,我必須將其推回到-Context 5.這可以工作,但不是很準確,因爲我也獲得了額外的一行。 –