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


ごあいさつ

全国の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 が入りました。さっそく使ってみましょう。
コマンドラインで以下のように実行します。

color_echo Hello, color_echo\!\!

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

color_echo Hello, color_echo\!\! -f cyan

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

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

color_echo Hello, color_echo\!\! -f h_white -b red

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

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

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

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

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

標準入力にも対応

このようにパイプで渡すほか

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

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

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

特定のワードにだけ色をつける

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

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

color_echo hogepiyofuga -p hoge

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

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

color_echo hogehogehoge -p /^hoge/

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

color_echo HoGEhoGEHOge -p /hoge$/i

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

color_echo HoGEhoGEHOge -p /^hoge/i -p /hoge$/i

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

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 の出力すべて黄色になったと思います。

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

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

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アドレスを色付け。

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

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

(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

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

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の出力を行ごとに装飾することが可能です。

color_echo -f black -b index40 -t bold --stripe < /var/log/httpd/access_log

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

オプション

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



--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:
    ヘルプメッセージを表示します。

追記

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

ドキュメント

英語: http://colorecho.github.io/
日本語: http://colorecho.github.io/ja/