Splunkコマンド集 その1

Splunkを使ってて面白い最大の理由（個人的な意見ですが）がサーチコマンドです。
いろいろなサーチコマンドを組み合わせてグラフィカルに表現できたときは楽しいですよね。

ということで、今回はSplunkサーチコマンドを紹介します。

# はじめに
Splunkには合計約140のサーチコマンドがあります。
とはいえ、実際によく使うのは10〜20くらいのものなので、それらを押さえておけばたいていのことはできます。

# Splunkサーチコマンドについて
ログを検索するだけではなく、整形したり集計するのに使います。
基本的な使い方はLinuxコマンドと同じで、パイプ（|）でつなげて、前のコマンドの出力が次のコマンドの入力になるイメージです。

例えば

```
sourcetype=access_combined | stats count by status | sort - count
```

という具合です。

# コマンド紹介
## stats
統計をとるコマンド。
一番よく使うといっても過言ではないコマンド。
`count`や`avg`、`sum`といった[関数](http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonStatsFunctions)を使って集計します。
`by`句の後には、集計の単位となるフィールドを指定。

例）

```
... | stats avg(score) as avg_score by user_id
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Stats

## chart
こちらも統計をとるもので`stats`と同じように[関数](http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonStatsFunctions)を利用可能。
`stats`との違いは、行・列の表形式にまとめてくれること。その際、`over`句を使います。
`over`が行に、`by`が列になります。

例）

```
sourcetype=apache:access | chart count over useragent by http_status
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Chart

## timechart
時系列に統計をとるコマンド。
[関数](http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonStatsFunctions)を利用可能。
`span=` オプションで時間間隔を指定可能。単位は s（秒） m（分） h（時間） d（日）。

例）

```
sourcetype=apache:access | timechart span=5m count by http_status
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Timechart

## top
頻出値を集計するコマンド。
指定したフィールドの値で件数が多い順に集計してくれる。
`limit=` オプションで表示件数を指定可能。

例）

```
sourcetype=access_combined | top limit=10 useragent
```

同じことを `stats` でやろうとすると、、、

```
sourcetype=access_combined | stats count by useragent | sort - count | head 10
```

こう書かなきゃいけないので、 `top` の方がラクですね。

## rare
topの逆。稀少値を集計。
指定したフィールドの値で件数が少ない順に集計してくれる。

例）

```
sourcetype=access_combined | rare limit=10 useragent
```

## search
検索するコマンド。
一番最初に sourcetype=... とか書いていますが、これは`search`を省略した形になります。
当然、パイプの後に書くこともできます。

例）

```
sourcetype=access_combined | stats count by status | search count>100
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Search

## where
こちらも検索するコマンド。
`search`との違いは、`isnull()`や`isnotnull()`といった[関数](http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonEvalFunctions)を使ったり、フィールド同士の比較ができること。

例）

```
sourcetype=access_combined | stats count by status  | where isnotnull(count)
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Where

## eval
計算するためのコマンド。evaluationの略か。
例えばログの中のバイトをメガバイトに換算したり、[関数](http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/CommonEvalFunctions)を使ってエポック時間を人間が読み取れる形式に変換したりできます。

例）

```
... | eval human_time=strftime(unix_time, "%Y/%m/%d:%H:%M:%S")
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Eval

## rex
ログの中からフィールドを抽出するコマンド。
正規表現を使ってフィールド抽出します。けっこうコツがいるのですが、思い通りに抽出できると気持ちいいです。

例） User-Agentからデバイスを抽出してみた

```
sourcetype=apache:access | rex field=http_user_agent "^[\w\-\/\.]+\s\((?P<device>[^\s\/\;]+)"
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Rex

## regex
`search`の正規表現版。
正規表現にマッチするイベントのみ表示します。

例） IPアドレスが10.xxx.xxx.xxxのログを検索

```
sourcetype=linux_secure | regex src_ip="10\.(\d+\.){2}\d+"
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Regex

## dedup
指定したフィールドの値を重複除外するコマンド。
個人的にはあまり使い道ないです。

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Dedup

## lookup
外部参照のコマンド。
例えば、ログの中にある製品IDから製品名を取得するためにCSVファイルを参照したり、HTTPステータスコードからステータス概要をCSVファイル参照したりするときなんかに使います。

例）

```
... | lookup products.csv product_id OUTPUT product_name price
```

http://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Lookup

# 最後に
というわけで、ざっくり基本的なコマンドを紹介しました。
まだまだ使えるコマンドはあるので、その2以降で紹介します。

Splunk使う上では自分がほしい出力に向けてコマンドを使いこなすことが大事なので、いろいろ知っておいて損はないです。
コマンド覚えるの大変、とか、とっつきづらい、という感想を持つかもしれませんが、慣れてくれば簡単に使いこなすことができるようになります。
そうなると楽しいですよね。

# リンク集
Splunkコマンド集 その2
http://qiita.com/kikeyama/items/4d5cae888020c247ae3c