はじめに
コマンドラインで「色付き多重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」は,テキストな文章やソースコード,ログファイルなどから,特定の内容を探すのに非常に便利なツールです.しかし,ちょこっと検索の書式を変更したり,さらに絞り込んだりしたりなどの際に,コマンドを修正するのがけっこうメンドイことは否めません.
概要
そんなことから,その辺のメンドさを軽減できるような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コマンドによる出力を利用しています.
ほんの少しだけ正規表現の変換
grep.plの内部では,引数として与えられた正規表現とともにgrepコマンドを呼び出しています.Perlで使えるけどgrepコマンドでは使えないものもあるため,\dを[0-9]に置き換える,といったような力技を,ごく一部の正規表現に対して行ったりしています.
ソースコード
grep.plのソースコードの現状はgithubに上がっていますので,よろしければお試しください.中身はキタナイですよw
grep,wcの各コマンドを,スクリプト内部で呼び出しています.Mac OSX上のzshでしか確認していませんが,Linux系であればたぶん大丈夫でないかな,と思います.
おわりに
以上,便利だけど実行がメンドイ「色付き多重grep」を,少しだけ楽に行うためのPerlスクリプトを書き,簡単に紹介してみました.
今回のスクリプト書きをとおして,ターミナル上での色出力について少しだけ勉強になりました.しかし,出力がカラフルになるからといって調子に乗って多用すると,ソースコードとか後々カオスになりそうでコワイので,まぁほどほどにしておきます.



