如何将一个搜索的结果传递到 splunk 中另一个搜索的 IN 子句中?

问题描述 投票:0回答:3

我运行查询并以表的形式获取 custId 列表。我如何将此结果传递到 IN 子句内的另一个搜索查询中。

例如:

搜索1:index=*“登录成功”|表custID 这给了我带有 custID 列的表格。

那我得跑了

index=* "邮件发送者"|where custID IN (搜索 1) |table CustID,_time

splunk splunk-query
3个回答
5
投票

使用子搜索。您必须尝试使用

format
选项才能使输出与
IN
兼容。

index=* "mail sent by"|where custID IN ([search index=* "successful login for"|fields custID | format]) |table CustID,_time

如果无法正确获得

format
输出,您可能必须使用没有
IN
的旧方法。

index=* "mail sent by"|where [search index=* "successful login for"|fields custID | format] |table CustID,_time

顺便说一句,

index=*
对于生产来说不是一个好的做法。使用真实的索引名称以获得更好的性能。


4
投票
index=myindex <mainSearchConditions>
custID IN (
   [search index=myindex <subsearchConditions> | table custID | dedup custID 
   | stats values(eval("\"".custID."\"")) as search delim="," | nomv search]
)

0
投票

本质上,Splunk 搜索可以返回多个项目。通常,这采用事件列表或表格的形式。 Subsearch 没有什么不同——当然,它可能会返回多个结果。

子搜索输出转换为查询词,直接用于限制您的搜索(通过

format
):

此命令由子搜索隐式使用。此命令获取子搜索的结果,将结果格式化为单个结果,并将该结果放入名为搜索的新字段中。

文档中的上述引用是一种神秘的说法,子搜索结果被转换为查询表达式以匹配任何子搜索输出

因此,子搜索的结果实际上与应用 IN 运算符 相同 - 每个子搜索结果将是一个匹配值。所以你不需要使用

IN
来达到预期的结果。


示例:OP 的用例

index=* "mail sent by"|where custID IN (search 1) |table CustID,_time

可写为:

index=* "mail sent by" [search {search 1}] |table CustID,_time

由于

(search 1)
生成包含列
custID
的表,因此子搜索不需要额外的处理即可达到指定的结果。子搜索将替换为以下内容:

( (custID="result1") OR (custID="result") OR ...)


示例:选择与最大值匹配的项目

[search index=main |stats max(batch) as batch]

子搜索返回一个包含单列和单个项目的表。为了使外部查询按预期工作,将列(使用

as
)从“max(batch)”重命名为“batch”非常重要,以便它与原始数据中的“batch”字段匹配.

生成的查询表达式将如下所示:

( batch="{max(batch)}" )

© www.soinside.com 2019 - 2024. All rights reserved.