Splunk: Splunk入門(SPL編 4/6) - よく使用する評価関数11選と演算子一覧


###### 実施環境： Splunk Cloud 8.2.2104.1

### 0. 前置き

 SPL の評価コマンド( eval , where 等)では、評価関数と呼ばれる関数が使用できます。
以下の一覧を見ると、コマンド同様関数も豊富であり、全部見ていくのはなかなか大変です。

[ SPL 評価関数一覧(英語)](https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/CommonEvalFunctions)

そこで、よく使用する評価関数11個を独断と偏見で絞り込みました。
ひとまずこれらの関数を知っておけば、大抵の SPL 文は作れると思います。

### 1. 分岐

###### 1.1. if

条件に合致する場合と合致しない場合でそれぞれ別の値を返す関数です。
条件の記載に使用する比較演算子については別途紹介します。

基本的な文法は以下の通りです。

 if(条件, 合致する場合の値, 合致しない場合の値)

以下の例では、項目「 kbps 」が1より大きい場合は文字列「 OK 」を、そうでない場合は文字列「 NG 」を項目「 flg 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval flg = if(kbps > 1, "OK", "NG")
| table kbps, flg
```

![スクリーンショット 2022-02-27 21.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f19eeef9-0e0b-21c0-a7be-6d13f2756b84.png "if")

###### 1.2. case

複数の条件を順番に判定し、最初に合致した条件に対応する値を返す関数です。
なお、指定したどの条件にも合致しなかった場合は NULL を返します。
 if を複数使用しても同じようなことはできますが、 case を使用したほうが処理がわかりやすくなります。

基本的な文法は以下の通りです。

 case(条件1, 値1, 条件2, 値2, ... )

以下の例では、項目「 kbps 」が1.5より大きい場合は文字列「 A 」を、項目「 kbps 」が1より大きい場合は文字列「 B 」を、項目「 ev 」が10より大きい場合は文字列「 C 」を項目「 level 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval level = case(kbps > 1.5, "A", kbps > 1, "B", ev > 10, "C")
| table kbps, ev, level
```

![スクリーンショット 2022-02-27 21.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7c27f0ba-234c-27d6-5130-92ddb4857fe9.png "case")

###### 1.3. coalesce

複数の値を順番に確認し、最初に NULL 以外となった値を返す関数です。
異なる項目名で同じ値を扱っている複数のログを組み合わせる際に便利です。

基本的な文法は以下の通りです。

 coalesce(値1, 値2, ... )

以下の例では、項目「 kbps 」の値が NULL でない場合は項目「 kbps 」の値を、項目「 kbps 」の値が NULL かつ項目「 average_kbps 」の値が NULL でない場合は項目「 average_kbps 」の値を、それぞれ項目「 all_kbps 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="*thruput"
| eval all_kbps = coalesce(kbps, average_kbps)
| table kbps, average_kbps, all_kbps
```

![スクリーンショット 2022-02-27 21.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ff3c5103-6cd4-2afb-bc97-e7e867a38929.png "coalesce")

### 2. 時間

###### 2.1. strftime, strptime

 strftime は日付時刻の値を UNIX 時間からその他の形式に変換して返す関数、 strptime は日付時刻の値をその他の形式から UNIX 時間に変換して返す関数です。
指定できる形式についてはここでは細かく紹介しませんが、参考となるページへのリンクを貼っておきます。

[日付時刻形式一覧(英語)](https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/Commontimeformatvariables)

基本的な文法は以下の通りです。

 strftime( UNIX 時間形式の日付時刻, 変換後の形式)

 strptime(その他の形式の日付時刻, 変換前の形式)

以下の例では、項目「 _time 」に代入されている UNIX 時間の値を「 YYYY-MM-DD HH-MM-SS-QQQ 」形式に変換して項目「 f_time 」に代入した後、それを UNIX 時間に戻して項目「 p_time 」に代入しています。

```Splunk:Splunk
index="_internal"
| eval f_time = strftime(_time,  "%Y-%m-%d %H-%M-%S-%Q"),
       p_time = strptime(f_time, "%Y-%m-%d %H-%M-%S-%Q")
