splunk正则表达式
- 正则表达式匹配文本字符模式,使用正则表达式的搜索命令包括rex、regex,以及评估函数(例:match、replace)。
- splunk正则表达式均为PRCE(Perl兼容正则表达式),且使用PRCE C库。
1 语法和表达
关于splunk正则表达式的语法介绍可以参考官方文档《Knowledge Manager Manual》
字符类型
组、量词、替换
例子:
- 事件文本:131.253.24.135 fail admin_user
- 目标:提取出ip、result、user
- 表达式:
a. (?<ip>\d+.\d+.\d+.\d+) (?<result>\w+) (<user>.*)
b. (?<ip>\S+) (?<result>\S+) (?<user>\S+)
2 搜索命令
关于搜索命令的详细介绍可以参考官方文档《Search Reference》
2.1 rex
描述
使用该命令可以通过以正则表达式命名的群组提取字段,还可以通过sed表达式替换或取代字段中的字符。
语法
rex [field=<field>] (<regex-expression> [max_match=<int>] [offset_field=<string>]) | (mode=sed <sed-expression>)
例1
- 原始事件:From: Susan To: Bob
- 目标:from=Susan, to=Bob
- 命令:|rex field=_raw “From: (?<from>.*) To: (?<to>.*)”
例2
- 原始事件:从search_id字段中提取user、app,search_id字段的值是search_id=bob;search
- 目标:user=bob, app=search
- 命令:|rex field=search_id “(?<user>\w+);(?<app>\w+)”
例3
- 目标:将正则表达式匹配的数字替换成匿名字符串
- 命令:|rex field=cnumber mod=sed “s/(\d{4}-){3}/xxxx-xxxx-xxxx-/g”
2.2 regex
描述
该命令可以删除与指定正则表达式不匹配的结果。
语法
regex (<field>=<regex-expression>|<field>!=<regex-expression>|<regex-expression>)
例
- 目标:仅保留_raw字段包含A类IP地址(10.0.0.0/8)的搜索结果
- 命令:|regex _raw=”(?=!\d)10.\d{1,3}.\d{1,3}.\d{1,3}(?!\d)”
2.3 erex
描述
该命令可以自动提取与指定示例值相似的字段值。
语法
erex [<field>] examples=<string> [<counterexamples>=<string>] [fromfield=<field>]
例
- 目标:提取7/01和07/02这样的值,但不是99/2这样的模式,并把提取值放在monthday属性中
- 命令:|erex monthday examples=”7/01, 07/02” counterexamples=”99/2”
3 实际问题
以下是我碰到的一个实际问题
数据源:邮件日志
问题:由于是域账户,用户名前带有域名,如poc\admin;
用户名还可能是完整的邮箱名称,如:admin@poc.com
目标:提取出用户名,不包含前缀以及后缀
命令:注意需要四个斜杠来匹配一个斜杠
结果对比:
不加正则:
加正则:
附:
正则中为什么需要4个/来匹配1个/