ターミナル出力を色づけするツールを作ってみた


はじめに

先日こちらの記事を見てとても便利そうだったので、いろいろ機能追加してツールにしてみました。

使い方

こんな感じでパイプでつないで使います。

$ tail -f hoge.log | pipecolor

ファイル指定でcat相当の動作をします。

$ pipecolor hoge.log

さらにLinux限定ですがPID指定で実行中のプロセスから出力を取ってくることもできます。

$ pipecolor -p 10000

また、出力が端末かファイルかは判定しているので、デフォルトではファイルへのリダイレクト時には色付けしません。

$ tail -f hoge.log | pipecolor > no_color.log # no_color.logは色付けなし
$ tail -f hoge.log | pipecolor --mode always > color.log # color.logは色付けあり

動作デモはこんな感じです。
(INFO行を緑、ERROR行を赤に色付けしてみました)

インストール

Releaseから最新のバイナリをダウンロードしてパスの通ったところに置いてください。
Rustで書かれているので環境構築済みの方は以下でもOKです。

$ cargo install pipecolor

設定

カラーリングの設定ファイルを用意します。デフォルトでは~/.pipecolor.tomlを読みます。
また、--configオプションでパス指定も可能です。

シンプルな設定

[[lines]]
    pat   = "ERROR.*"
    colors = ["Red"]
    tokens = []

patにマッチさせる正規表現を、colorsに色を指定します。
この場合正規表現にマッチした部分全体がRedになります。

グルーピングによる色分け

[[lines]]
    pat   = "(ERROR).*"
    colors = ["Red", "LightRed"]
    tokens = []

正規表現ではグルーピング指定ができて、各グループの色はcolorsの2つ目以降に書きます。
(1つ目の色はどのグループでもない部分です)
この場合はERRORLightRed.*の部分がRedです。

複数の色付け設定

[[lines]]
    pat   = "(ERROR).*"
    colors = ["Red", "LightRed"]
    tokens = []
[[lines]]
    pat   = "(INFO).*"
    colors = ["Green", "LightGreen"]
    tokens = []

linesは複数設定出来ます。この設定は上の動作デモで使った「ERRORが赤、INFOが緑」のものです。

特定文字列のハイライト

マッチした行のうちさらに特定の文字列だけハイライトすることもできます。

[[lines]]
    pat  = "^(.*?) .*? .*? \\[(.*?)\\] \".*?\" .*? .*? \".*?\" \"(.*?)\""
    colors = ["White", "LightGreen", "LightBlue", "Green"]
    [[lines.tokens]]
        pat   = "GET"
        colors = ["LightCyan"]
    [[lines.tokens]]
        pat   = "POST"
        colors = ["LightYellow"]
    [[lines.tokens]]
        pat   = "HEAD"
        colors = ["LightMagenta"]       

これはApacheのログを想定した設定です。GET/POST/HEADに対してそれぞれ色付けしています。

色指定

使える色は今のところ以下です。

Usable color
Black Blue Cyan Default Green
LightBlack LightBlue LightCyan LightGreen LightMagenta
LightRed LightWhite LightYellow Magenta Red
White Yellow