はじめてのSplunk ― 概要から応用までを体系的に学ぶ

5-2 サーチ結果のフィルタリング(eval/where/fillnull)

1. evalで新しいフィールドを作る

evalは、計算や加工の結果を新しいフィールドとして作り出すコマンドです。 既存のフィールドから値を算出したり、文字列を組み立てたりできます。

SPL: バイト数をキロバイトに換算
index=main sourcetype=access_combined_wcookie
| eval bytes_kb = bytes / 1024

文字列の連結には.(ピリオド)を使います。

SPL: ホストとステータスを1つの文字列にまとめる
index=main sourcetype=access_combined_wcookie
| eval label = host . " : " . status

evalは条件分岐にも対応します。 if(条件, 真のときの値, 偽のときの値)と、 複数条件を順に判定するcase(条件1, 値1, 条件2, 値2, ...)が代表的です。

SPL: ステータスコードから区分を作成
index=main sourcetype=access_combined_wcookie
| eval category = case(status >= 500, "Server Error", status >= 400, "Client Error", status >= 200, "OK", true(), "その他")

case()の最後にtrue(), "その他"を置くと、 どの条件にも当てはまらなかったイベントの受け皿になります。

2. whereで条件を絞り込む

whereは、条件に合致するイベントだけを残すフィルタリングコマンドです。 evalで作った計算結果に対して、さらに絞り込みをかけるときによく使います。

SPL: 換算後の値でフィルタ
index=main sourcetype=access_combined_wcookie
| eval bytes_kb = bytes / 1024 | where bytes_kb > 2

3. whereとsearchの違い

イベントを絞り込むコマンドにはsearchもありますが、 whereとの使い分けにはコツがあります。

コマンド 得意なこと
search フィールドと定数の比較(status=500など)。ワイルドカードも使える
where フィールド同士の比較や、eval関数を使った条件判定

たとえば「フィールドbytesの値が別のフィールドotherの値を上回るイベント」のように、 フィールド同士を比べる条件はwhereでしか書けません。

SPL: フィールド同士を比較する
index=main sourcetype=access_combined_wcookie
| where bytes > other

whereではフィールド名を引用符で囲みません。 where status="500"のように書くと"500"は文字列として扱われ、 意図した比較にならないことがあります。数値の比較はwhere status=500とします。

4. fillnullで欠損値を埋める

イベントによっては、特定のフィールドが存在せずnull(欠損)になることがあります。 集計や計算で邪魔になる場合は、fillnullで既定値を埋めておくと扱いやすくなります。 valueオプションで埋める値を指定できます。何も指定しなければ0が入ります。

SPL: null値埋めの例(unknownを代入)
index=main sourcetype=access_combined_wcookie
| fillnull value="unknown" action

5. まとめ

  • evalは計算・文字列連結・if()/case()による条件分岐で新フィールドを作る
  • whereは条件に合うイベントだけを残すフィルタコマンド
  • フィールド同士の比較やeval関数が必要なときはsearchではなくwhereを使う
  • fillnullは欠損値(null)を既定値(既定は0)や指定値で埋める