我使用的是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+(\".*\")$
答案 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