最近我不得不解决一个问题,即读取大量的日志文件并从中挑选出特定的文本块。
经过一些试验和错误,我找到了一个有效的解决方案,但我想知道是否有更好的方法。
这些日志文件包含文本块,每个文本块由“标题”引入,后跟未知数量的条目,并以空行结束。 (下面的例子,数字是伪亚麻布)
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
____________________________________________________________________________
亲切的问候