【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シリーズ