我是splunk的新手,在比较两个不同查询的两列中的值时遇到了问题。
查询1
index="abc_ndx" source="*/jkdhgsdjk.log" call_id="**" A_to="**" A_from="**" | transaction call_id keepevicted=true | search "xyz event:" | table _time, call_id, A_from, A_to | rename call_id as Call_id, A_from as From, A_to as To
查询2
index="abc_ndx" source="*/ jkdhgsdjk.log" call_id="**" B_to="**" B_from="**" | transaction call_id keepevicted=true | search " xyz event:"| table _time, call_id, B_from, B_to | rename call_id as Call_id, B_from as From, B_to as To
这是我的两个不同的查询。我想将A_from
列中的每个值与B_from
列中的每个值进行比较,如果值匹配,则显示A_from
的值。
有可能吗?
我分别运行了两个查询并将每个查询的结果导出到csv并使用了vlookup
函数。但问题是可以导出的数据的 限制最多10000行 因此我错过了大量数据,因为我的数据搜索有超过10000条记录。
有什么帮助吗?
答案 0 :(得分:1)
目前还没有任何数据可以对此进行测试,但是,以下内容应指向正确的方向。
如果您对第一个查询的表进行了整理,则应使用第二个搜索字符串将搜索字符串“管道”为appendcols
命令。此命令将允许您运行子搜索并将列“导入”到基本搜索。
在同一个表中有两列。您可以使用eval
命令创建一个新字段,用于比较这两个值并根据需要分配值。
希望这有帮助。
http://docs.splunk.com/Documentation/Splunk/5.0.2/SearchReference/Appendcols http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Eval
答案 1 :(得分:1)
我不确定为什么需要将此作为两个单独的查询。一切都来自相同的源类型,并使用几乎相同的数据。所以我会做类似以下的事情:
index="abc_ndx" source="*/jkdhgsdjk.log" call_id="**" (A_to="**" A_from="**") OR (B_to="**" B_from="**")
| transaction call_id keepevicted=true
| search "xyz event:"
| eval to=if(A_from == B_from, A_from, "no_match")
| table _time, call_id, to
这将从您指定的源类型和索引中获取所有事件,这些事件具有call_id,以及A_to和A_from或B_to和B_from。然后它交易所有这些,让你根据“xyz事件:”过滤(无论是什么)
然后它创建一个名为'to'的新字段,当A_from == B_from时显示A_from,否则显示“no_match”(占位符,因为你没有指定当它们不匹配时应该做什么)
还有一种方法可以在不使用交易的情况下解决这个问题。虽然没有更多关于基础数据的细节,但我不能肯定地说。基本思路是,如果你有一个公共字段(在这种情况下是call_id),你可以使用stats来收集与该字段相关的值,而不是昂贵的事务命令。
例如:
index="abc_ndx" index="abc_ndx" source="*/jkdhgsdjk.log" call_id="**"
| stats last(_time) as earliest_time first(A_to) as A_to first(A_from) as A_from first(B_to) as B_to first(B_from) as B_from by call_id
如果每个call_id只有一个值,则使用first()或last()实际上并不重要。 (你甚至可以使用min()max()avg(),你会得到同样的东西)也许这将帮助你更轻松地获得你需要的输出。