从大文本文件导出行范围

时间:2017-06-12 07:42:25

标签: powershell export

我有大约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)

1 个答案:

答案 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
}