最近我不得不解决一个读取大量日志文件并从中挑选特定文本块的问题。
经过反复试验,我找到了一个可行的解决方案,但我想知道是否有更好的方法。
这些日志文件包含文本块,每个都由一个“标题”引入,后跟未知数量的条目,并以空行结束。(下面的例子,数字是伪行号)
35# logevent1
36# entry1
37# entry2
38# entry3
39#
40# logevent2
41# entry1
42# entry2
因此,我知道 'logevent'-tag 我可以检索行,$line = $logfile | Select-String -Pattern 'logevent1'
并且$lineNumber = $line | Select-Object -ExpandProperty LineNumber
我有第一个值Get-Content
与 range operator一起使用[$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
____________________________________________________________________________
亲切的问候