コマンドライン出力に色をつける

# ごあいさつ
全国のtailerの皆さん、こんにちは。突然ですが皆さんはログを追う際どうしていますか？
`tail -f` は言わずと知れたログを追う際に頻繁に使用されるコマンドです。
え？「俺は tailf派だ」ですって？いやいや「俺は `less` からの `F` だから」ですって？
まぁ、そんなことはどうでもいいんです。ログを追っている時「特定のワードに色が付けれたらなぁ」とか思ったりしませんか？`color_echo` を使えば実現可能です。

# color_echoとは？
`color_echo` は出力に色を付ける為のRubyのgemライブラリです。「なんだRubyか…、Ruby書けないからいいや」と諦めるには早い！
Rubyのライブラリですがコマンドラインインターフェースが用意され Rubyをまったく知らない方でもシェルでコマンドを叩くように出力に色を付けることができるのです。

# インストール方法
当然ですがRubyが必要です。Rubyを知らなくても扱えますが中身はRubyできているので。
Rubyのバージョン2以上が必要です。Rubyのインストール方法は今更ここで書かなくもググればいやというほど出てくるので省略します。Rubyと一緒にgemも必要です。
gemを知らない人に解説するとgemはRubyライブラリのパッケージマネージャのようなものです。意識せずともRubyと一緒にインストールされることも多いです。

`color_echo` は gemの公式リポジトリに登録されています。
Rubyとgemが手に入ったら `gem install color_echo` と入力するだけで手に入ります。

作者のGitHub
https://github.com/khotta/color_echo/tree/master/pkg
からgemファイルを落としてきてインストールする手もあります。

rbenv環境で「color_echo: コマンドが見つかりません」ってなるって方は`rbenv rehash`を行ってください。

# 文字色、背景色、テキスト属性を指定する
さて、これで color_echo が入りました。さっそく使ってみましょう。
コマンドラインで以下のように実行します。

```bash
color_echo Hello, color_echo\!\!
```
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/37104/da4302ae-bdca-9c2e-64ed-de311cd021cc.png)



黄色で「Hello, color_echo!!」と表示されたと思います。
文字色、背景色、テキスト属性がそれぞれ選択でき、何も指定をしない場合は文字色が黄色となり出力されます。
今度は文字色を変更してみます。

```bash
color_echo Hello, color_echo\!\! -f cyan
```
![screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/37104/fa2ddaa9-75ff-7850-bc7c-60d3701230f9.png)


文字色がシアンになりました。どんな色が指定できるかは `color_echo -s` で確認できます。
色は全部で256色指定でき、カラーインデックスで指定する場合は `-f index50` のように1〜256の番号を指定します。カラーインデックスのリストは `color_echo -l` で参照することができます。

では続いて背景色を変えてみましょう。背景色を変更するには -bオプションを使います。

