🐨コアラでもわかるSplunkシリーズ　CSVを扱う

やあ、みんな　:koala:だよ
いつもの作者は「記事の内容がよくわからない」と言われて凹んだので、僕が呼ばれたよ
よろしくね。 
今回は「CSVを読み込んで、出力するのがよくわからない」というリクエストを受けたので説明するよ。
Macosxで動かしているので、WindowsやLinuxの人はディレクトリやフォルダを読み替えてね。

#SplunkでCSVを扱うコマンドについて
:koala: SplunkでCSVを扱うコマンドは何個かあるよ

- [inputlookup](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Inputlookup)
- [inputcsv](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Inputcsv)
- [outputlookup](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Outputlookup)
- [outputcsv](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Inputcsv)

:koala:最初の２つが読み込みで、あとの２つが出力するコマンドになるよ。リンク先にいくとSplunk>Docsになっているから暇があったら読んでね。

#今回使うもの
<img width="1392" alt="スクリーンショット 2020-05-11 20.31.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/3592e332-a36f-139b-ab44-b1e2c997f313.png">
:koala:今回は、この起動した時のそのままの画面を使用するよ。
真っ黒い背景にSPL（エス・ピー・エル）を書いていくので、それを<font color="red">**赤枠**</font>の中、`ここにサーチを入力．．．`と書いているところにコピー＆ペーストしてもらって、🔍をクリックすると動くよ

:koala:時間:`過去２４時間`やモード:`スマートモード`は変更しないでね
#単純にCSVを扱う
:koala:まず最初はCSVを作って、そのCSVを入力してみよう.
使うコマンドは`outputcsv`と`inputcsv`

##outputcsvを使ってCSVを出力する
:koala:まずは、CSVがないと始まらないので、作ってみよう

```sql:timechart_sourcetype_top5.spl
| tstats count where index=_internal by _time span=1h sourcetype
| timechart count by sourcetype where sum in top5
| outputcsv result.csv
```
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/959a7b5f-39ab-5b39-570d-1f831f3cd686.png)
:koala:<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/457af5db-56a4-cb85-fd89-4e77dbf02b44.png" width=100px>に注目。
Splunkからお知らせがあるみたいだよ。クリックして開いてみよう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/62bbe0db-2208-2e4d-56b7-243dc8ed0cc4.png" width=200px> _Results written to file \`/Application/Splunk/var/run/splunk/csv/result.csv\`_

:koala:結果を_/Application/Splunk/var/run/splunk/csv/result.csv_に出力した
とでているね。
**:koala:Splunkがファイルを作ったりした時は、このようにジョブに表示をしてくれるので、確かめよう**

##inputcsvを使ってCSVを読み込む
:koala:それじゃ先ほど作ったCSVを読み込んでみよう。
いったんSPLを全部消してね。

```sql:read_csv.spl
| inputcsv result.csv
```
![inputcsv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/b3147023-3ae0-43c6-000a-6a61b511aa7b.png)
:koala:読み込めたけど、列の順番がバラバラだ。**Splunkの列の順番はアルファベット順になってしまうよ**
:koala:`table`コマンドで並び替えてね。

##少しまとめ
:koala:`outputcsv`と`inputcsv`を使ってCSVを出力して読み込んでみたよ。
でも、入出力する先が固定ということと、単純にCSVを扱うだけのコマンドなので、あんまり使い勝手がよくないよね。

#検索した結果と合わせてみる。
:koala:やっぱりCSVを検索した結果と比較とかしてみたいよね。
そうなると`lookup`コマンドが使いたいから`inputlookup`や`outputlookup`の出番だね。

##outputlookupを使ってCSVを作る
:koala:今回は検索したフィールドと比較とかするのでこんなCSVを作ってみたよ

```sql:sourcetype_text.spl
index=_internal
| top 5 sourcetype
| fields sourcetype
| streamstats current=f count
| eval text=mvindex(split("Oh,Yeah,Good,Bad,even",","),count)
| table sourcetype text
| outputlookup soucetype_output.csv
```
![outputlookup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/240f397b-ad47-cd68-dfb0-beb5baab013d.png)

