Splunk: 文字列操作 - 結合、切り出し、置き換え、削除

しばしば必要となるのでメモ。

###### 実施環境： Splunk Free 8.2.2

###### 文字列の結合

文字列同士を結合する場合は、単純に「プラス記号(+)」で繋げれば結合できます。

```Splunk:Splunk
| makeresults count=1
| eval STR1 = "fg"
| eval STR2 = "hi"
| eval STR3 = "abc" + "de" + STR1 + STR2 + "jk" + "lmn"
```

![スクリーンショット 2022-01-04 21.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/bd597504-66e6-1b48-fe44-a8d5bb99e1ec.png "plus")

「プラス記号(+)」の代わりに、「ドット(.)」を使用しても結合できます。

```Splunk:Splunk
| makeresults count=1
| eval STR1 = "fg"
| eval STR2 = "hi"
| eval STR3 = "abc" . "de" . STR1 . STR2 . "jk" . "lmn"
```

![スクリーンショット 2022-01-04 21.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4f5a90c2-68bc-442a-ed40-0b05ca49667a.png "dot")

数値を文字列として結合する場合も、同様に結合できます。
ただし、その場合は「ドット(.)」を用いて結合する必要があります。
「プラス記号(+)」を用いて結合した場合、数値同士なら通常の足し算として解釈されてしまいますし、数値と文字列ならエラーとなります。

```Splunk:Splunk
| makeresults count=1
| eval STR1 = "fg"
| eval NUM1 = 34
| eval STR2 = 12 . NUM1 . 5
| eval NUM2 = 12 + NUM1 + 5
| eval STR3 = "abc" . 12 . STR1 . NUM1 . 5 . "lmn"
```

![スクリーンショット 2022-01-04 21.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/57865748-4142-466c-052c-77e61a989b8f.png "number")

###### 文字列の切り出し

文字列を切り出すには、 eval コマンドの substr 関数を使用します。
引数は、それぞれ次のように指定します。

* 先頭N文字目以降 : substr(文字列,N)
* 末尾N文字目以降 : substr(文字列,-N)
* 先頭N文字目以降M文字分 : substr(文字列,N,M)
* 末尾N文字目以降M文字分 : substr(文字列,-N,M)

```Splunk:Splunk
| makeresults count=1
| eval STR0 = "abcdefghijklmn"
| eval STR1 = substr(STR0, 5),
       STR2 = substr(STR0, -5),
       STR3 = substr(STR0, 5, 3),
       STR4 = substr(STR0, -5, 3)
```

![スクリーンショット 2022-01-04 21.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f3603150-60f7-fd30-167d-71761efe9e49.png "substr1")

うまく引数を指定したり、文字数を取得する len 関数と組み合わせることで、以下のような切り出し方も可能となります。

* 先頭N文字目以前 : substr(文字列,1,N)
* 末尾N文字目以前 : substr(文字列,1,len(文字列)-(N-1))
* 先頭N文字目以前M文字分 : substr(文字列,N-(M-1),M)
* 末尾N文字目以前M文字分 : substr(文字列,len(文字列)-(N+M-1),M)

```Splunk:Splunk
| makeresults count=1
| eval STR0 = "abcdefghijklmn"
| eval STR1 = substr(STR0, 1, 5),
       STR2 = substr(STR0, 1, len(STR0) - (5 - 1)),
       STR3 = substr(STR0, 5 - (3 - 1), 3),
       STR4 = substr(STR0, len(STR0) - (5 - 1) - (3 - 1), 3)
```

![スクリーンショット 2022-01-04 22.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7cf0f8d9-6a05-4121-589e-7c8fa7f59e90.png "substr2")

###### 文字列の置き換えと削除

文字列を置き換えるには、 eval コマンドの replace 関数を使用します。
引数は次のように指定します。

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

```Splunk:Splunk
| makeresults count=1
| eval STR0 = "abcdefgabcdefg"
| eval STR1 = replace(STR0, "abc", "XXXXX")
```

![スクリーンショット 2022-01-04 22.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d71e30d8-f624-c1f0-55c2-1a83f7758966.png "replace")

置き換え後の文字列を空文字にすれば、文字列の削除としても使用できます。

```Splunk:Splunk
| makeresults count=1
| eval STR0 = "abcdefgabcdefg"
| eval STR1 = replace(STR0, "abc", "")
```

![スクリーンショット 2022-01-04 22.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/bd16d772-30af-c951-815b-afa168407512.png "replace_empty")

なお、この replace 関数には正規表現が適用されます。
通常のアルファベットや数字程度なら気にする必要はありませんが、記号が含まれる場合は適宜「バックスラッシュ(\\)」でエスケープしないと思わぬ動作を起こす場合があるので注意が必要です。
例えば以下の例では、「a+」が「aという文字の1文字以上の繰り返し」として解釈されてしまっています。

```Splunk:Splunk
| makeresults count=1
| eval STR0 = "aaa+bbb"
| eval STR1 = replace(STR0, "a+", "XXXXX"),
       STR2 = replace(STR0, "a\+", "XXXXX")
```

![スクリーンショット 2022-01-04 22.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/200e557f-0d13-53df-f8ae-b9005c2559d4.png "replace")