Splunk: Splunk入門(SPL編 2/6) - よく使用するコマンド11選


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

### 0. 前置き

 SPL では、様々なコマンドが使用できます。
以下の一覧を見ると、非常に多種多様なコマンドがあることがわかります。

[カテゴリ別 SPL コマンド一覧 (英語)](https://docs.splunk.com/Documentation/SplunkCloud/8.2.2107/SearchReference/Commandsbycategory)

ただ、これら全てを1から覚えていくのは非常に大変です。
そこで、よく使用するコマンド11個を私の独断と偏見で絞り込みました。
ひとまずこれらのコマンドを知っておけば、大抵の SPL 文は作れると思います。

### 1. 全ての始まり、searchコマンド

###### 1.1. search

このコマンドは明示的に指定することはほとんどありませんが、ほとんどの SPL 文において基礎となるコマンドです。
検索条件を指定して、その条件に一致したイベントを抽出、表示します。

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

search 項目=値 項目=値 ...

以下の例では、項目「 index 」の値が「 _internal 」かつ項目「 sourcetype 」の値が「 splunkd 」であるイベントを抽出しています。

```Splunk:Splunk
search index="_internal" sourcetype="splunkd"
```

![スクリーンショット 2022-02-15 21.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b795ff6f-9ea7-4140-79bc-f9f2dabfbb7c.png "search")

上記の SPL 文を実行すると、 search コマンドは省略されて表示されます。
以下のように search コマンドを最初から省略して入力しても、結果は変わりません。

```Splunk:Splunk
index="_internal" sourcetype="splunkd"
```

実際のところ、 SPL 文を作成するときほとんどの場合は search コマンドを省略します。
以降の本文でも search コマンドは省略しております。

:::note info
 search コマンドの検索条件には、ワイルドカードも使用可能です。
 「アスタリスク( * )」で任意の文字列を表します。
:::

### 2. これさえあれば大体出来る、超重要コマンド2つ

###### 2.1. stats

 stats コマンドは、 SPL の中核を担う超重要コマンドです。
このコマンドは、複数のデータに対して統計処理を行うコマンドです。
ここでいう統計処理とはデータ全体の傾向を数字で表す処理のことで、例えばデータの個数を数えたり、ある項目の最大値をとったりといった処理があります。
各統計処理は統計関数という関数として提供されており、以下のリンク先にあるように様々な関数があります。
よく使用する統計関数についてはまた別途紹介します。

[ SPL 統計関数一覧 (英語)](https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/CommonStatsFunctions)

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

stats 関数(集計項目), 関数(集計項目), ... BY キー項目, キー項目, ...

出力される表は、以下のような形になります。

| キー項目 | ... | キー項目 | 集計項目 | ... | 集計項目 |
| --- | --- | --- | --- | --- | --- |
| キー値 | ... | キー値 | 集計値 | ... | 集計値 |
| ... | ... | ... | ... | ... | ... |
| キー値 | ... | キー値 | 集計値 | ... | 集計値 |

以下の例では、キー項目「 series 」毎の集計項目「 kbps 」の最大値、最小値、平均値を集計しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| stats max(kbps), min(kbps), avg(kbps) BY series
```

![スクリーンショット 2022-02-15 22.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0aed37c3-a268-1aa3-b570-93ccf9b400ae.png "stats")

###### 2.2. eval

 eval コマンドは stats コマンド程ではないですが、こちらも SPL における超重要コマンドです。
このコマンドは、項目の追加や変更を行うコマンドです。
評価関数と呼ばれる関数や各種の演算子を利用することで、例えば文字列を分割したり、数値計算を行ったりといったことができます。
評価関数も、以下のリンク先にあるように多種多様なものがあります。
各演算子および、よく使用する評価関数についてはまた別途紹介します。

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

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

eval 項目=値, 項目=値, ...

以下の例では、「 kbps 」という項目の値を1024で割り、その結果を項目「 mbps 」に代入しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| eval mbps = kbps / 1024
| stats max(mbps), min(mbps), avg(mbps) BY series
```

![スクリーンショット 2022-02-15 22.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e081120f-39a2-8627-b34e-1df5a7bb2035.png "eval")

### 3. 頻繁に使用する、重要コマンド8つ

###### 3.1. where

 where コマンドは search コマンドと同様、検索条件を指定してその条件に合致するイベントを抽出、表示するコマンドです。
ただし、 search コマンドとは異なり、 where コマンドは SPL 文の先頭に持ってくることはできません。
他にも細かい差異がありますが、最大の違いは eval コマンドで使用する評価関数がこのコマンドでも使えるという点です。
これにより、文字列の一部を使って検索したり、数値を計算した結果を比較したりといった複雑な絞り込みが可能です。

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

where 値=値 値=値 ...

以下の例では、「 event_message 」という項目の先頭6文字が「 Socket 」という文字列であるイベントを抽出しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log" 
| where substr(event_message, 1, 6)="Socket"
```

![スクリーンショット 2022-02-15 22.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c53cf652-e39a-acc4-4c13-5392bfc596fd.png "where")

###### 3.2. timechart

 timechart コマンドは stats コマンドとよく似ていますが、こちらは一定時間毎の集計に特化したコマンドです。
基本的な使用方法は stats コマンドとおおよそ同じで、関数も stats コマンドで使用する統計関数がそのまま使えます。

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

timechart span=間隔 関数(集計項目) BY キー項目

出力される表は、以下のような形になります。

| _time | キー値 | ... | キー値 |
| --- | --- | --- | --- |
| 時間 | 集計値 | ... | 集計値 |
| ... | ... | ... | ... |
| 時間 | 集計値 | ... | 集計値 |

以下の例では、1時間間隔でキー項目「 series 」毎の集計項目「 kbps 」の平均値を集計しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| timechart span=1h avg(kbps) BY series
```

![スクリーンショット 2022-02-15 22.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/252b8c10-79dc-38bf-bb27-492e7396f01c.png "timechart")

:::note warn
上記の例では列名の頭に「 VALUE 」という文字列がついていますが、これは列名が「アンダースコア( _ )」で始まる列は非表示となるため、それを防ぐのに自動で付与されるものです。
「アンダースコア( _ )」で始まる列(項目)は基本的にログの内部情報を表し、デフォルトではログの出力日時「 _time 」と元ログ「 _raw 」しか表示されません。
:::

###### 3.3. chart

 chart コマンドも stats コマンドとよく似ていますが、こちらはキー項目を縦横に並べます。
このコマンドの出力形式は通常の表としては少々使いづらいですが、実は後日紹介するグラフ化に適した形となっています。
関数についてはこちらも、 stats コマンドで使用できる統計関数が同じように使用可能です。

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

chart 関数(集計項目) OVER 縦キー項目 BY 横キー項目

出力される表は、以下のような形になります。

| 縦キー項目 | 横キー値 | ... | 横キー値 |
| --- | --- | --- | --- |
| 縦キー値 | 集計値 | ... | 集計値 |
| ... | ... | ... | ... |
| 縦キー値 | 集計値 | ... | 集計値 |

以下の例では、縦キー項目「 ingest_pipe 」毎、横キー項目「 series 」毎の集計項目「 kb 」の合計値を集計しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| chart sum(kb) OVER ingest_pipe BY series
```

![スクリーンショット 2022-03-06 21.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/960bce6b-6cf6-fd6e-c2cc-e3aeaa6647b5.png "chart")

###### 3.4. table

 table コマンドは、集計処理を行わず、データをそのまま表にするコマンドです。
各項目は引数で指定した順に左から並べられ、また指定しなかった項目は表示されません。
そのため、表を作る目的だけでなく、列の並び替え用途でもしばしば使用されます。

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

table 項目, 項目, ...

以下の例では、左から項目「 _time 」、「 log_level 」、「 event_message 」を並べた表を生成しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| table _time, log_level, event_message
```

![スクリーンショット 2022-02-15 22.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e02b1f75-edb2-3cf0-576b-d0c215adcb46.png "table")

###### 3.5. rename

 rename コマンドは、項目名を変更するコマンドです。
処理に直接影響することはありませんが、表の見た目を整えるためによく使用されます。
特に項目名を日本語にしたい場合は特殊な文字によるエラー等を防ぐため、最初から日本語の項目名で処理をするのではなく、 SPL 文の処理中で使用する項目名は英語のまま、最後にこのコマンドを使用して表示だけ日本語にするとよいです。

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

rename 変更前項目名 AS 変更後項目名, 変更前項目名 AS 変更後項目名, ...

以下の例では、項目名「 _time 」を「出力日時」に、項目名「 log_level 」を「ログレベル」に、項目名「 event_message 」を「ログメッセージ」に変更しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| table _time, log_level, event_message
| rename _time AS "出力日時", log_level AS "ログレベル", event_message AS "ログメッセージ"
```

![スクリーンショット 2022-02-15 22.24.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/327d8e8e-c320-9dbe-eb72-d95a09d9f8b8.png "rename")

:::note warn
上記の例では「出力日時」の値が奇妙な数列になっていますが、これは「 _time 」の値が UNIX 時間という形式で格納されているためです。
項目名が「 _time 」なら Splunk 側で自動的に値を見やすい形にしてくれますが、項目名を変更した場合などは後日紹介する strftime という評価関数等で適切な形式に変換する必要があります。
:::

###### 3.6. sort

 sort コマンドは、データを並べ替えるコマンドです。
引数に指定した項目の値をもとに、並び替えを実施します。
結果の見た目を整えるのによく使用されますが、データ量が多いと加速度的に処理が重くなるため、無闇に使うことは避けた方がよいです。

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

sort 項目, 項目, ...

なお、 sort の並べ替えの順番のデフォルトは昇順(小さい値が先)です。
降順(大きい値が先)にしたい場合は、以下の例のように「マイナス(-)」を項目名の前に付与する必要があります。

以下の例では、項目「 log_level 」の値について並び替えを実施しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/metrics.log" group="per_index_thruput"
| stats max(kbps) BY series
| sort - max(kbps)
```

![スクリーンショット 2022-02-15 22.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ac239daf-d2d3-3555-4adb-b0105f564499.png "sort")

:::note warn
「 sort 」コマンドは、デフォルトで上位1万件しか結果を返しません。
1万件より多くのデータを表示したい場合は、 sort コマンドに「 limit=0 」というオプションを付与すると全て表示されるようになります。
:::

###### 3.7. head

 head コマンドは、データの最初の何件かのみを切り出すコマンドです。
引数に指定した項目の値をもとに、切り出しを実施します。
「最新何件のデータ」や「上位何件のデータ」といったものを取得するために、 sort のようなデータを順番に並べるコマンドと同時に用いられることが多いです。

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

head 件数

以下の例では、先頭10件のデータのみを切り出しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| table _time, log_level, event_message
| head 10
```

![スクリーンショット 2022-02-15 22.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3ab93c0e-2c36-67d3-0239-835c1db7726c.png "head")

###### 3.8. fields

 fields コマンドは、項目を削除するコマンドです。
指定した項目のみが残り、後の処理で使用できます。
 table コマンドでも同じようなことが可能ですが、項目の削除だけが目的ならこちらの方が性能的に好ましいです。

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

fields 項目, 項目, ...

以下の例では、項目「 _time 」と「 log_level 」のみを残し、それ以外の項目は削除しています。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| stats count BY log_level
| fields log_level
```

![スクリーンショット 2022-02-15 22.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/fb0c8f98-fef7-63fc-980f-bcbc667f0ecf.png "fields")

以上、よく使用するコマンド11個を紹介しました。
次回は、 stats コマンドや chart コマンドで使用される統計関数を紹介します。

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