:koala:<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/457af5db-56a4-cb85-fd89-4e77dbf02b44.png" width=100px>が光っているね。確かめてみよう。
:koala:今回の場所はどこだったかな？
*Results written to file \`/Application/Splunk/etc/apps/search/lookups/sourcetype_output.csv\`*

**:koala:`outputlookup`を使うと、Appの下の`lookups`ディレクトリに出力されるんだ**
だから、Appを作って別にしてあげると、管理とかが楽になるよ。試してみてね。

:koala:Appの作り方は[クラスメソッドの江口さん](https://dev.classmethod.jp/articles/how-to-create-splunk-app/)の記事か[本](https://www.amazon.co.jp/dp/B07P3HMCVG)をみてね。

##inputlookupを使ってCSVを確認する
```sql:check_soucetype_output.csv
| inputlookup soucetype_output.csv
```
:koala:`r`を抜かしているのに気づいたけど、そのままいくね。

|sourcetype|text|
|:-:|:-:|
splunkd|Oh
splunkd_ui_access|Yeah
splunkd_access|Good
splunk_web_service|Bad
splunk_web_access|even
:koala:結果を確認したところで、使ってみよう
##inputlookupを使って、CSVの中のフィールドを出力する。
```sql:inputlookup_sample.spl
| tstats count as Counts where index=_internal by sourcetype
| inputlookup append=t soucetype_output.csv
| selfjoin sourcetype
```
:koala:<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/457af5db-56a4-cb85-fd89-4e77dbf02b44.png" width=100px>今回もSplunkからお知らせがあるみたいだよ。クリックして開いてみようね。

今回の結果は

sourcetype|	Counts|	text
|:-:|:-:|:-:|
splunk_web_access|	53|	even
splunk_web_service|	70|	Bad
splunkd|	426106|	Oh
splunkd_access|	1268|	Good
splunkd_ui_access|	11007|	Yeah

:koala:CSVの`text`フィールドに値がある_sourcetype_だけが残ったね。

いったん消してもらったあと

```sql:inputlookup_sample2.spl
| tstats count as Counts where index=_internal by sourcetype
| inputlookup append=t soucetype_output.csv
```
の結果と比べて欲しいな。

##outlookupを使って、結果を更新する。
:koala:先ほどの`Counts`のある結果を出力してみよう。

```sql:outputlookup_sample.spl
| tstats count as Counts where index=_internal by sourcetype
| inputlookup append=t soucetype_output.csv
| selfjoin sourcetype
| outputlookup soucetype_output.csv
```
:koala:<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/457af5db-56a4-cb85-fd89-4e77dbf02b44.png" width=100px>今回もSplunkからお知らせがあるみたいだよ。クリックして開いてみようね。

:koala:じゃ、確かめてみよう

```sql:check_soucetype_output.csv
| inputlookup soucetype_output.csv
```

| Counts | sourcetype | text |
|--:|:--|:--|
| 53 | splunk_web_access | even |
| 70 | splunk_web_service | Bad |
| 428656 | splunkd | Oh |
| 1294 | splunkd_access | Good |
| 11511 | splunkd_ui_access | Yeah |
:koala:やったー更新されているよ

##outputlookupを使って追記する
:koala:ファイルを作った後、追記していきたいこともあるよね。

```sql:append_csv.spl
|inputlookup soucetype_output.csv
|outputlookup append=t soucetype_output.csv
```

:koala: `outputlookup append=t`で追記に変わるよ。
結果を確認してみると

```sql:check_soucetype_output.csv
| inputlookup soucetype_output.csv
```

| Counts | sourcetype | text |
|--:|:--|:--|
| 53 | splunk_web_access | even |
| 70 | splunk_web_service | Bad |
| 428656 | splunkd | Oh |
| 1294 | splunkd_access | Good |
| 11511 | splunkd_ui_access | Yeah |
| 53 | splunk_web_access | even |
| 70 | splunk_web_service | Bad |
| 428656 | splunkd | Oh |
| 1294 | splunkd_access | Good |
| 11511 | splunkd_ui_access | Yeah |
:koala:きちんと追記されているね。

#まとめ
:koala:今回はCSVを扱う４つのコマンドを使ってみて、どんなコマンドなのか説明してきたよ。
みんなわかったかな？

:koala: lookupについては触れなかったけど、大体CSVと一緒なのでやってみてね。

:koala:じゃ、リクエスト待ってます。　またね〜

-----
:sweat:　こんな感じでいいでしょうか？
https://docs.splunk.com/Documentation/Splunk/latest/Knowledge/ConfigureCSVlookups
ここら辺に触れられなかった