TIPS & TRICKS

表の行と列を入れ替えるSPL

下記ログ形式で出力されるログに出会い、フィルターや統計処理の方法に悩みましたので、解決策について共有いたします。

time,2023/9/1-00:00,2023/9/1-00:01,2023/9/1-00:02,2023/9/1-00:03,…
send,0,1000,2000,3000,…
receive,0,100,200,300,…
flag,0,1,2,3,…

上記のログは、send、 receive、 flagといった各行に各データポイントの結果がoutputされており、データポイントごとにコンマ区切りで記録されます。

最終的に整形し出力したい表形式は下記です。

表形式

この形式にすることでsend、 recieve、 flagの値をフィルタリングしたり、統計処理することが可能です。

この記事では、次の2つの方法をご紹介します。

i) transposeコマンドを使用して、行と列を入れ替える
ii) rexコマンドを使用してフィールドを抽出し、各イベントごとに整形する

データの準備

いずれの方法もはじめにデータを準備します。

| makeresults
| eval _raw = "time;2023/9/1-00:00;2023/9/1-00:01;2023/9/1-00:02;2023/9/1-00:03;
send;0;1000;2000;3000;
receive;0;100;200;300;
flag;0;1;2;3; "

i) transposeコマンドを使用して、行と列を入れ替える

大まかな流れは次のとおりです。

  • “time”の行をフィールド名として認識させTable化 (multikvコマンド)
  • 行と列を入れ替える (transposeコマンド)

手順は次のとおりです。

  1. multikvコマンドを用いて、_rawフィールドをテーブルに展開します
     multikvコマンドについては公式docをご確認ください。
     “forceheader=”で何行目をフィールド名として認識させるか指定できます。
    multikvコマンド
  2. fieldsコマンドを用い、不要なフィールドを省きます。transposeコマンドを用い、行と列を反転します
     transposeコマンドについては公式docをご確認ください。
    fieldsコマンド
  3. renameコマンドを用いて、列の名称を変更します
    renameコマンド

ii) rexコマンドを使用してフィールドを抽出し、各イベントごとに整形する

手順は次のとおりです。ポイントはmvexpandをするタイミングです。

整形手順

  1. rexコマンドを用いて、各フィールドを抽出します
    rexコマンド
  2. fieldsコマンドを用いて、不要なフィールドを省きます
    fieldsコマンド
  3. splitコマンドを用いて、シングルバリューをマルチバリューにします
     splitコマンドについては公式docをご確認ください。
    splitコマンド
  4. mvzipコマンドを用いて、各フィールドを結合したtemporaryフィールドを作成します
     mvzipコマンドについては公式docをご確認ください。
    mvzipコマンド
  5. Temporaryフィールド以外を省き、mvexpandコマンドを用いて、各行に展開します
     mvexpandコマンドについては公式docをご確認ください。
    fieldsコマンド
  6. rexコマンドを用いて、各フィールドを抽出します
     fieldsコマンドを用いて列を並び替えます
    rexコマンド/fieldsコマンド
  7. 終わりに

    ii)のやり方は少し手間に思えますが、ログの形式によっては柔軟に活用できる方法ですので、このやり方もぜひ覚えてみてください。

多くのお客様の課題を解決できるSplunkの製品に感銘し入社。Global shared serviceチームに所属。製品のデモンストレーション、ワークショップなどSplunkの活用方法について提案、説明を実施。Splunk入社以前は、ラボオートメーションに関するハードウェアの提案を経験。

TAGS
Show All Tags
Show Less Tags