是什么让这个PowerShell脚本读取文件中的行很慢?

时间:2017-06-16 21:04:45

标签: powershell

这是我正在使用的脚本,传入的文件大约是500mb

$file=$args[0]

If ($args[1] -eq 'response') {
$results = Select-String -Path $file -Pattern "(?<=sent: ).+(?= type)" | Select -Expand Matches | Select -Expand Value
}

If ($args[1] -eq 'blocked') {
$results = Select-String -Path $file -Pattern "(?<=: ).+(?= ->)" | Select -Expand Matches | Select -Expand Value
}

If ($args[1] -eq 'clients') {
$results = Select-String -Path $file -Pattern "(?<=:\d\d ).+(?= \[)" | Select -Expand Matches | Select -Expand Value
}

$results | Group-Object | Select-Object Name,Count | Sort-Object Count -Descending

有没有更快的方法来获取相同的数据?我决不会以任何方式与PowerShell结婚。

1 个答案:

答案 0 :(得分:1)

我为select-string交换Get-ContentReadCount为1000-5000,然后使用-match作为数组运算符来对齐生成的行数组。将字符串匹配提供给哈希表累加器以获取计数。

未经测试。

$file=$args[0]
$ht = @{}

If ($args[1] -eq 'response') {
$results = Get-Content $file -ReadCount 1000 |
  foreach-object {
   $_ -match "(?<=sent: ).+(?= type)" |
    ForEach-Object { $ht[$_]++ }
  }
 }

If ($args[1] -eq 'blocked') {
$results = Get-Content $file -ReadCount 1000 |
  foreach-object {
   $_ -match  "(?<=: ).+(?= ->)"|
    ForEach-Object { $ht[$_]++ }
  }
}

If ($args[1] -eq 'clients') {
$results = Get-Content $file -ReadCount 1000 |
  foreach-object {
   $_ -match  "(?<=:\d\d ).+(?= \[)"|
    ForEach-Object { $ht[$_]++ }
  } 
}

$results.GetEnumerator() | Sort-Object Value -Descending