Splunk マルチバリューを表にする。


小ネタ
https://community.splunk.com/t5/Splunk-Search/How-to-Split-Row-value-in-single-column-to-multiple-row-value/m-p/543340#M153911
で回答してみた。

https://attack.mitre.org/matrices/enterprise/
の表を作りたいらしい。

課題

active formed homeTown members_age members_name members_powers members_secretIdentity secretBase squadName
true 2016 Metro City 29
39
1000000
Molecule Man
Madame Uppercut
Eternal Flame
Radiation resistance
Turning tiny
Radiation blast
Million tonne punch
Damage resistance
Superhuman reflexes
Immortality
Heat Immunity
Inferno
Teleportation
Interdimensional travel
Dan Jukes
Jane Wilson
Unknown
Super tower Super hero squad

これを

active formed homeTown members_age members_name members_powers members_secretIdentity secretBase squadName
true 2016 Metro City 29 Molecule Man Radiation resistance Dan Jukes Super tower Super hero squad
39 Madame Uppercut Turning tiny Jane Wilson
1000000 Eternal Flame Radiation blast Unknown
Million tonne punch
Damage resistance
Superhuman reflexes
Immortality
Heat Immunity
Inferno
Teleportation
Interdimensional travel

spl

multivalue_to_table.spl
index=_internal | head 1 | fields _raw
| eval _raw="{\"squadName\":\"Super hero squad\",\"homeTown\":\"Metro City\",\"formed\":2016,\"secretBase\":\"Super tower\",\"active\":true,\"members\":[{\"name\":\"Molecule Man\",\"age\":29,\"secretIdentity\":\"Dan Jukes\",\"powers\":[\"Radiation resistance\",\"Turning tiny\",\"Radiation blast\"]},{\"name\":\"Madame Uppercut\",\"age\":39,\"secretIdentity\":\"Jane Wilson\",\"powers\":[\"Million tonne punch\",\"Damage resistance\",\"Superhuman reflexes\"]},{\"name\":\"Eternal Flame\",\"age\":1000000,\"secretIdentity\":\"Unknown\",\"powers\":[\"Immortality\",\"Heat Immunity\",\"Inferno\",\"Teleportation\",\"Interdimensional travel\"]}]}"
| spath 
| fields - _*
| rename *{}.* as *_*
| rename *{} as *
| table *
``` this is sample data```
``` from here, the logic ```
| eval tmp="val"
| transpose 0 header_field=tmp
| streamstats window=1 count(val) as count
| eventstats max(count) as count
| appendpipe [ eval column="count", val=count]
| fields - count
| dedup column
| transpose 0 header_field=column
| fields - column
| eval count=mvrange(0,count)
| mvexpand count
| rename count as _count
| foreach * [ eval <<FIELD>> = mvindex(<<FIELD>>,_count)]
| fields - _count

解説

  • 最初のevaltransposeでヘッダー名等を決めた上で縦横変換している
  • streamstatseventstatsで一番多いマルチバリューの数を数えている。
    • もっと簡単にできるかもしれない
  • appendpipeで縦横を元に戻した時に使うマルチバリューの値を格納したフィールドをくっつけている。
  • mvrangeで行分割する数の基準を決め、mvexpand
  • renameからのながれはJSONとかでやっている一括抽出

まとめ

appendpipeからdedupのところは、ちょっと新鮮だったと思います。

Splunkはログが好きに加工できるのがいいですね