我有大约5GB的logdata我需要过滤掉并查找匹配的行,然后在匹配的行中包含+/- 75行。如果数据格式很重要,那么它就是破碎的XML,缺少一些标签。
我的代码用于查找匹配的行:
$ExampleFile = [System.IO.File]::ReadLines("C:\temp\filestomove\ExampleLog.txt")
$AccountNumber = "*123456789*"
$LineCount = 0
$RowsToExport = @()
foreach($line in $ExampleFile){
if($line -like "*$AccountNumber*"){
$RowsToExport += $LineCount
}
$LineCount += 1
}
上面的代码可以很快地完成工作,它每秒管理大约一MB的日志。这是我可以忍受的速度,因为这是一次性工作。
我正在努力解决的问题是以不太慢的方式导出匹配的行。
我的当前代码看起来像这样:
foreach($row in $RowsToExport){
$IndexRangeHigh = [int]$row + 75
$IndexRangeLow = [int]$row - 75
$test | select -Index ($IndexRangeLow..$IndexRangeHigh) | out-file C:\temp\Example.txt -append
}
这需要很长时间,我怀疑使用select -index
因为我怀疑它很慢。
上面的Measure-command在50MB测试文件中给出了以下结果:
TotalDays : 0,00354806909375
TotalHours : 0,08515365825
TotalMinutes : 5,109219495
TotalSeconds : 306,5531697
TotalMilliseconds : 306553,1697
读取文件并匹配行只需要55秒。
总结一下问题:
如何从大变量中导出一系列行?是否有其他方法可用于从$ ExampleFile变量中选择行而不是使用select -index ($ExampleRangeLow..$ExampleRangeHigh)
?
答案 0 :(得分:3)
PowerShell有一个cmdlet(Select-String
),允许在匹配后和/或匹配后提取文本。
Select-String -Path 'C:\path\to\your.log' -Pattern '123456789' -Context 75
Select-String
的输出是一个具有多个属性的对象,因此如果您需要文本形式的匹配行,则需要额外的代码:
... | ForEach-Object {
$pre = $_.Context.PreContext | Out-String
$post = $_.Context.PostContext | Out-String
"{0}{1}`n{2}" -f $pre, $_.Line, $post
}