TIPS & TRICKS

Splunkで演算子を使って効率アップ | evalコマンドおよびwhereコマンドでINを使う

Splunkからのグッドニュースです。同じフィールド内の異なる値をサーチするのが簡単になりました。

仮に「error_code」というフィールドがあり、その中でコード400、402、404、406だけを見つけるとしましょう。 

同じフィールド内の値のリストをサーチするのに、フィールドと値のペアを何度も入力しなければならないのは、本当に面倒です。しかし、Splunkのバージョン6.6.0より前では、別々のOR条件としてフィールドと値のペアを1つ1つ指定しなければなりませんでした。 

    ...error_code=400 OR error_code=402 OR error_code=404 OR error_code=406...


searchコマンドでINを使う

searchコマンドには大きな改善がいくつか加えられましたが、そのうちの1つがIN演算子です。  IN演算子を使用すれば、フィールドに対して値のリストを指定できます。次の例をご覧ください。

    ... error_code IN (400, 402, 404, 406) | ...


サーチ文字列の最初でsearchコマンドが暗示されているため、指定する必要があるのはフィールド名と値のリストのみです。構文は以下のようにシンプルです。 

    field IN (value1, value2, ...)

注意:IN演算子は大文字で記述する必要があります。

ワイルドカードを値のリストで使用して、似ている値をサーチすることもできます。次の例をご覧ください。 

    ... error_code IN (40*) | ...


このサーチは、イベント内のerror_codeフィールドを調べて、40で始まるコードを持つすべてのイベントを返します。

便利ですね!

searchコマンドでは、この機能は「IN演算子」と呼ばれます。一方、evalコマンドとwhereコマンドでは「IN関数」として実装されます。

evalコマンドおよびwhereコマンドでINを使う

evalコマンドとwhereコマンドでINを使用するには、INをeval関数として使用する必要があります。Splunkのドキュメントでは、「IN関数」と呼ばれています。

また、searchコマンドの場合とは、構文と使い方が若干異なります。

  • IN関数は、リスト内のいずれかの値が、指定されたフィールド内の値と一致したときにTRUEを返します。
  • 文字列値は引用符で囲む必要があります。 
  • ワイルドカード文字を指定して同様の値(HTTPエラーコード、CIDR IPアドレス範囲など)をサーチすることはできません。


サポートされている構文オプションは以下のとおりです。

    ...| eval new_field=if(IN(field,"value1","value2", ...), "value_if_true","value_if_false")
    ...| where field IN("value1","value2", ...)
    ...| where IN(field,"value1","value2", ...)


注意:IN関数は、IN演算子とは異なり、大文字と小文字のどちらでも指定できます。このブログの構文と例では、IN関数をわかりやすく大文字で書いています。

では、比較的単純なwhereコマンドから説明しましょう。

次の例では、whereコマンドを使用して、statusフィールドのいずれかの値がリスト内のいずれかの値と一致した場合にIN=TRUEが返されるようにしています。statusフィールドの値はHTTPステータスコードです。このコードは数値ではなく文字列値であるため、各値を引用符で囲む必要があります。  

    ... | where status IN("400", "401", "403", "404", "406")


この例は、次のようにも記述できます。

    ... | where IN(status,"400", "401", "403", "404", "406")


evalコマンドでのIN関数の使い方は、whereコマンドでの使い方とは異なります。evalコマンドはブール値を受け取れないため、IN関数によって戻されるブール値を処理できる別の関数の中でIN関数を使用する必要があります。

IF関数の最初のパラメーターとしてIN関数を使用する例を見てみましょう。  サーチチュートリアルのデータに含まれているaccess.logファイルを使用します。

次の例では、IN関数をIF関数と一緒に使用してactionフィールドを評価し、続いてstatsコマンドを使用して計算を実行しています。 

    sourcetype=access_combined_wcookie 
    | eval activity=if(IN(action, "addtocart","purchase"),"Purchase Related","Other") 
    | stats count by activity


このサーチでは次のことを行っています。

  • evalコマンドで、activityという名前の新しいフィールドを作成。
  • イベント内のactionフィールドが値addtocartまたはpurchaseを含んでいる場合は、値Purchase Relatedをactivityフィールドに入力。
  • イベント内のactionフィールドにそれ以外の値が含まれている場合は、値Otherをactivityフィールドに入力。
  • statsコマンドが、activityフィールド内の値Purchase RelatedとOtherの数をカウント。 


結果は[Statistics (統計)]タブに表示され、Purchase Relatedアクティビティが発生したイベントの数と、Otherに分類されるアクティビティが発生したイベントの数がわかります。 

結果テーブルができました。これをグラフで表示することもできます。[Visualization (可視化)]タブに切り替えて、グラフの種類を[Pie Chart (円グラフ)]に変更してみましょう。

 

このサーチをダッシュボードパネルやレポートとして保存することもできます。
 


リソース

詳細については、以下のSplunkのドキュメントをご覧ください。

このブログはこちらの英語ブログの翻訳、庄司 大助によるレビューです。

Laura Stewart
Posted by

Laura Stewart

Laura unravels the SPL maze, bringing clarity to the murky. She has been a software instructor, wrote books on Excel, PowerPoint, and Project, and spent some very interesting time working at the Defense Intelligence Agency in DC. Laura is a Principal Technical Writer at Splunk, with a focus on the Splunk SPL documentation.