首页 > 解决方案 > Splunk:过滤表数据

问题描述

我有以下查找:

C1 | C2| C3| C4
===|===|===|====
A  | 1 | x | test
===|===|===|====
A  | 2 | y | test
===|===|===|====
B  | 1 | x | test
===|===|===|====
B  | 1 | y | test
===|===|===|====
B  | 1 | z | test

我希望将其转换为:

C1 | C2| C3| C4
===|===|===|====
B  | 1 | x | test
===|===|===|====
B  | 1 | y | test
===|===|===|====
B  | 1 | z | test

所以想法是,如果对于C1的唯一值,如果C2中有多个值,则应该过滤掉C1 + C2的这种组合。

我尝试的是:

| inputlookup LUT.csv
| fillnull value="NULL"
| stats  list(*) as * dc("C2") as count by  "C1"
| where count=1

但这会导致:

C1 | C2    | C3    | C4
===|=======|=======|==============
B  | 1,1,1 | x,y,z | test,test,test

我不想要逗号分隔值。我想要不同的行。

标签: splunksplunk-query

解决方案


这是一个随处运行的示例。它使用streamstatsstats来计算 C1/C2 对的变化数量。然后用单个 C1/C2 对过滤掉任何东西。最后,mvexpand将多值 ​​C3 字段分成不同的事件。

| makeresults | eval _raw="C1  C2 C3 C4
A   1  x  test
A   2  y  test
B   1  x  test
B   1  y  test
B   1  z  test" | multikv
`comment("Everything above is just test data")`
| streamstats reset_on_change=true count by C1,C2 
| stats values(*) as * max(count) as max by C1
| where max > 1
| mvexpand C3
| table C1 C2 C3

推荐阅读