https://community.splunk.com/t5/Reporting/replacing-large-numeric-values-with-0/m-p/507054
でやったことのまとめ
課題
multivalue.spl
| makeresults
| eval _raw="xTemp_wl0
48
50
43
60
60
54
61
60
1161181233
43
60
49"
| multikv forceheader=1
| stats list(xTemp_wl0) as xTemp_wl0
xTemp_wl0 |
---|
48 50 43 60 60 54 61 60 1161181233 43 60 49 |
このような一つだけとても大きい数があるマルチバリューの平均を出したい |
そのままavg() すると大きな値になるので、外れ値を除外、0 にしたい |
という課題でした。 |
mvmap
mvmap.spl
| makeresults
| eval _raw="xTemp_wl0
48
50
43
60
60
54
61
60
1161181233
43
60
49"
| multikv forceheader=1
| stats list(xTemp_wl0) as xTemp_wl0
| stats avg(eval(mvmap(xTemp_wl0,if(xTemp_wl0>100,0,xTemp_wl0)))) as average
average |
---|
49 |
Splunk ver 8以降でつかえるmvmap を使用するとこんな感じ |
やってることはeval とif の評価なのでわかりやすい |
rex
rex.spl
| makeresults
| eval _raw="xTemp_wl0
48
50
43
60
60
54
61
60
1161181233
43
60
49"
| multikv forceheader=1
| stats list(xTemp_wl0) as xTemp_wl0
| rex mode=sed field=xTemp_wl0 "s/\d{3,}/0/g"
| stats avg(xTemp_wl0) as average
average |
---|
49 |
rex
はマルチバリューでも普通に使えるので、正規表現\d{3,}
で三桁以上の数字を0
にしている。
まとめ
- マルチバリューには
match()
やlike()
の評価系だけでなくrex
も使える。 -
stats
等の集計コマンドもマルチバリューを展開しなくてもそのまま計算できる。
https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonStatsFunctions - JSONから展開したフィールドはマルチバリューが多いので活用してください。
小ネタばかりだな