使用where和select-string运算符解析powershell中的文本文件

时间:2013-10-17 12:30:53

标签: optimization powershell-v2.0

最近我不得不解决一个问题,即读取大量的日志文件并从中挑选出特定的文本块。

经过一些试验和错误,我找到了一个有效的解决方案,但我想知道是否有更好的方法。

这些日志文件包含文本块,每个文本块由“标题”引入,后跟未知数量的条目,并以空行结束。 (下面的例子,数字是伪亚麻布)

35#   logevent1 
36#   entry1
37#   entry2 
38#   entry3 
39#
40#   logevent2 
41#   entry1 
42#   entry2 

因此,我知道'logevent'标记我可以使用$line = $logfile | Select-String -Pattern 'logevent1'$lineNumber = $line | Select-Object -ExpandProperty LineNumber检索该行。我有第一个值使用Get-Content和范围运算符[$x..$y] 。 在我的例子中,这将是 35 。但是如何获得文本块后面的第一个空行?

我尝试使用Select-String -Pattern '',但由于字符串为空,因此会产生即时异常。所以我给他写了以下功能:

function Get-TextBlock([string]$filePath,$lineNumber)
{
    $startLine = ($lineNumber -1)
    $counter = 0
    $emptyLines = @()    
    Get-Content (Get-ChildItem $filePath) | ForEach-Object { 
        if( $_ -eq '' ) {
            $emptyLines += $counter; 
        }
        $counter++
    }
    $endLine = 0
    $counter = 0
    while( $endLine -le $startLine) {
        $endLine = ($emptyLines[$counter]); $counter++; 
    }
    $output += ((Get-ChildItem $filePath) | Get-Content)[$startLine..$endLine]
    return $output
}

如前所述,该功能对我有用,但我觉得有更好,更简单的方法来完成这项任务。

输出(删除我的伪行号后))看起来像这样

PS F:\scripts\powershell> Get-TextBlock '.\function-test.txt' 35
logevent1
entry1
entry2 
entry3 


____________________________________________________________________________

亲切的问候

0 个答案:

没有答案