覚えるのは10個だけ SplunkSPLコマンド出る順

こんにちは。
この記事では、Splunkでよく使うSPLを出る順で10個紹介します。
なぜ10個かというと、Splunkでよく使うコマンドがだいたいそれくらいだからです。
以下の記事の続きですが、単体で読んでも大丈夫です。
canada-lemon.hatenablog.com

備考

  • ここではコマンドの概要のみ記載し、細かい説明は別の記事で書きます
  • 簡単なSPLの例を掲載しますが、これはSplunkがデフォルトで出力するしているログを使うので、Splunkをインストールしてさえいればすぐ実行できます
  • SPLの構文例は簡略化して記載しています(正確に厳密に書こうとするとややこしくなるので)
  • 記事内で「フィールド」という単語を使っていますが、表でいうところの「列名」と解釈してください

  • 1. table

  • 2. rename
  • 3. eval
  • 4. stats
  • 5. eventstats
  • 6. sort
  • 7. timechart
  • 8. lookup
  • 9. where
  • 10. search

1. table

フィールド名を指定して表を作るコマンドです。

  • 使用例
    • 検索結果を表形式で見る
    • 既存の表の列の順番を入れ替える
    • 既存の表の列を一部削除する
  • 補足
    • フィールドの区切りはスペースでもカンマでもOK

構文例
| table <フィールド名>

以下のSPL例では、ログの時間、ホスト名、生ログを表形式で表示しています。

SPL例

index=_internal
| table _time host _raw

canada-lemon.hatenablog.com

2. rename

フィールド名を変更するコマンドです。

  • 使用例
    • フィールド名を英語から日本語に翻訳する
  • 補足
    • _timeをリネームするとUNIX時間に変換される

構文例
| rename <リネーム前のフィールド名> as <リネーム後のフィールド名>

以下のSPL例では、ログの時間、ホスト名、生ログを表形式で表示した後、ホスト名を示すフィールドをリネームしています。

SPL例

index=_internal 
| table _time host _raw
| rename host as "ホスト名"

tableもrenameもフィールド名にワイルドカードを使えますが、基本的には1つ1つ明示的に書くほうがミスが起きにくく、後からメンテしやすいです。

canada-lemon.hatenablog.com

3. eval

新しくフィールドを定義するコマンドです。

  • 使用例
    • 2つのフィールドの数字を足し算する
    • フィールドに特定の文字列を追加する
  • 補足
    • Python等のプログラミング言語で、(変数名)=(何かしらの処理)とやるのにイメージ近い
    • 固定の文字列を使うときはダブルクオーテーションで囲う

構文例
| eval <新しく定義するフィールド名> = (何らかの加工処理)

「何らかの加工処理」は大きく分けて文字列の結合、数字の計算、IF構文などです。
以下のSPL例では、ホスト名のフィールドに文字を結合しています。

SPL例

index=_internal
| eval host_name = "ホスト名は" + host + "です"
| table _time host host_name

canada-lemon.hatenablog.com

4. stats

ログの統計情報を集計するコマンドです。

  • 使用例
    • ソースタイプ(ログの種類)ごとのログの件数を計算する
  • 補足
    • 集計処理はログの量が増えるについて重くなる

構文例
| stats (何らかの集計処理) by <集計単位のフィールド名>

「何らかの集計処理」は、簡単に言えば統計情報の計算です。
以下のSPL例では、countでソースタイプ別のログ件数を集計しています。

SPL例

index=_internal 
| stats count by sourcetype

canada-lemon.hatenablog.com

5. eventstats

statsのように集計処理を行い、evalのようにフィールドを新しく定義できる、両者の中間みたいなコマンドです。

  • 使用例
    • クラスごとに試験の平均点を計算し、生徒の点数がクラスの平均以上か未満かを表示する
  • 補足
    • statsと同様、検索結果のログ全体が集計対象となるのでログの量によって処理が重くなる

構文例
| eventstats (何らかの集計処理) as <新しく定義するフィールド名> by <集計単位のフィールド名>

以下のSPL例では、アクセスログの平均バイト数をeventstatsで計算し、evalのIF構文で平均以上か未満かを判定しています。

SPL例

index=_internal sourcetype=splunkd_access 
| eventstats avg(bytes) as avgBytes 
| eval judge_avg = if(bytes>=avgBytes,"平均以上","平均未満") 
| table _time bytes avgBytes judge_avg

canada-lemon.hatenablog.com

6. sort

フィールドを指定してソートするコマンドです。

  • 使用例
    • ログの件数をソースタイプごとに集計し、件数が多い順に表示する
  • 補足
    • デフォルトは昇順、フィールド名の前に"-"をつけると降順となる
    • デフォルトはソート件数に制限があり、無制限にするにはsortの後に"0"をつける

構文例
| sort <フィールド名>

以下のSPL例では、ソースタイプ別にログの件数を集計し、降順(件数が多い順)に並び替えています。

SPL例

index=_internal 
| stats count by sourcetype
| sort 0 -count

canada-lemon.hatenablog.com

7. timechart

statsを時系列の処理に特化させたコマンドです。

  • 使用例
    • 1日のログ件数の推移を1分単位で表示する
  • 補足
    • 行数が5万行を超えると上手く表示されなくなる

構文例
| timechart span=(時間の単位) (集計処理) by <フィールド名>

以下のSPL例では、ソースタイプ別のログ件数の推移を、1分単位で時系列順に示しています。

SPL例

index=_internal
| timechart span=1m count by sourcetype

canada-lemon.hatenablog.com

8. lookup

ExcelのLOOKUPみたいなことをやってくれるコマンドです。

  • 使用例
    • 商品IDからその商品名や価格を知りたいとき
  • 補足
    • ルックアップに使うファイルに欠損値がないよう気をつける

構文例
| lookup (ルックアップの名前) <元のログのフィールド名> OUTPUT <新しく増やすフィールド名>

このコマンドを使うには前準備が必要なので、本記事でのSPL例は割愛いたします。

canada-lemon.hatenablog.com

9. where

条件を設定してログを絞り込むコマンドです。

  • 使用例
    • 特定のフィールドが欠損しているログを探すとき
  • 補足

構文例
| where (条件)

以下のSPL例では、「statusフィールドを持たない」を条件としてログを絞り込んでいます。

SPL例

index=_internal
| where isnull(status)

canada-lemon.hatenablog.com

ログを検索するというある意味もっとも重要なコマンドだけど、最初の内は意識して使わないので、優先度を下げて10番目にしました。

  • 使用例
    • ログを検索する(明示的には書かない)
    • stats等で作成した表に対し、その中身を検索する(明示的に書く)
  • 補足
    • SPLの先頭で使うときは書く必要がないけど、それ以外の場面で忘れると怒られる

構文例
| search (検索内容)

以下のSPL例では、ステータスコードが200のログを検索しています。

SPL例

index=_internal status=200

canada-lemon.hatenablog.com

9割ほど書いてから、同コンセプトの記事を既に書いている方がいらっしゃるのを知りました。
Splunk: Splunk入門(SPL編 2/6) - よく使用するコマンド11選 - Qiita
掲載しているコマンドの数もラインナップもほぼ同じで、流石にこのあたりはユーザー間の共通認識というところでしょうか。

ここまで読んでいただき、ありがとうございました。

Splunk頻出SPLシリーズ