テキスト検索ツール 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 LinuxやMac 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は本当に十分な速度出てますね!