如何在Splunk的rex命令中通过eval动态引用修改组名?
问题:Splunk宏中使用eval变量动态生成rex捕获组名失败
我尝试在Splunk的rex命令里通过eval引用动态修改捕获组名,但直接将eval变量传递给宏时,变量名没有被替换成实际值,而是保留了变量本身的名称。
宏定义(myrextest(1))
| eval test= "Hello" | eval myinput = $myinput$ | eval rexString = "'$myinput$':'(?<$myinput$>[^*']+)" | rex field=payload "'$myinput$':'(?<$myinput$>[^*']+)"
正常运行的搜索(直接传字符串参数)
| eval payload = "{'description':'snapshot created from test','snapShotName':'instance1-disk-2-cio-1564744963','sourceDisk':'instance1-disk-2','status':'READY'}" `myrextest("snapShotName")`
输出结果:
rexString: 'snapShotName':'(?<snapShotName>[^*']+)
出现问题的搜索(传递eval变量)
| makeresults | eval payload = "{'description':'snapshot created from test','snapShotName':'instance1-disk-2-cio-1564744963','sourceDisk':'instance1-disk-2','status':'READY'}" | eval myMacroInput = "snapShotName" `myrextest(myMacroInput)`
输出结果:
'myMacroInput':'(?<myMacroInput>[^*']+)
解决方案
问题核心在于宏的参数替换时机:宏是在搜索解析阶段执行替换的,而eval变量是在搜索执行阶段才生成值,因此宏无法识别eval变量的实际内容。可以通过以下方式解决:
方法1:修改宏,用eval动态拼接正则后传递给rex
更新宏myrextest(1)的内容,利用eval在执行阶段拼接正则表达式:
| eval test= "Hello" | eval myinput = $myinput$ | eval rexPattern = "'".myinput."':'(?<".myinput.">[^*']+)" | rex field=payload "".rexPattern.""
方法2:直接在搜索中动态生成rex(无需宏)
如果宏不是必须的,可直接在搜索流程中完成动态正则的生成与调用:
| makeresults | eval payload = "{'description':'snapshot created from test','snapShotName':'instance1-disk-2-cio-1564744963','sourceDisk':'instance1-disk-2','status':'READY'}" | eval myMacroInput = "snapShotName" | eval rexPattern = "'".myMacroInput."':'(?<".myMacroInput.">[^*']+)" | rex field=payload "".rexPattern.""
关键逻辑
- 宏的参数替换发生在搜索启动前的解析阶段,此时eval变量尚未赋值,只能识别变量名称;
- 通过
eval拼接正则字符串是在搜索执行阶段完成的,此时变量已持有实际值,传递给rex后就能正确生成目标捕获组。
内容的提问来源于stack exchange,提问作者Jyothi Sony
相关产品推荐
相关产品推荐

