Powershell选择字符串匹配

问题描述:

我有一个日志,我正在寻找一个特定的字符串(“超时期”)。我可以使用下面的拿起这种情况在我的日志: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

查看我提供的答案。应该工作;) –

我猜信息部分可以是多行。所以这是我的尝试:

$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来清理它们。谢谢! –

如果该文件是XML我会考虑使用选择的XML和一个XPath搜索模式。也就是说,你可以使用Select-String像这样:

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

这很接近,但有一些例子,上下文没有达到“线程”行。为了获得所有的线程信息,我必须将其推回到-Context 5.这可以工作,但不是很准确,因为我也获得了额外的一行。 –