| table _time, f_time, p_time
```

![スクリーンショット 2022-02-27 22.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/865692e4-de82-fc8d-7efc-59a506e1eaf6.png "time")

### 3. NULL

###### 3.1. isnull, isnotnull

 isnull は指定した値が NULL であれば真(条件合致)、 NULL でなければ偽(条件合致せず)を返す関数で、 isnotnull は逆に NULL でなければ真、 NULL なら偽を返す関数です。
主に NULL 値をデフォルトの値で埋めたい場合や、 where コマンドで NULL 値を検索したい場合に使用します。

基本的な文法は以下の通りです。

 isnull(値)

 isnotnull(値)

以下の例では、項目「 kbps 」の値が NULL である場合は項目「 chk_null 」に文字列「 OK 」を、項目「 chk_not_null 」に空の文字列を代入し、 NULL でない場合は項目「 chk_null 」に空の文字列を、項目「 chk_not_null 」に文字列「 OK 」を代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="*thruput"
| eval chk_null     = if(isnull(kbps),    "OK", ""),
       chk_not_null = if(isnotnull(kbps), "OK", "")
| table kbps, chk_null, chk_not_null
```

![スクリーンショット 2022-02-27 22.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7f8218f0-7b4d-91a9-a65f-163f946e3f11.png "null")

### 4. 数値

###### 4.1. round

引数に指定した数値を四捨五入した値を返す関数です。

基本的な文法は以下の通りです。

 round(数値)

以下の例では、項目「 kbps 」の値を四捨五入し、項目「 r_kbps 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval r_kbps = round(kbps)
| table kbps, r_kbps
```

![スクリーンショット 2022-02-27 22.05.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6e74cf89-0311-0768-f05b-9de3bdc978c3.png "round")

:::note info
厳密には round 関数の処理は四捨五入ではありません。
ただ、通常の使用ではそこまで意識する必要はほぼないかと思います。
詳しく知りたい方は以下の記事をご参照ください。
[Splunk: 端数処理 - 切り上げ、切り下げ、切り捨て、四捨五入](https://qiita.com/frozencatpisces/items/3e0eaa1efcca9e242df8)
:::

### 5. 文字列

###### 5.1. len

引数に指定した文字列の文字数を返す関数です。

基本的な文法は以下の通りです。

 len(文字列)

以下の例では、項目「 event_message 」の値の文字列の文字数を計測し、項目「 msg_len 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log" 
| eval msg_len = len(event_message)
| table msg_len, event_message
```

![スクリーンショット 2022-02-23 20.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/41931ea7-3912-dce0-a45f-9dc5a86c9a10.png "len")

###### 5.2. replace

引数に指定した文字列について、ある文字列を別の文字列で置き換えて返す関数です。
置き換え対象となる文字列は正規表現で指定します。
正規表現については細かく解説しませんが、参考となるページへのリンクを貼っておきます。

[正規表現一覧(英語)](https://docs.splunk.com/Documentation/Splunk/8.2.3/Knowledge/AboutSplunkregularexpressions)

基本的な文法は以下の通りです。

 replace(対象の文字列, 置き換え前の文字列, 置き換え後の文字列)

以下の例では、項目「 event_message 」の値の文字列について、 IP アドレス部分をマスク文字列に置き換えています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log" 
| eval event_message = replace(event_message, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "***.***.***.***")
| table event_message
```

![スクリーンショット 2022-02-23 20.51.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4bfd583b-5106-4451-98cc-a4bf6b29ac52.png "replace")

###### 5.3. substr

引数に指定した文字列から指定した箇所を切り出して返す関数です。
切り出し箇所は「何文字目から切り出すか」と「何文字分切り出すか」の2つで指定します。

基本的な文法は以下の通りです。

 substr(対象の文字列, 何文字目から, 何文字分)

以下の例では、項目「 log_level 」の値の文字列について、先頭から3文字分を切り出して項目「 cut_str 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log" 
| eval cut_str = substr(log_level, 1, 3)
| table cut_str, log_level
```

![スクリーンショット 2022-02-23 20.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6f2df155-58a0-bbae-8084-a884cabd385f.png "subsets")

以上、よく使用する評価関数11個を紹介しました。
次回は、 eval コマンドや where コマンドで使用される演算子を紹介します。

[戻る](https://qiita.com/frozencatpisces/items/fb8dcaf0094abe9e5bd3)