データを並べ替えろ!|Splunk search コマンドでカスタムソートオーダー

Tips & Tricks Laura Stewart

デフォルトではSplunkの検索結果は辞書順にソートされています..辞書順ってなに!?

辞書順の説明

Splunk のソフトウェアでは、辞書順のソートはほとんどの場合、ASCII のスーパーセットである UTF-8 エンコーディングに基づいて行われます。

これは実際にはどういう意味なのでしょうか。

SplunkのUIであるSplunk Webや、一部の検索コマンドでは昇順、降順を指定できます。

コマンドが辞書順を使用しているかどうかは、それらのコマンドのドキュメントの「Usage」セクションを見ればわかります。辞書順を使用する最も一般的なコマンドは searchsorttimechartです。

これらのコマンドのメリットについてはこちらからご確認ください。

カスタムのソート順を使いたい場合はどうすればいいのでしょうか?

固有のフィールド値の小さなセットがあれば、カスタムソート順を作成するのは簡単です。 "小さい”というのは主観的なもので、どの程度の入力をしたいかによります。”小さい”というのは、15個以下の値を意味します。一例としては、12ヶ月(年の1月から12月、このブログの例ではこれを使用しています)があります。

ユニークなフィールド値で大きなセットを持っている場合は、値が収まるカテゴリを特定できれば、カスタムのソート順序を作成することができます。 例えば、高、中、低のようなカテゴリに収まる数値のセットでソートすることができます。

一つの例として、カスタム・ソート順を作成する手順として、以下の方法があります:

  1. Evalコマンドを使用して新しいフィールドを作成します。例えば、sort_field というフィールドを作成します。
  2. case関数を使用して、それぞれのユニークな値な番号を割り当て、それらの値をsort_fieldに配置します。
  3. sortコマンドを使用して、sort_field内の数値に基づいて結果をソートします。

以下に例を示します。

検索結果を status フィールドの値でソートしたいとします。 status フィールドの値は、Critical、High、Medium、および Low です。

これらの値を辞書順でソートした場合、値はアルファベット順にソートされます。昇順にソートすると、Critical、High、Low、および Midiumになります。これは通常皆さんが望む順序ではありません。Low が最後にくることが望まれます。

各ステータス・レベルに数値を割り当てることで、カスタム・ソート順を作成します。ソートされたリストで最初に表示するレベルに 1 を割り当てます。次に、次に表示したいレベルに 2 を割り当てます。

以下は、検索に追加する eval コマンドです。

... | eval sort_field=case(status="critical",1,     
      status="high",2, status="medium",3, status="low",4)
    | sort sort_field 

ところで、ソートフィールドの名前は何でも構いません。この例では、sort_fieldとしています。

他の例

別の例を紹介します。date_monthフィールドを、7月から始まって翌年の6月で終わる会計年度順でソートしたいとします。sort_fieldを作成し、月を特定し、各月にランキング値を割り当てます。

別の例

これはもう少し入力が必要です。例えば、以下のようになります。

... | eval sort_field=case(date_month="july",1,
      date_month="august",2, date_month="september",3, 
      date_month="october",4, date_month="november",5, 
      date_month="december",6, date_month="january",7,
      date_month="february",8, date_month="march",9, 
      date_month="april",10, date_month="may",11, date_month="june",12)
    | sort sort_field 

もし、sort_field を表示させたくない場合、fields コマンドを、サーチの最後に利用することで、対処できます。 fields コマンドと、非表示にしたいフィールド名の前に - (マイナス)をつけることで、結果からフィールドを除外できます。

... | fields - sort_field

大文字小文字の扱い

フィールドの値に、大文字小文字が混在する場合がある場合、eval コマンドと upper もしくは lower 関数を利用して、大文字か小文字に変換して対応する必要があります。

次の例では、date_monthフィールドで lower 関数を使用し、結果を month という新しいフィールドに配置しています。次に eval コマンドと case 関数を使用して、カスタム・ソート順を作成しています。

... | eval month=lower(date_month)  
    | eval sort_field=case(month="july",1, month="august",2, month="september",3, 
       month="october",4, month="november",5, month="december",6, month="january",7, 
       month="february",8, month="march",9, month="april",10, month="may",11, month="june",12)
    | sort sort_field 
... | fields - sort_field

NOTE: 日付を並べ替える場合、UNIX 時間(1970/1/1 0:0:0 からの秒数)であることに注意してください。_time フィールドに格納されている値は、UNIX時間であるためソートは問題なく可能です。独自の日付フィールドを利用している場合は、strptime コマンドを利用して、UNIX時間に変換してから、ソートするようにします。

カテゴリの作成

並べ替えたいフィールドに一意の値が多数ある場合は、case関数を使用して、値の範囲に基づいてカテゴリを作成することができます。 最初の例では、検索結果を Critical、High、Medium、Low の値でソートしています。この例では、status と呼ばれるフィールドの値を使用しています。しかし、値を分類するフィールドがない場合はどうでしょうか。 Splunk は、これらを作ることができます。

例えば、data_field というフィールドに 0 から 100 までの値を含むデータがあるとします。この表に示されている値の範囲と関連するステータスレベルを作成したいとします。

Values
Status Level
0-34
Low
35-69
Medium
70-89
High
90-100
Critical

値の範囲ごとにカテゴリを作成するには、これを検索に追加します。

... | eval status=case(data_field>=90, "Critical", data_field>=70 AND data_field<=89, "High",
       data_field>=35 AND data_field<=69, "Medium",data_field>=34 AND data_field<=0, "Low")

次に、作成した status フィールドに基づいたカスタムの並べ替えができるように、今までの例同様 case 関数を利用して定義し、sort コマンドで並べ替えを行います。

... | eval sort_field=case(status="Critical",1, status="High",2, status="Medium",3, status="Low",4)
    | sort sort_field 

最後まで読んで頂いてありがとうございます。

SPL it like you mean it! Happy Splunking!

リソース・資料

日付のソート

その他の参照情報について

*このブログはこちらの英語ブログの翻訳です。

ブログ関連情報毎月、Splunkブログの更新情報をメールでお届けします。ぜひMonthly Digest をこちらからご登録ください!

関連記事

Splunkの日本語版トレーニング - Splunk Educationで学び、使いこなそう!
Tips
4 分程度

Splunkの日本語版トレーニング - Splunk Educationで学び、使いこなそう!

Splunk学習コンテンツの日本語化が進んでいます。Splunkを勉強するにあたり、初中級難易度の認定資格やトレーニングコースがどれに該当するのか、おすすめの学習方法などをご紹介します。
Splunkに燃料を与える:Universal Forwarderによるリアルタイムでのデータ取込方法とインストール (パート1)
Tips
6 分程度

Splunkに燃料を与える:Universal Forwarderによるリアルタイムでのデータ取込方法とインストール (パート1)

Splunkの使用する際に、「どのようにログ(データ)を取り込むのかわからない」とお悩みの方向け。Splunk Universal Forwarder(ユニバーサル フォワーダー)を使用した様々なデータ取り込み方法・設定と、Universal Forwarderのインストール方法をご紹介します。
Splunkで演算子を使って効率アップ | evalコマンドおよびwhereコマンドでINを使う
Tips
4 分程度

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

Splunk製品でIN演算子を使用すれば、フィールドに対して値のリストを指定できます。同じフィールド内の異なる値をサーチするのが簡単になりました。SplunkサーチコマンドのevalコマンドおよびwhereコマンドでINを使うTipsをお読みください。