tanacasinoのメモ

what are you waiting for ?

テキスト検索ツール grep ack-grep agについて

find + grepソースコードのテキストを検索するなんてことをよくやっていましたが、もっといいツールあったねってメモ。 1年以上使ってみたけど、find + grep よりずっと楽でいいという結論。長く使えるといいな。

ack-grep ag コマンドは双方ともにバージョン管理システムのディレクトリやらを自動的に検索対象外にしてくれたりと気が利く子です。.gitignoreや.hgignoreまでチェックしてから検索してくれるという空気の読みっぷりにはヨダレダラダラです。検索結果も見やすい。

grep

比較のためgrepの結果を載せておく。(出力結果の見た目についてオプション頑張れば同じことできそう。覚える記憶力はないが)

$ grep GitServlet -R *
src/main/scala/servlet/GitRepositoryServlet.scala:import org.eclipse.jgit.http.server.GitServlet
src/main/scala/servlet/GitRepositoryServlet.scala:class GitRepositoryServlet extends GitServlet {

ack-grep

Perlで書かれているらしいです。 Ubuntu 12.04 では以下のコマンドでインストール可能。

$ sudo apt-get install ack-grep

実行すると以下の様な感じ。(カラーとかまで表現したいんだけど無理かな・・・)

$ ack-grep GitServlet
src/main/scala/servlet/GitRepositoryServlet.scala
3:import org.eclipse.jgit.http.server.GitServlet
21:class GitRepositoryServlet extends GitServlet {

ag

agコマンドは、the_silver_searcherというソフトウェアのコマンド名。 ack-grepより早いんだぜ!みたいな感じ。

ずっとこっちを使っていますが、今のところ特に不満はない感じ。 Ubuntuの場合は、この子は自分でビルドする模様です。Arch LinuxMac OS X(homebrew)なんかではさくっと入れれる。 自分はいつも$HOME/bin/ にインストールしているのでその手順。 PATHを通しておかないと意味ないので注意。あとmanとかもbashのcompletionファイルもあるけどそれはインストールしない。バイナリのみ。

$ sudo apt-get install -y build-essential automake pkg-config libpcre3-dev zlib1g-dev liblzma-dev
$ git clone https://github.com/ggreer/the_silver_searcher
$ cd the_silver_searcher
$ ./build.sh
$ mkdir -p $HOME/bin/
$ ln -sf `pwd`/ag $HOME/bin/

実行

$ ag GitServlet
src/main/scala/servlet/GitRepositoryServlet.scala
3:import org.eclipse.jgit.http.server.GitServlet
21:class GitRepositoryServlet extends GitServlet {

最後にせっかくだからtimeコマンド付きの実行結果も載せるべし。

$ time grep GitServlet -R *
src/main/scala/servlet/GitRepositoryServlet.scala:import org.eclipse.jgit.http.server.GitServlet
src/main/scala/servlet/GitRepositoryServlet.scala:class GitRepositoryServlet extends GitServlet {

real    0m0.008s
user    0m0.000s
sys     0m0.004s

$ time ack-grep GitServlet
src/main/scala/servlet/GitRepositoryServlet.scala
3:import org.eclipse.jgit.http.server.GitServlet
21:class GitRepositoryServlet extends GitServlet {

real    0m0.088s
user    0m0.072s
sys     0m0.012s

$ time ag GitServlet
src/main/scala/servlet/GitRepositoryServlet.scala
3:import org.eclipse.jgit.http.server.GitServlet
21:class GitRepositoryServlet extends GitServlet {

real    0m0.011s
user    0m0.000s
sys     0m0.008s

ack-grepはもたついてますが、agは本当に十分な速度出てますね!