Multithreading 加速Powershell脚本运行时
我使用的POWERSHELL脚本将特定日志格式转换为制表符或逗号分隔(CSV)格式,如下所示:Multithreading 加速Powershell脚本运行时,multithreading,performance,powershell,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 } 192.168.1.5:2465
$filename = "filename.log"
foreach ($line in [System.IO.File]::ReadLines($filename)) {
$x = [regex]::Split( $line , 'regex')
$xx = $x -join ","
$xx >> Results.csv
}
192.168.1.5:24652 172.16.30.8:80 http://www.example.com "useragent"
它工作正常,但对于20MB的日志文件,转换几乎需要20分钟!有没有办法加快速度?我的系统:CPU:Corei7 3720QM/RAM:8GB
更新:日志格式如下:
$filename = "filename.log"
foreach ($line in [System.IO.File]::ReadLines($filename)) {
$x = [regex]::Split( $line , 'regex')
$xx = $x -join ","
$xx >> Results.csv
}
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+(\“*”)$
因为,您可以执行一个-replace
操作来完成这项工作
另外,foreach($o.GetThings())中的thing({}
将首先阻塞,直到GetThings()
返回,然后将整个结果存储在内存中,您不需要这样做。您可以通过使用管道来避免这种情况
最后,可以简化正则表达式,以便引擎不必在拆分之前解析整个字符串,方法是在:
之前匹配数字或空格:
Get-Content filename.log |ForEach-Object {
$_ -replace '(?:(?<=\d)\:|\s+)',','
} |Out-File results.csv
Get Content filename.log | ForEach对象{
$-替换'(?:(?)当您可以执行替换时,为什么要执行拆分
和连接
?如果您可以向我们展示输入数据的示例和您正在使用的实际正则表达式模式,这可能会有所帮助using@LievenKeersmaekers我没能做到!