Splunk: Splunk入門(SPL編 5/6) - 演算子一覧


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

### 0. 前置き

 SPL の評価コマンド( eval , where 等)では評価関数の他に、いくつかの演算子も使用されます。
今回は、これらの演算子について紹介します。

### 1. 数値計算

 SPL には、数値を計算するのに使用する演算子がいくつかあります。
使用できる演算子は以下の通りです。

* 足し算：+ (プラス)
* 引き算：- (マイナス)
* 掛け算：* (アスタリスク)
* 割り算：/ (スラッシュ)
* 割り算の余り：% (パーセント)

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval ad = kb + 1,
       sb = kb - 1,
       ml = kb * 2,
       dv = kb / 3,
       rm = kb % 3
| table kb, ad, sb, ml, dv, rm
```

![スクリーンショット 2022-02-27 16.48.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c14e6d17-0503-e864-bce4-55ae45bc90cd.png "数値計算")

### 2. 文字列結合

 SPL で2つ以上の文字列をつなげたい場合は、演算子「.」(ドット)を使用します。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval str_d_str = index . index,
       int_d_str = kbps  . index,
       str_d_int = index . kbps,
       int_d_int = kbps  . kbps
| table index, kbps, str_d_str, int_d_str, str_d_int, int_d_int
```

![スクリーンショット 2022-02-27 21.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3241d2f3-ee4a-ee22-9cdf-05a63197548f.png "文字列結合")

:::note info
一応、「+」(プラス)でも文字列の結合は可能です。
ただ、「+」だと数値が絡んだ場合に足し算として解釈される場合があるため、「.」を使用するようにしたほうがよいです。
:::

### 3. 数値比較

2つの数値を比較する場合も、演算子を使用します。
これらの演算子はほとんどの場合、 if 関数や case 関数の条件の作成に使用されます。
使用できる演算子は以下の通りです。

* A >  B : A が B より大きい、 A と B が同じ場合を含まない
* A >= B : A が B より大きい、 A と B が同じ場合を含む
* A <  B : A が B より小さい、 A と B が同じ場合を含まない
* A <= B : A が B より小さい、 A と B が同じ場合を含む
* A =  B : A が B と同じ
* A == B : A が B と同じ
* A != B : A が B と異なる

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval gt = if(kbps >  1, "OK", ""),
       ge = if(kbps >= 1, "OK", ""),
       lt = if(kbps <  1, "OK", ""),
       le = if(kbps <= 1, "OK", ""),
       eq = if(kbps =  1, "OK", ""),
       ee = if(kbps == 1, "OK", ""),
       ne = if(kbps != 1, "OK", "")
| table kbps, gt, ge, lt, le, eq, ee, ne
```

![スクリーンショット 2022-02-27 20.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4cf509be-2473-1233-035d-a410fc8bb34e.png "数値比較")

### 4. 文字列比較

2つの文字列を比較する場合は、数値比較の場合とほぼ同じ演算子が使用できます。
使用できる演算子は以下の通りです。

* A =  B : A が B と同じ
* A == B : A が B と同じ
* A != B : A が B と異なる

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval eq = if(series =  "_internal", "OK", ""),
       ee = if(series == "_internal", "OK", ""),
       ne = if(series != "_internal", "OK", "")
| table series, eq, ee, ne
```

![スクリーンショット 2022-02-27 21.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8382126d-ec33-8cc7-7cda-74818cfcd943.png "文字列比較")

### 5. 条件操作

複数の条件を結合したり、条件を反転させたりする場合は以下のような演算子が使用できます。

* A AND B : A と B の両方が正しい
* A OR  B : A と B のどちらか片方、または両方が正しい
* A XOR B : A と B のどちらか片方だけが正しい
* NOT A   : A が正しくない

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval a = if(ev > 100 AND kbps > 1, "OK", ""),
       o = if(ev > 100 OR  kbps > 1, "OK", ""),
       x = if(ev > 100 XOR kbps > 1, "OK", ""),
       n = if(NOT ev > 100,          "OK", "")
| table kbps, ev, a, o, x, n
```

![スクリーンショット 2022-02-27 20.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/877f75cd-1eb5-274a-482e-9e6afb1374d1.png "条件操作")

### 6. ワイルドカード

文字列の比較の際にワイルドカードを使用したい場合は、「文字列 LIKE ワイルドカード条件」と書くことで実現することができます。
ワイルドカードとして使用できる文字は次の通りです。
 search コマンド等で使用される一般的なワイルドカードとは異なる指定となるので注意しましょう。

* % : 0文字以上の何らかの文字列
* _ : 何らかの1文字

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval l1 = if(series LIKE "%int%", "OK", ""),
       l2 = if(series LIKE "________", "OK", "")
| table series, l1, l2
```

![スクリーンショット 2022-02-27 21.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1fae3597-6bd2-2b06-b20e-9ad0266208ed.png "ワイルドカード")

### 7. 括弧と演算子の処理順

演算子には処理の順番があります。
数値計算の場合、掛け算や割り算は足し算、引き算より先に処理されますし、条件操作の場合 NOT は AND や OR より優先的に解釈されます。
ただ、このような順番で演算子を処理したくない場合もあります。
そのような場合は、「()」(丸括弧)を使うことで処理の順番を変えることができます。
「()」が存在する場合、「()」の中は「()」の外より先に処理されます。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval c1 =  kb + 1  * 2,
       c2 = (kb + 1) * 2
| table kb, c1, c2
```

![スクリーンショット 2022-02-27 21.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8ff99901-1e7f-ec55-4242-dea53faa3d4e.png "数値計算の順番")

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval i1 = if(NOT  ev > 100 AND kbps > 1, "OK", ""),
       i2 = if(NOT (ev > 100 AND kbps > 1), "OK", "")
| table kbps, ev, a, o, x, n
```

![スクリーンショット 2022-02-27 21.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/acf44ee9-379a-3f89-0777-52e40db158ab.png "条件処理の順番")

:::note info
処理が複雑となる場合は、順番を変えない場合も「()」を入れることで、処理の順番を明示して SPL 文を読みやすくできることがあります。
:::

以上、 SPL で使用できる演算子を紹介しました。
次回は、 SPL 文の実行結果画面でできることについて紹介します。

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