gpt4 book ai didi

regex - 优化 PowerShell 中的 RegEx 匹配

转载 作者:行者123 更新时间:2023-12-03 16:52:34 25 4
gpt4 key购买 nike

我正在过滤一个大型 Web 访问日志文件,并根据正则表达式匹配创建大约一打较小的文件。由于我对正则表达式经验不多,我希望弄清楚如何优化模式以获得更好的性能。

源码格式如下:

2015-06-14 00:00:06 38.75.53.205 - HTTP 10.250.35.69 80 GET /en/process/dsa/policy/wbss/wbss_current/wbss2013/Wbss13.pdf - 206 299 16722 0 HTTP (etc)

2015-06-13 00:00:31 1.22.55.170 - HTTP 157.150.186.68 80 GET /esd/sddev/enable/compl.htm - 200 396 23040 0 HTTP/1.1 Mozilla (etc)

以下是我的一些正则表达式模式。在 GET 之后,它们都在每一行的相同区域中查找。这就是我现在拥有它们的方式:

dsq = "( /esd/sddev/| /creative/)"
dpq = "/dsa/policy/"
pop = "(^((?! /popq/ /caster/(dsa/(policy|qsc|qlation))|(esd/(fed|cdq|qaccount|sddev|creative|forums/rdev))).)*$)"

前两个要匹配指定的模式,而“pop”应该匹配除指定模式之外的所有内容。

它按原样工作,但由于我的日志文件往往相当大(1GB 或更大),并且我有大约 12 种不同的模式要匹配,我希望有一种方法可以提高这些模式的性能。

关于用法,我有如下代码,其中$profile是上面列出的其中一个(它们在哈希表中,我分别循环遍历它们):

 Get-Content $sourcefile -ReadCount 5000 | 
ForEach { $_ -match $profile | Add-Content targetfile }

感谢大家的任何见解!

最佳答案

这不是对正则表达式的改进,但如果您在 $sourcefile 上为您拥有的每个配置文件运行传递,我可以为此提供一个小的解决方案。

Get-Content $sourcefile -ReadCount 5000 | ForEach { 
switch -regex ($_) {
$dsq {$chosenPath = "file1"; continue}
$dpq {$chosenPath = "file2"; continue}
$pop {$chosenPath = "file3"; continue}
default {}
}

# If no path is set they we skip this step.
If($chosenPath){$_ | Add-Content $chosenPath}
}

开关使用-regex开关。您可以引用哈希表的每个元素以进行匹配。如果找到匹配项,则我们为该遍设置输出文件并停止处理 switch 以防有其他匹配项。比赛的顺序很重要。既然你说匹配是相互排斥的,这应该不是问题。

您可以为每个匹配用 add-content 重写它,但我试图停止重复类似的代码。如果您删除它并放回所有 add-content 中,您可以删除我添加的 $null 逻辑。

正则表达式效率

对于最后一个,如果您只是想匹配 other 的所有内容,那么对于 pop 为什么不删除先行、贪婪限定符和 anchor ,而只使用 -notmatch

$pop = "/popq/ /caster/(dsa/(policy|qsc|qlation))|esd/(fed|cdq|qaccount|sddev|creative|forums/rdev))"
Get-Content $sourcefile -ReadCount 5000 |
ForEach { $_ -notmatch $pop | Add-Content targetfile }

作为旁注,我预计您需要在其中使用第二个循环来分解包含 5000 个项目的数组?

Get-Content $sourcefile -ReadCount 5000 | 
ForEach { $_ | ForEach{ $_ -match $profile | Add-Content targetfile }}

我想知道正则表达式是否一次在 5000 行上执行,而不是您期望的一行……或者可能是错字……或者我疯了。

关于regex - 优化 PowerShell 中的 RegEx 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com