• このエントリーをはてなブックマークに追加
ss-2010-06-23-01 on Flickr

はじめに

コマンドラインで「色付き多重grep」を実行するのがメンドウに思えてきたので,そのあたりをラップして楽をできる(かもしれない)Perlスクリプトを書いてみました.

以下,その概要や使い方について淡々と.

背景

環境変数GREP_COLORに特定の値を設定することで,grepした際の文字を色付きでハイライトすることができることを,最近知りました.

% grep --color=always hoge /somewhere/target.txt
(「hoge」が含まれる行のみ,かつ「hoge」が赤色でハイライトされた状態で内容が出力される)
 
% env GREP_COLOR="1;32" grep --color=always fuga /somewhere/target.txt
(「fuga」が含まれる行のみ,かつ「fuga」が緑色でハイライトされた状態で内容が出力される)

パイプでgrepを多重化,そしてgrepごとに環境変数GREP_COLORを別の値に設定することで,「色付き多重grep」が可能となります.

% env GREP_COLOR="1;33" grep --color=always hoge /somewhere/target.txt \
  | env GREP_COLOR GREP_COLOR="1;34" grep --color=always fuga

上の例では,「hoge」「fuga」の両方が含まれる行のみ,かつ「hoge」が黄色,「fuga」が青色でそれぞれハイライトされた内容が表示されます.

そんな感じで,「色付き多重grep」は,テキストな文章やソースコード,ログファイルなどから,特定の内容を探すのに非常に便利なツールです.しかし,ちょこっと検索の書式を変更したり,さらに絞り込んだりしたりなどの際に,コマンドを修正するのがけっこうメンドイことは否めません.

概要

ss-2010-06-23-02 on Flickr

そんなことから,その辺のメンドさを軽減できるようなPerlスクリプト(以下,grep.pl)を書いてみました.

基本的な使い方は次のとおりです.

% /path/to/script/grep.pl -{re1} -{re2} ... {file1} {file2} ...

検索語(たぶん正規表現可)の頭に「-」をつけたものと,検索対象のファイルを,引数として与える形をとっています.それぞれ複数指定が可能です.

先の例を例にとると(?),次のような感じに置き換えられます.(現状では,色の設定はPerlスクリプトを直接修正する必要がありますが><)

% /path/to/script/grep.pl -hoge -fuga /somewhere/target.txt

また,findコマンドの結果をパイプで渡すような使い方もできます.

% find /somewhere/* -name '*.txt' \
    | /path/to/script/grep.pl -hoge -fuga

出力結果

指定したファイル(群)のうち,指定した検索語すべてを含んでいる(マッチする)行が1つでもあればそのファイル名,そして該当するすべての行について行番号と内容(色によるハイライトあり)がそれぞれ表示されます.(冒頭の図のような感じです.)

この出力には,grep -Hnコマンドによる出力を利用しています.

ほんの少しだけ正規表現の変換

ss-2010-06-23-03 on Flickr

grep.plの内部では,引数として与えられた正規表現とともにgrepコマンドを呼び出しています.Perlで使えるけどgrepコマンドでは使えないものもあるため,\d[0-9]に置き換える,といったような力技を,ごく一部の正規表現に対して行ったりしています.

ソースコード

grep.plのソースコードの現状はgithubに上がっていますので,よろしければお試しください.中身はキタナイですよw

grepwcの各コマンドを,スクリプト内部で呼び出しています.Mac OSX上のzshでしか確認していませんが,Linux系であればたぶん大丈夫でないかな,と思います.

おわりに

以上,便利だけど実行がメンドイ「色付き多重grep」を,少しだけ楽に行うためのPerlスクリプトを書き,簡単に紹介してみました.

今回のスクリプト書きをとおして,ターミナル上での色出力について少しだけ勉強になりました.しかし,出力がカラフルになるからといって調子に乗って多用すると,ソースコードとか後々カオスになりそうでコワイので,まぁほどほどにしておきます.