加速Powershell脚本运行时

时间:2017-04-25 08:53:37

标签: multithreading performance powershell

我使用的是POWERSHELL脚本,它将特定的日志格式转换为制表符或逗号分隔(CSV)格式,如下所示:

$filename = "filename.log"
foreach ($line in [System.IO.File]::ReadLines($filename)) {
    $x = [regex]::Split( $line , 'regex')
    $xx = $x -join ","
    $xx >> Results.csv
}  

它工作正常,但对于20MB的日志文件,转换需要将近20分钟!有没有办法加速它?
我的系统:CPU:Corei7 3720QM / RAM:8GB
更新:日志格式如下:

192.168.1.5:24652 172.16.30.8:80  http://www.example.com "useragent"  

我希望目标格式为:

192.168.1.5,24652,172.16.30.8,80,http://www.example.com,"useragent"

REGEX:^([\d\.]+):(\d+)\s+([\d\.]+):(\d+)\s+([^ ]*)\s+(\".*\")$

1 个答案:

答案 0 :(得分:2)

作为Lieven Keersmaekers points out,您可以执行一次-replace操作来完成工作。

此外,foreach($thing in $o.GetThings()){}最初会阻塞,直到GetThings()返回,然后将整个结果存储在内存中,您无需这样做。您可以通过使用管道来避免这种情况。

最后,您的正则表达式可以简化,以便引擎在拆分之前不必解析整个字符串,方法是匹配前面有数字或空格的:

Get-Content filename.log |ForEach-Object {
    $_ -replace '(?:(?<=\d)\:|\s+)',','
} |Out-File results.csv