Splunkのフィールド名でちょっとわかりづらいところがあるのでまとめてみた。
空白のあるフィールド名
当たり前といえば当たり前だけど
"field 1"
とダブルコーテーションでくくる必要がある。
でもいつもダブルコーテーションかというとそうでもない。
サンプル
| makeresults
| eval "field 1"=now()
| eval result1=strftime("field 1","%c")
| eval result2=strftime('field 1',"%c")
| eval result3=strftime($field 1$,"%c")
| table "field "1 result*
結果
field 1 | result2 | result3 |
---|---|---|
1575106884 | Sat Nov 30 18:41:24 2019 | Sat Nov 30 18:41:24 2019 |
ということでfield 1
の結果がでない。
根拠は見つけきれていないけど、eval
等の引数で使用するときのフィールド名は''
で囲う必要がある。
あと、$$
で囲うのはmap
以外でも使える。
rename
| makeresults
| eval "field 1"=now()
| eval result1=strftime("field 1","%c")
| eval result2=strftime('field 1',"%c")
| eval result3=strftime($field 1$,"%c")
| table "field "1 result*
| rename "field "* as field_*
foreach
やrename
で使用できる*
。
そもそも、"field "*
の時点で少しおかしい感じがするが問題なく使用できる。
| makeresults
| eval "field 1"=now()
| eval result1=strftime("field 1","%c")
| eval result2=strftime('field 1',"%c")
| eval result3=strftime($field 1$,"%c")
| table "field 1" result*
| foreach result*
[rename <<FIELD>> as result_<<MATCHSTR>>_<<MATCHSTR>>]
foreach
内でもrename
は使えるので凝ったフィールド名一括変換はこちらで実施できる。
フィールド名についてはKnowledge Manager Manualに
Proper field name syntax
Field names must conform to the field name syntax rules.Valid characters for field names are a-z, A-Z, 0-9, . , :, and _.
Field names cannot begin with 0-9 or _ . Leading underscores are reserved for Splunk Enterprise internal variables.
数字から始まるフィールドは使えないよ。とか書いてある。
_から始まるフィールド名
Use default fieldsに書いてある通り。
| makeresults
| eval test=""
| fields -*
このクエリーの結果は_time
が残る。
しっかり除きたい場合はfields -_*
を使用するか、table
で残したいフィールドを明示する。
csvで出力する時、意識しないといろいろ付いてくるのはここら辺。
ただこの_
をつけると*
から外れるのはうまく使うとforeach
のフィールド指定を除外に使える。
| makeresults
| eval get=_time
| rename get as _get
| eval test = _get
終わったら戻してやればいい。なんか表示が消えてしまうからびっくりした。
{}を含むフィールド
JSONなんかでよく見かける。
|makeresults
|eval "test{}.test"="test"
_time | test.test |
---|---|
2019/12/25 10:37:40 | test |
作ろうとすると消えてしまう。
JSONデータをspath
するとそんなことはないのだけど。
仕方がないので、戻してあげる
|makeresults
|eval "test{}.test"="test"
|foreach *
[rename <<FIELD>> as "test{}.test"]
foreach
を使っているのは、変化したフィールド名を手打ちしたくなかったから。
変化するといえば、multikv
をCSVで使う時フィールド名に空白が入っていると _(アンダーバー) に変更してしまう。
まとめ
Splunkの出力で日本語のフィールド名やスペースが入ったフィールド名を使いたい時はある。
でも計算するときとかこのようにいろいろ気にしなきゃいけないので、最後の最後でrename
する方がいいです。