如何在 Splunk 中为 rex 使用令牌?
How to use a token for a rex in Splunk?
我有一个令牌 $token_rex$
在仪表板中设置如下:
<set>mvjoin(mvmap('token_keywords_mv',"(?<".'token_keywords_mv'.">".'token_keywords_mv'."+?)"), "|")</set>
token_keyrowrds_mv
基本上是这样的:
lorem
ipsum
situs
生成的令牌如下所示:
(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)
我正在尝试运行的查询如下:
index=* | rex field _raw "(?i)".$token_rex$
理想情况下,上面的内容应该像这样呈现:
index=* | rex field _raw "(?i)(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)"
我试过使用令牌过滤器 $token_rex|s$
和 $token_rex|n$
但都不起作用。我什至尝试 return 来自子搜索的值:
index=* | rex field _raw [| makeresults | eval string_rex=$token_rex$ | return $token_rex]
更新:发现令牌被指定为 rex 命令的详细信息。我的令牌设置如下:
<set token="token_rex">mvjoin(mvmap('token_keywords_mv',"(?>".'token_keywords_mv'."<".'token_keywords_mv'."+?)"), "|")</set>
当我将其用作 ... | rex field=_raw '(?i)$token_rex$'
时,出现以下错误:
Error in 'rex' command: Encountered the following error while compiling the regex ''(?i)mvjoin(mvmap('token_keywords_mv'': Regex: missing closing parenthesis.
然而,当我直接将其设置为值时,它起作用了:
<set token="token_rex">(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)</set>
更新:这是一个示例仪表板。
<dashboard theme="dark">
<init>
<set token="token_keywords_mv">split("lorem,ipsum,situs", ",")</set>
<set token="token_keywords_starred">"*".mvjoin($token_keywords_mv$, "* OR *")."*"</set>
<set token="token_rex">"(?i)".mvjoin(mvmap('token_keywords_mv', "(?<".'token_keywords_mv'.">".'token_keywords_mv'."+?)"), "|")</set>
<set token="token_raw">(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)</set>
</init>
<label>Test Search</label>
<description>Multivalue</description>
<row>
<panel>
<table>
<search>
<query>index=*
[| makeresults
| eval string_search=$token_keywords_starred$
| return $string_search]
| rex field=_raw $token_raw|s$
| stats count(lorem) AS Lorem, count(ipsum) AS Ipsum, count(situs) AS Situs
| eval header="Count"
| transpose column_name="String" header_field=header</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<option name="drilldown">none</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
<row>
<panel>
<table>
<title>ECHO</title>
<search>
<query>| localop
| makeresults
| eval token_keywords_starred=$token_keywords_starred$, token_keywords_mv=$token_keywords_mv$, token_rex=$token_rex$, token_raw=$token_raw|s$</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<option name="drilldown">none</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
</dashboard>
如果任何其他标记替换$token_raw|s$
,将会出现错误。使用 Splunk 8.0.3.
当我尝试使用此仪表板代码重现您的结果时:
<form>
<label>test</label>
<fieldset submitButton="false">
<input type="text" token="token_rex">
<label>field1</label>
</input>
</fieldset>
<row>
<panel>
<event>
<title>test</title>
<search>
<query>| makeresults | eval _raw="lorem ipsum dolor"
| rex "(?i)$token_rex$"
| table lorem ipsum situs</query>
<earliest>$earliest$</earliest>
<latest>$latest$</latest>
</search>
<option name="refresh.display">progressbar</option>
</event>
</panel>
</row>
</form>
我得到了这个优化的搜索(根据 Job Inspector 的报告):
| makeresults | rex field=_raw "(?i)(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)"
看起来不需要连接。
更新:将所有 set
标签更改为 eval
并使用 mvzip
而不是 mvmap
。 set
标签不计算,而 eval
标签计算。
<eval token="token_keywords_mv">split("lorem,ipsum,situs", ",")</eval>
<eval token="token_keywords_starred">"*".mvjoin($token_keywords_mv$, "* OR *")."*"</eval>
<eval token="token_rex">"(<".mvjoin(mvzip('token_keywords_mv','token_keywords_mv',">"),"+?)|(?<")."+?)"</eval>
<set token="token_raw">(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)</set>
我有一个令牌 $token_rex$
在仪表板中设置如下:
<set>mvjoin(mvmap('token_keywords_mv',"(?<".'token_keywords_mv'.">".'token_keywords_mv'."+?)"), "|")</set>
token_keyrowrds_mv
基本上是这样的:
lorem
ipsum
situs
生成的令牌如下所示:
(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)
我正在尝试运行的查询如下:
index=* | rex field _raw "(?i)".$token_rex$
理想情况下,上面的内容应该像这样呈现:
index=* | rex field _raw "(?i)(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)"
我试过使用令牌过滤器 $token_rex|s$
和 $token_rex|n$
但都不起作用。我什至尝试 return 来自子搜索的值:
index=* | rex field _raw [| makeresults | eval string_rex=$token_rex$ | return $token_rex]
更新:发现令牌被指定为 rex 命令的详细信息。我的令牌设置如下:
<set token="token_rex">mvjoin(mvmap('token_keywords_mv',"(?>".'token_keywords_mv'."<".'token_keywords_mv'."+?)"), "|")</set>
当我将其用作 ... | rex field=_raw '(?i)$token_rex$'
时,出现以下错误:
Error in 'rex' command: Encountered the following error while compiling the regex ''(?i)mvjoin(mvmap('token_keywords_mv'': Regex: missing closing parenthesis.
然而,当我直接将其设置为值时,它起作用了:
<set token="token_rex">(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)</set>
更新:这是一个示例仪表板。
<dashboard theme="dark">
<init>
<set token="token_keywords_mv">split("lorem,ipsum,situs", ",")</set>
<set token="token_keywords_starred">"*".mvjoin($token_keywords_mv$, "* OR *")."*"</set>
<set token="token_rex">"(?i)".mvjoin(mvmap('token_keywords_mv', "(?<".'token_keywords_mv'.">".'token_keywords_mv'."+?)"), "|")</set>
<set token="token_raw">(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)</set>
</init>
<label>Test Search</label>
<description>Multivalue</description>
<row>
<panel>
<table>
<search>
<query>index=*
[| makeresults
| eval string_search=$token_keywords_starred$
| return $string_search]
| rex field=_raw $token_raw|s$
| stats count(lorem) AS Lorem, count(ipsum) AS Ipsum, count(situs) AS Situs
| eval header="Count"
| transpose column_name="String" header_field=header</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<option name="drilldown">none</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
<row>
<panel>
<table>
<title>ECHO</title>
<search>
<query>| localop
| makeresults
| eval token_keywords_starred=$token_keywords_starred$, token_keywords_mv=$token_keywords_mv$, token_rex=$token_rex$, token_raw=$token_raw|s$</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<option name="drilldown">none</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
</dashboard>
如果任何其他标记替换$token_raw|s$
,将会出现错误。使用 Splunk 8.0.3.
当我尝试使用此仪表板代码重现您的结果时:
<form>
<label>test</label>
<fieldset submitButton="false">
<input type="text" token="token_rex">
<label>field1</label>
</input>
</fieldset>
<row>
<panel>
<event>
<title>test</title>
<search>
<query>| makeresults | eval _raw="lorem ipsum dolor"
| rex "(?i)$token_rex$"
| table lorem ipsum situs</query>
<earliest>$earliest$</earliest>
<latest>$latest$</latest>
</search>
<option name="refresh.display">progressbar</option>
</event>
</panel>
</row>
</form>
我得到了这个优化的搜索(根据 Job Inspector 的报告):
| makeresults | rex field=_raw "(?i)(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)"
看起来不需要连接。
更新:将所有 set
标签更改为 eval
并使用 mvzip
而不是 mvmap
。 set
标签不计算,而 eval
标签计算。
<eval token="token_keywords_mv">split("lorem,ipsum,situs", ",")</eval>
<eval token="token_keywords_starred">"*".mvjoin($token_keywords_mv$, "* OR *")."*"</eval>
<eval token="token_rex">"(<".mvjoin(mvzip('token_keywords_mv','token_keywords_mv',">"),"+?)|(?<")."+?)"</eval>
<set token="token_raw">(?<lorem>lorem+?)|(?<ipsum>ipsum+?)|(?<situs>situs+?)</set>