加速 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 分钟!有没有办法加速它?
我的系统: 中央处理器: Corei7 3720QM/内存: 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"

正则表达式:^([d.]+):(d+)s+([d.]+):(d+)s+([^ ]*)s+(".*")$

正如Lieven Keersmaekers指出的那样,你可以做一个-replace操作来完成这项工作。

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

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

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

最新更新