Splunkでマルチバリューのフィールドを扱う makemv他
マルチバリューを扱うコマンド4種類をご紹介します。
- マルチバリューコマンド
- makemv
- mvcombine
- mvexpand
- nomv
この記事では解説しませんが、eval/stats/chart内で使える関数はこちらです。
- マルチバリュー eval関数(Multivalue eval functions)
以下の記事でも紹介しています。
jnox.hatenablog.com
- マルチバリュー stats/chartl関数(Multivalue stats and chart functions)
makemv
mv(multi value)を作る(make)コマンドです。
Syntaxはこちら
makemv [delim=<string> | tokenizer=<string>] [allowempty=<bool>] [setsv=<bool>] <field>
option
delim
区切り文字(デリミタ)を指定し、その値ごとに値を分割します。
tokenizerと併用できません。
delimにスペースを指定し、ユーザエージェントをマルチバリューにした例
tokenizer
正規表現を指定し、キャプチャグループにマッチした値ごとに分割します。
delimと併用できません。
tokenizerに空白以外(\S+)を指定し、ユーザエージェントをマルチバリューにした例
tokenizerに(\S+)\s\S+を指定し、ユーザエージェントをマルチバリューにした例
最初のキャプチャグループ(\S+)にマッチした値がマルチバリューに変換されます。
| eval original_user_agent=user_agent | makemv user_agent tokenizer="(\S+)\s\S+" | table user_agent original_user_agent
allowempty
空の値(empty)を許可するか指定します。
デフォルトは許可しない(false)です。
簡単に説明するためユーザエージェントフィールドを「a,,b」に変更しています。
ユーザエージェントをマルチバリューにした例(allowemptyがfalseの場合)
ユーザエージェントをマルチバリューにした例(allowemptyがtrueの場合)
makemvコマンドの実行結果が入るuser_agentフィールドは目視では同じ値が入っていますが、 mvindexコマンドをつかうと両者の違いがわかります。
| rex mode=sed field=user_agent "s/.*/a,,b/g" | eval original_user_agent=user_agent | makemv user_agent delim="," allowempty=true | eval val_0=mvindex(user_agent,0) | eval val_1=mvindex(user_agent,1) | eval val_2=mvindex(user_agent,2) | table val* user_agent original_user_agent
setsv
逆に、マルチバリューからシングルバリューへ変換するようにするオプションです。
デフォルトはシングルバリューからマルチバリュー(false)です。
tokenizerに(\S+)\s\S+を指定し、ユーザエージェントをマルチバリューにした後、 シングルバリューに戻す例
delimを指定していないのでスペース区切りでシングルバリューに結合されます。
| eval original_user_agent=user_agent | makemv user_agent tokenizer="(\S+)\s\S+" | table user_agent original_user_agent | makemv user_agent setsv=true
mvcombine
mv(multi value)を結合する(combine)コマンドです。
setsv=true
のときのmakemvコマンドと同じ結果を返すようです。
Syntaxはこちら
mvcombine [delim=<string>] <field>
setsv=true
のときのmakemvコマンドと同じ結果になっていることがわかります。
| eval original_user_agent=user_agent | makemv user_agent tokenizer="(\S+)\s\S+" | table user_agent original_user_agent | mvcombine user_agent
mvexpand
mv(multi value)を展開する(expand)コマンドです。
limitオプションで結果数を制限できます。
Syntaxはこちら
mvexpand <field> [limit=<int>]
例えばstats values,distinct_count関数を使用し、3台以上の端末からアクセスがあるドメインを調べる場合、
以下の SPLを実行します。
このとき、values関数はマルチバリューを返すので、mxexpandを使用して以下のようにシングルバリューに変換できます。
| stats values(src_ip) distinct_count(src_ip) by domain | search "distinct_count(src_ip)" >= 3 | mvexpand "values(src_ip)"
nomv
mv(multi value)フィールドをシングルバリューに変換するコマンドです。
Syntaxはこちら
nomv <field>
mvexpandと異なり、結果が1つのイベントにまとめられました。
そのため、makemvで再度展開することが可能です。
index=squid method=connect | stats values(src_ip) distinct_count(src_ip) by domain | search "distinct_count(src_ip)" >= 3 | nomv "values(src_ip)" | makemv "values(src_ip)"