在Splunk中有些情况下有些字段可能时一长串字符串,但这些字符串中包含了一些我们想要替换为实际值的变量名,否则你直接在字符串中使用变量名,它会把变量名当作字符串来处理。
以下面的测试为例:
| makeresults
| eval name="Bob",age="13"
```student_info字段中包含了$student.name$和$student.age$,两个要替换实际值的字段,并且它们都含有一定的提取特征,这里的例子就是以$student开头,在不同的case中你可以根据自己的业务数据找出可以用来表明特征的提取方式```
| eval student_info="The student name is $student.name$ and age is $student.age$."
```max_match=0表示无限次匹配;field=student_info表示对哪个字段里面的内容进行正则匹配;"\$student.(?<extractfield>\w+)"表示匹配$student开头的,将$student.后面的内容匹配为提取的字段,这个例子中会匹配提取出两个字段```
| rex max_match=0 field=student_info "\$student.(?<extractfield>\w+)"
```foreach *表示对前面存在的所有数据中的所有列进行遍历,也就是遍历的对象是event中的字段名;注意:foreach后面的命令必须是流命令;"<<FIELD>>"用来表示原始数据中的字段名,也就是这里要遍历的字段名,遍历到哪个字段,这个<<FIELD>>就会变成哪个字段,注意这里是双引号;isnotnull(<<FIELD>>),需要先对原始数据中遍历的这个字段是否为空进行判断,否则如果遍历到的这个字段恰好是我们要要替换的字段,那么原始数据中该字段值为空的情况下会导致正则匹配提取失败,会导致整个student_info都变为空;'extractfield'表示前面正则匹配中提取出来的字段,如果原始数据中遍历的某个字段名和'extractfield'中的某个字段名相同,那么就会将student_info中以正则匹配的形式将你要替代的那部分替换为'<<FIELD>>',这里'<<FIELD>>'表示的就是这个字段在原始数据中的实际值,注意这里是单引号;在不满足if条件的情况下,就还是保留原来的内容,不做替换,这样就可以做到只讲我们的字符串中特定的字段变量名替换为实际的变量值;这里也要注意,你在student_info中的字段变量名要和想替换的原始数据中的变量名保持一致,否则字段名不一致,在if判断时也是显然不会匹配成功的。```
| foreach *
[eval student_info=if(isnotnull(<<FIELD>>) AND "<<FIELD>>"='extractfield', replace(student_info, "\$student.<<FIELD>>\$",'<<FIELD>>'), student_info)]
| table student_info extractfield name age
|