```bash
color_echo Hello, color_echo\!\! -f h_white -b red
```
![screenshot3.png](https://qiita-image-store.s3.amazonaws.com/0/37104/355f8f53-1e20-2d83-0b79-a190ce78f2f4.png)


これ以外にもアンダーラインをつけたり点滅させることもできます。テキスト属性を変更するには -tオプションを使います。"blink" を指定すると点滅します。

```bash
color_echo Hello, color_echo\!\! -f h_white -b red -t blink
```

テキスト属性は複数指定が可能でコンマでつなげます。
`-t blink,underscore,bold` はアンダーラインがつき 点滅し 太字になります。

```bash
color_echo "lessでも色が付きます" -f index150 -t underscore | less
```

lessでエスケープシーケンスが解釈されない場合は、less -R と入力してみてください。-R は制御文字を表示させるオプションです。`export LESS=-R` と環境変数に登録しておけば毎回 lessの度に指定する手間はありません。


# 標準入力にも対応
このようにパイプで渡すほか

```bash
echo Hello, color_echo\!\! | color_echo -f h_green
```

リダイレクトでファイルパスを指定してもOKです。

```bash
color_echo < /file/to/path/hoge.txt
```

# 特定のワードにだけ色をつける
これまでの例では出力すべてに色がつきました。-pオプションを使えば特定のワードにだけ色を適用することができます。使い方は -pオプションの値に色を適用したいワードを指定します。

以下では「hoge」にだけ色が適用されます。

```bash
color_echo hogepiyofuga -p hoge
```
![screenshot4.png](https://qiita-image-store.s3.amazonaws.com/0/37104/df59e97d-b104-9cea-c696-132ce1f89e51.png)


-pオプションは正規表現での指定も可能です。

以下では最初の「hoge」にだけ色が適用されます。

```bash
color_echo hogehogehoge -p /^hoge/
```
![screenshot5.png](https://qiita-image-store.s3.amazonaws.com/0/37104/6ad1307b-164f-c0e9-9dcc-bbef7a46597a.png)


以下では最後の「HOge」にだけ色が適用されます。"i" は文字の大小を区別しないオプションです。

```bash
color_echo HoGEhoGEHOge -p /hoge$/i
```
![screenshot6.png](https://qiita-image-store.s3.amazonaws.com/0/37104/e7a58693-317b-673a-e8da-5d0333b7fa89.png)


このように複数のワードを指定することもできます。

```bash
color_echo HoGEhoGEHOge -p /^hoge/i -p /hoge$/i
```
![screenshot8.png](https://qiita-image-store.s3.amazonaws.com/0/37104/9f04a09d-d238-6040-88ac-2cd8c8d325e4.png)



標準入力を受け付けるのでnetstatやgrepなどの出力を色付けするのも良いですね。

```bash
netstat -na | color_echo -p ":80" | color_echo -p "127.0.0.1" -f h_cyan
```


# tailで特定のワードに色をつける

標準入力を待ち続けるには -wオプションを使います。`color_echo -w` と実行してください。対話モードに入ります。
対話モードから抜けるには `exit`,`quit`,`bye` のいずれかを入力します。

このようにtailの出力を標準入力として渡します。`tail -f` の出力すべて黄色になったと思います。

```bash
tail -f /var/log/httpd/access_log | color_echo -w
```

出力全部に色が適用されたら意味がないので -pオプションで特定のワードに色を適用します。

```bash
tail -f /var/log/httpd/access_log | color_echo -w -p "xxx.xxx.xxx.xxx" -f h_blue -t bold
```
"xxx.xxx.xxx.xxx" はIPアドレスだと思ってください。
指定したIPアドレスだけ明るい青の太字となり、かなりログが追いやすくなったと思います。



# color_echoでアクセスログを見よう！
color_echoがあればアクセスログも見やすくなります。

特定のIPアドレスを色付け。

```bash
color_echo -p "xxx.xxx.xxx.xxx" -f cyan < /var/log/httpd/access_log | less
```

ステータスコード200番台はシアン、300番台は緑、400番台はマゼンタ、500番台は赤に色付け。

```bash
(color_echo -f cyan -p /\\s2..\\s/ | color_echo -f green -p /\\s3..\\s/ | color_echo -f magenta -p /\\s4..\\s/ | color_echo -f h_red -p /\\s5..\\s/ | less) < /var/log/httpd/access_log
```
![screenshot9.png](https://qiita-image-store.s3.amazonaws.com/0/37104/103d8a2c-92ce-4b79-ba56-b775ea4eecd1.png)


ただしアクセスログのような巨大ファイルを一気にダンプしこのようにパイプでいくつも渡すと時間や負荷がかかることがあります。
ログファイルが巨大な時は sedコマンドの-nオプションを使ってこのように指定した範囲の行を少しずつ読むと良いです。

```bash
sed -n 1000,2000p /var/log/httpd/access_log | color_echo -f cyan -p /\\s2..\\s/ | color_echo -f green -p /\\s3..\\s/ | color_echo -f magenta -p /\\s4..\\s/ | color_echo -f h_red -p /\\s5..\\s/ | less
```

## ストライプ状に装飾する
v1.1.0でストライプ状に装飾する `--stripe` オプションが追加されました。
このオプションは対話モードでも有効です。tailの出力を行ごとに装飾することが可能です。

```bash
color_echo -f black -b index40 -t bold --stripe < /var/log/httpd/access_log
```
![stripe.png](https://qiita-image-store.s3.amazonaws.com/0/37104/0d9d5d75-446a-30d9-a62f-e45cba6d83d9.png)

これでかなり見やすくなりましたね。
--stripeオプションを指定している場合は --pickupオプションは無効となりますのであしらかず。


# オプション
最後にcolor_echoのオプションを紹介します。
<pre>


--symbol-list:
    文字色や背景色やテキスト属性で指定可能なカラーネームのリストを出力します。
    ショートオプションは -sです。

--index-list:
    文字色や背景色で指定できるカラーインデックスのリストを出力します。
    ショートオプションは -lです。

--pickup word [--pickup word ...]:
    指定したワードのみに装飾を適用します。このオプションは複数書けます。
    このように値を入力した場合正規表現リテラルとして扱います -> /^foo/i
    ショートオプションは -pです。

--hightlight "foreground_color[,background_color[,text_attribute]]:"
    -pオプションで指定したワードにマッチした行に対してマッチしたワード以外の部分を指定した装飾を行います。
    ショートオプションは -Hです。

--fg color_name:
    文字色を指定します。
    ショートオプションは -fです。

--bg color_name:
    背景色を指定します。
    ショートオプションは -bです。

--tx text_attribute[,...]:
    テキスト属性を指定します。コンマ区切りで複数指定できます。
    ショートオプションは -tです。

--watch:
    対話モードです。exit, quit, bye とタイプするとこのモードを抜けます。
    ショートオプションは -wです。

--stripe:
    行ごとに1行間隔を開けて装飾を適用します。
    このオプションを指定している時は--pickupは無効となります。

--refresh-pre-match:
    -pオプションで指定したパターンとマッチした行に対してシーケンスコードを取り除きます。
    ショートオプションは -rです。

--refresh:
    入力に対して可能な限りシーケンスコードを取り除きます。
    ショートオプションは -Rです。

-n:
    最後の改行を出力しません。

-e:
    改行の解釈を有効にします。

-v:
    color_echoのバージョンを出力します。

-h:
    ヘルプメッセージを表示します。
</pre>

### 追記
1.3からは `colorecho` でも実行可能になりました。アンダースコアは省略できます。
2.0でますます`color_echo`が使いやすくなりました！

# ドキュメント
英語: http://colorecho.github.io/
日本語: http://colorecho.github.io/ja/