Optimization 使用where和select字符串运算符分析powershell中的文本文件
最近我不得不解决一个问题,读取大量日志文件并从中提取特定的文本块 通过一些尝试和错误,我找到了一个有效的解决方案,但我想知道是否有更好的方法 这些日志文件包含文本块,每个文本块由一个“标题”引入,后跟未知数量的条目,并以空行结束。(以下示例中,数字为伪线号) 因此,我知道“logevent”标记,我可以使用Optimization 使用where和select字符串运算符分析powershell中的文本文件,optimization,powershell-2.0,Optimization,Powershell 2.0,最近我不得不解决一个问题,读取大量日志文件并从中提取特定的文本块 通过一些尝试和错误,我找到了一个有效的解决方案,但我想知道是否有更好的方法 这些日志文件包含文本块,每个文本块由一个“标题”引入,后跟未知数量的条目,并以空行结束。(以下示例中,数字为伪线号) 因此,我知道“logevent”标记,我可以使用$line=$logfile>选择字符串-模式“logevent1”和$lineNumber=$line>选择对象-ExpandProperty lineNumber检索行,我有第一个值要使用
$line=$logfile>选择字符串-模式“logevent1”
和$lineNumber=$line>选择对象-ExpandProperty lineNumber
检索行,我有第一个值要使用获取内容
和范围操作符[$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
____________________________________________________________________________
问候
PS F:\scripts\powershell> Get-TextBlock '.\function-test.txt' 35
logevent1
entry1
entry2
entry3
____________________________________________________________________________