如何用正则在Splunk查询中提取Windows程序命令行的安装包名?
解析Windows命令行参数提取安装包名的Splunk正则方案
需求与数据示例
编写Splunk查询时需解析Windows程序的命令行参数,提取其中的安装包名。以下是典型的命令行数据示例:
/i "package\name" test /i "package\name" "test" /i "package\ name" test /i "package\ name" "test" /i package\name test /package package\name "test"
匹配规则
- 包名前固定带有
/i或/package标识,大小写不敏感,标识与包名之间可能有空格也可能无空格 - 包名可能用引号包裹(包裹时允许包含空格),也可能不带引号
- 只需提取标识之后、后续参数之前的包名内容,无需关注后续参数
尝试过程中的问题
初始正则的缺陷
最初使用正则:\/([iI]|(?i)package)\s?(?<package>.*?)\s
问题:当包名带引号且内部有空格时,会提前截断匹配结果,比如第三、第四个测试用例中,只能提取到package而非完整的package\ name。分场景匹配的问题
尝试用两个正则分别处理带引号和不带引号的情况:- 处理带引号包名的正则:
\/([iI]|(?i)package)\s?"(?<package1>.*?)"
可正确匹配前4个测试用例,但无法覆盖后两个不带引号的场景。 - 处理不带引号包名的正则:
\/([iI]|(?i)package)\s?[^"](?<package2>.*?)\s
问题:会匹配所有测试用例,且在后两个不带引号的场景中,会截断包名的第一个字符,得到ackage\name而非完整的package\name。
- 处理带引号包名的正则:
最终可行方案
经调整后得到可覆盖所有场景的正则表达式:
(?i)(\/i|\/package)\s?(?:"(?<package>[^"]*)"|(?<package>\S+))
正则说明
(?i):开启大小写不敏感模式,匹配/i//I、/package//PACKAGE等变体(\/i|\/package):匹配包名前的标识\s?:匹配标识与包名之间可能存在的单个空格(?:"(?<package>[^"]*)"|(?<package>\S+)):分支匹配两种场景- 带引号场景:匹配引号内的所有内容(直到闭合引号),存入
package捕获组 - 不带引号场景:匹配连续的非空白字符(直到下一个参数前的空格),存入
package捕获组
- 带引号场景:匹配引号内的所有内容(直到闭合引号),存入
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

