【Splunk】evalは新しくフィールドを作る

evalコマンドの説明を書きます。
以下の記事の派生記事です。
canada-lemon.hatenablog.com

evalは新しいフィールドを作るコマンドです。

構文例
| eval <新しく定義したいフィールド名> = (フィールドを定義する条件)

使用例1:四則演算する

evalを使って数値の足し算をやってみます。

以下のSPLを実行してダミーデータを用意します。
4人の生徒の英数国の点数です。
makeresultsってなんぞや?という方は以下の記事をご参照ください。
canada-lemon.hatenablog.com

| makeresults format=csv 
data="Name,English,Math,Japanese
Alfred,90,60,70
Gascoigne,80,80,80
Gehrman,60,100,50
Ludwig,70,70,90"
| table Name English Math Japanese
Name English Math Japanese
Alfred 90 60 70
Gascoigne 80 80 80
Gehrman 60 100 50
Ludwig 70 70 90


evalコマンドを使い、4人の合計点を計算します。
Splunkは一般的な演算子をサポートしており、"+"で数値を足し算できます。
もちろん、引き算も掛け算も割り算も可能です。

| makeresults format=csv 
data="Name,English,Math,Japanese
Alfred,90,60,70
Gascoigne,80,80,80
Gehrman,60,100,50
Ludwig,70,70,90"
| table Name English Math Japanese
| eval sum = English + Math + Japanese
Name English Math Japanese sum
Alfred 90 60 70 220
Gascoigne 80 80 80 240
Gehrman 60 100 50 210
Ludwig 70 70 90 230


文字列の結合も可能です。
"+"と"."の2つを使えます。

| makeresults format=csv 
data="Name,English,Math,Japanese
Alfred,90,60,70
Gascoigne,80,80,80
Gehrman,60,100,50
Ludwig,70,70,90"
| table Name English Math Japanese
| eval sum = English + Math + Japanese
| eval sum = "合計は" . sum . "点だよ"

上述のSPLでは、sumフィールドで英数国の合計を足し算し、更に再代入して文字列を結合しています。

Name English Math Japanese sum
Alfred 90 60 70 合計は220点だよ
Gascoigne 80 80 80 合計は240点だよ
Gehrman 60 100 50 合計は210点だよ
Ludwig 70 70 90 合計は230点だよ

このように、文字列を結合できました。

使用例2:時間の表示形式を変換する

Splunkにはタイムスタンプを示す_timeフィールドがデフォルトで用意されていますが、このフィールドは加工やリネームを行うとUNIX形式で表示されます。

以下のSPLの実行結果をご確認ください。(値はSPLを実行した日時によって変わります)

| makeresults
| table _time
| rename _time as time
time
1659279600


そこで、evalコマンドのstrftime関数で表示形式を変換します。
1つ目の引数にUNIX時間、2つ目の引数に変換したい時間のフォーマットを入れます。

| makeresults
| table _time
| rename _time as time
| eval time = strftime(time,"%Y/%m/%d %H:%M:%S")
time
2022/08/01 00:00:00


時間をUNIX形式に変換し、足し算と引き算で前後時間を計算し、再度標準形式に変換することも可能です。
以下のSPLでは600(秒)を足し引きして前後10分を表示しています。

| makeresults 
| eval time = strftime(_time,"%Y/%m/%d %H:%M:%S") 
| eval unixtime = strptime(time,"%Y/%m/%d %H:%M:%S") 
| eval before_10m = unixtime - 600 
| eval before_10m = strftime(before_10m,"%Y/%m/%d %H:%M:%S") 
| eval after_10m = unixtime + 600 
| eval after_10m = strftime(after_10m,"%Y/%m/%d %H:%M:%S")
| table before_10m time after_10m
before_10m time after_10m
2022/07/31 23:50:00 2022/08/01 00:00:00 2022/08/01 00:10:00


evalには他にも色々な用途があるので、一例を挙げます。

  • replaceで文字を置換する
  • ifで場合分けする
  • roundで四捨五入する

興味がある方は、こちらの公式資料もご参照ください。

備考1:数値と文字列は同時に処理できない

使用例1のSPLのうち、下2行を抜粋しました。
このSPLでは、数字の足し算を処理してから、文字列の結合を処理しています。

| eval sum = English + Math + Japanese
| eval sum = "合計は" . sum . "点だよ"

このSPLを1行で書こうとするとこうなります。

| makeresults format=csv 
data="Name,English,Math,Japanese
Alfred,90,60,70
Gascoigne,80,80,80
Gehrman,60,100,50
Ludwig,70,70,90"
| table Name English Math Japanese
| eval sum = English + Math + Japanese
| eval sum = "合計は" . English + Math + Japanese . "点だよ"
Name English Math Japanese sum
Alfred 90 60 70 合計は906070点だよ
Gascoigne 80 80 80 合計は808080点だよ
Gehrman 60 100 50 合計は6010050点だよ
Ludwig 70 70 90 合計は707090点だよ

英数国の点数を足し算するはずが、文字列として結合されてしまいました。
このように、Splunkは数字の計算と文字列の結合を同時に行えません。
このときエラーが出力されないことに注意です。

本記事ではevalコマンドの説明をしました。
このコマンドは本当に用途が広いですが、一気に全部を覚えるのは大変なので、Splunkでやりたい処理が見つかったときに、都度調べるのがおすすめです。

ここまで読んでいただき、ありがとうございました。

Splunk頻出SPLシリーズ