如何编写Splunk查询获取working_days>0的用户ID及工作日数据
Splunk 提取working_days>0用户记录的正确实现
常见过滤失效原因
之前写法返回结果不对,90%以上是这两个问题:
rex正则提取到的working_days默认是字符串类型,直接做数值大小比较会按字符串字典序判断,逻辑完全不符合预期- 正则提取时带了多余的空格、非数字字符,导致后续判断时字段值无法被识别为有效数字
可直接运行的查询语句
替换语句最开头的检索范围为你实际的索引、源类型条件即可:
<替换为你的基础日志检索条件,例:index=user_record sourcetype=work_stat> | rex "user_id:(?<user_id>\d+)" | rex "working_days:(?<working_days_extract>\d+)" | eval working_days = tonumber(working_days_extract) | where isnotnull(working_days) AND working_days > 0 | table user_id, working_days
语句逻辑说明
- 两行
rex规则用\d+精准匹配连续数字,避免提取到字段值前后的空格、标点等冗余字符 eval步骤调用tonumber()函数把字符串格式的工作日数强制转换为数值类型,是过滤条件生效的核心where条件同时排除空值、0值、非数字的无效记录,不会漏判也不会误判- 最后用
table只返回要求的user_id和working_days字段
针对你提到的4条样例日志场景,该语句会精准返回两条目标结果:
- user_id:5619,working_days:10
- user_id:306561,working_days:35
调试方案
如果运行后结果仍不符合预期,可以在where行前插入下面这行调试,确认字段类型是否正确:
| eval check_type = typeof(working_days), check_value = working_days."___"
如果check_type返回值不是Number,说明正则提取的内容有冗余字符,调整rex的匹配规则即可。
内容的提问来源于stack exchange,提问作者Aniket Tiwari
相关产品推荐
相关产品推荐

