.net PowerShell-匹配运算符和多个组
我在PowerShell中处理以下日志条目我试图使用.net PowerShell-匹配运算符和多个组,.net,regex,powershell,.net,Regex,Powershell,我在PowerShell中处理以下日志条目我试图使用-match操作符提取所有活动名称和持续时间,但我只得到一个匹配组。当我在C#中使用Regex对象执行相同的操作时,我没有得到我看到的所有匹配。有人能解释一下我做错了什么吗 相关PowerShell脚本 $formattedMessage-match“(Get\sClient\sModel | Parse\sExpression | Get\sAbstract\sQuery | Compile\sQuery | Execute\sQuery |
-match
操作符提取所有活动名称和持续时间,但我只得到一个匹配组。当我在C#中使用Regex
对象执行相同的操作时,我没有得到我看到的所有匹配。有人能解释一下我做错了什么吗
相关PowerShell脚本
$formattedMessage-match“(Get\sClient\sModel | Parse\sExpression | Get\sAbstract\sQuery | Compile\sQuery | Execute\sQuery | Get\sQuery\sPlan\sComplexity | Async\sTotal | Total | Total)\s-\sduration\([0-9]*)”;out null
$matches
输出
名称值
---- -----
0获取客户端模型-持续时间(0
1获取客户端模型
2 0
日志条目示例:
时间戳:11/9/2009 6:48:41 PM
信息:
类别:查询服务
优先事项:3
事件编号:1001
严重性:信息
标题:SPARQL查询响应
机器:SPOON16-SERVER
应用程序域:KnowledgeBaseHost.exe
进程ID:2040
进程名称:D:\QueryService\QSHost.exe
线程名称:
Win32线程ID:8092
扩展属性:
密钥-工作流cbbdd58b-e574-4054-88d4-1dd7a56dc9d9
超时-1800
结果格式-WireTable
来自注册表的结果-False
从缓存编译的查询-True
结果计数-28332
查询计划复杂性-661622
获取客户端模型-持续时间(0)开始(0)
解析表达式-持续时间(0)开始(0)
获取抽象查询-持续时间(0)开始时间(0)
编译查询-持续时间(0)开始(0)
获取查询计划-持续时间(0)开始(1)
执行查询-持续时间(63695)开始(1)
获取查询计划复杂性-持续时间(0)开始(63696)
获取执行的操作-持续时间(0)开始(63696)
总计-持续时间(63696)开始(0)
异步总持续时间(63696)启动(0)
我可以通过定义一个正则表达式,然后调用该正则表达式上的.Matches来获取所有组。我仍然很想知道是否可以使用PowerShell中的-match操作符来实现这一点
$detailRegex = [regex]"(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)"
$detailRegex.Matches($formattedMessage)
您可以使用V2中的Select String cmdlet执行此操作,但需要指定-AllMatches开关,例如:
$formattedMessage | Select-String 'regexpattern' -AllMatches
请记住,使用
-match
操作符时,您要做的主要事情是查找“a”匹配,即正则表达式模式是否匹配。只需使用一次-match操作符;它不会对输入进行全局匹配。Keith Hill建议在Microsoft connect上使用-matchall操作符
我将建议另一种方法。如果日志条目位于文件中,则可以使用switch语句完成相同的操作:
switch -regex -file .\log.txt { $entryRegex { $matches[1] + ", " + $matches[2] } }
如果$entryRegex
具有您定义的正则表达式,则这是我通过该语句获得的输出:
Get Client Model, 0
Parse Expression, 0
Get Abstract Query, 0
Compile Query, 0
Execute Query, 63695
Get Query Plan Complexity, 0
Total, 63696
Async Total, 63696
这是一个很好的例子
而且,尽可能简化您的表达:
^([^-]+)\s*-\s*duration\(([0-9]+)
- 从行首开始
- 捕获第一个字符之前的所有字符-
- 确保有一个-
- 跳过空白
- 确保“持续时间”一词存在
- 捕获“持续时间(”之后的所有数字