我正在尝试从多值字段中提取匹配的字符串,并显示在另一列中。我尝试了各种选项,通过分隔符分割字段,然后mvexpand,然后用户where/search来提取这些数据。我想知道是否有一种更简单的方法可以做到这一点,而不会在SPLUNK查询中遇到这些麻烦。
示例:假设我在下面有多值列1字段,数据由分隔符逗号分隔
column1=abc1,test1,test2,abctest1,mail,send,mail2,sendtest2,new,code,results
我使用分隔符|eval column2=split(column1,",")
分割此列,并使用regex/where/search搜索此列中具有*test*
的数据并返回结果,其中我能够提取结果,但列1仍然显示所有值abc1,test1,test2,abctest1,mail,send,mail2,sendtest2,new,code,results
,我想要的是修剪1column1以仅显示与test
匹配的单词,或者显示新column2中的那些条目,该条目应该仅显示该单词test1,test2,abctest1,sendtest2
,因为它们仅匹配*test*
。
谢谢你的帮助。
发布这个问题后找到了答案,它只是使用退出的mvfilter函数来提取匹配结果。
column2=mvfilter(匹配(column1,"测试"((
| eval column2=split(column1,",") | search column2="*test*"
不起作用,因为split
创建了一个多值字段,这是一个包含多个值的单个字段的单个事件。*test*
的search
仍然会找到该事件,即使它包含abc1
等,因为至少有一个字段是*test*
。
您可以使用mvfilter
命令将多值字段缩小到所关注的事件。
| eval column2=split(column1,",") | eval column2=mvfilter(match(column2,".*test.*"))
作为这种方法的替代方案,您可以使用正则表达式来提取您需要的内容。
| rex field=column1 max_match=0 "(<?column2>[^,]*test[^,]*)"
无论如何,最后,您需要使用mvjoin
将多个值连接到一个字符串中
| eval column2=mvjoin(column2, ",")