我有以下情况(见下图)。
我需要在Splunk中遵循以下模式(请参见下图)。
我有不同的通用列,其中列名(后缀)的最后一部分是动态的并且是未知的。我需要将该通用列合并/合并到一个目标列。我想要在目标列中计算每个通用字段的平均值。我认为图片很好地说明了这种情况。
答案 0 :(得分:0)
因此,有多种方法可以达到您的期望值...我对于使您到达初始点的搜索有些好奇,因为可能会有一些更好的选择可以达到您想要的没有中间点的输出,正如我将在此处演示的...
首先,我将为您提供基础搜索,以供您使用...这将基于您的数据集建立一个模拟数据集,但不进行汇总。
| makeresults
| eval raw=split("10.10.2016 05:55 SuffixA=17
10.10.2016 05:57 SuffixA=15
10.10.2016 05:55 SuffixB=16
10.10.2016 05:59 SuffixB=12
10.10.2016 06:01 SuffixB=11
10.10.2016 06:03 SuffixC=9
10.10.2016 06:05 SuffixC=18
10.10.2016 06:09 SuffixC=21","
")
| mvexpand raw | rename raw -> _raw
| rex "^(?<_time>\S+\s+\S+)" | eval _time=strptime(_time,"%m.%d.%Y %H:%M")
| kv | table _time Suffix*
从这里开始,我只有某些数据点的后缀及其对应的值。要计算每个后缀的聚合,如果我可以将其转换为键(正在使用的特定后缀)和值……这是很方便的,untable会为我做。 (出于好奇,相反的方向当然是xyseries)
<base search> | untable _time key value
现在,我只需要按键(以您的情况为平均值)执行聚合即可。我想保留原始数据集中的所有原始行,因此eventstats会很方便
<base search> | untable _time key value
| eventstats avg(value) as average by key
我现在有_time,键,值,平均值的输出。接下来,让您返回单独的后缀列,我可以使用语法eval并分配一个为另一个字段的值命名的字段,然后使用fields删除现在多余的字段。
<base search> | untable _time key value
| eventstats avg(value) as average by key
| eval {key}=value | fields - key value
在进行了上述实验之后,让我们使用上面的一些技巧,进行与您当前的当前状态相匹配的新基础搜索。
| makeresults | eval raw=split("10.10.2016 05:55 SuffixA=17
10.10.2016 05:57 SuffixA=15
10.10.2016 05:55 SuffixB=16
10.10.2016 05:59 SuffixB=12
10.10.2016 06:01 SuffixB=11
10.10.2016 06:03 SuffixC=9
10.10.2016 06:05 SuffixC=18
10.10.2016 06:09 SuffixC=21","
") | mvexpand raw | rename raw -> _raw
| rex "^(?<_time>\S+\s+\S+)" | eval _time=strptime(_time,"%m.%d.%Y %H:%M")
| kv | table _time Suffix* | untable _time key value
| eventstats avg(value) as average by key
| eval {key}=value, StaticPart:{key}=average | fields - key value average
| table _time StaticPart:* Suffix*
从这时开始,另一种选择可能是使用foreach对所有StaticPart:*字段运行评估以创建新的平均字段,然后删除所有StaticPart字段,如下所示:
<base search>
| foreach StaticPart:* [eval average=coalesce('<<FIELD>>',average)]
| fields - StaticPart:*