Ubuntu Weekly Recipe

第287回 Ubuntuで超高速grep「The Silver Searcher」を使う

この記事を読むのに必要な時間:およそ 4 分

UNIXライクなOS上で作業をするとき,grepコマンドはなくてはならない存在です。そんな基本的かつ古典的なユーティリティであるgrepですが,使いにくい面もあります。

2013年のはじめころから,grepに取って代わるコマンドとして「The Silver Searcher」(またの名を「ag」⁠が注目されはじめました。

今回のレシピでは,⁠The Silver Searcher」(以下ag)をUbuntuで使用する方法を紹介します。

The Silver Searcher(ag)とは?

プログラムを書いていると,ソースコード全域にわたって文字列を検索したい,ということはよくありますよね。そのようなときにもgrepコマンドが活躍するわけですが,プロジェクトのディレクトリには検索したくないファイルというものも存在します。

たとえばバージョン管理システムが使っている「.git」「.svn」といったディレクトリは,検索対象に含めたくありません。またバージョン管理下にないファイル(makeした後に生成されるファイルなど)も無視したいところです。これをgrepで実現しようとすると,パイプやサブシェルを組み合わせて,少々面倒なワンライナーを書く必要があります。

こういった問題を解決するため,ackというプログラムが作られました注1)⁠ackは以下のような特徴を持つ,開発者向けの賢いgrepです。

  • デフォルトでディレクトリツリーを再帰検索
  • .gitなどを暗黙的に除外
  • 検索するファイルタイプをオプションで指定可能(--perl,など)
  • 拡張子だけでなく,shebangを見てファイルタイプを判別可能
  • 検索結果をファイル単位でわかりやすくまとめて表示

このようにackは非常に高性能なのですが,Perlで実装されていることもあり,動作速度に難があります。agは開発者が「A code searching tool similar to ack, with a focus on speed.」と紹介しているとおり,⁠高速なack」を目指して開発されているプログラムです。⁠ackに比べて3から5倍高速」を謳っており注2)⁠そして実際非常に高速です。

ためしにUbuntu 13.04のカーネルのソースに対して文字列を検索し,速度を比較してみました注3)⁠

これは筆者が原稿を書いている環境注4で,OSを起動した直後(キャッシュにデータが乗っていない状態)にそれぞれのコマンドを実行して計測しました。

カーネルのソースパッケージを取得して展開

$ apt-get source linux-image-3.8.0-27-generic

kthreadという文字列でソース全体を検索する

$ time grep -r kthread * > /dev/null

real	0m11.043s
user	0m0.908s
sys	0m1.472s

$ time ack-grep kthread > /dev/null

real	0m16.991s
user	0m7.484s
sys	0m1.324s

$ time ag kthread >/dev/null

real	0m4.285s
user	0m1.180s
sys	0m1.748s

ソース全体の検索にかかった時間

grepackag
11.04316.9914.285

見てのとおり,実行時間において4倍,grepと比べても3倍近い差が出ました。

agは内部でpthreadを用い,ファイルを並列に検索しています。小さなプロジェクトではそれほど差は出ませんが,カーネルくらいファイルやディレクトリの数が増えてくると,ackとagの差は顕著になってきます。

図1 ack/ag実行時のシステム負荷。agはackに比べ,マルチCPUをうまく利用していることがわかる

図1 ack/ag実行時のシステム負荷。agはackに比べ,マルチCPUをうまく利用していることがわかる

注1)
DebianやUbuntuでは,ack-grepというパッケージで提供されています。
注2)
他にも「agという名前なのでackより33%もコマンド名が短い!」などという特徴も謳われています。もちろんこれは作者流のジョークだと思うのですが,これによって他のパッケージに含まれるバイナリと名前が衝突するという極めて現実的な問題も発生しました。冗談になっていません。やはりOSが持つ基本コマンドなどを除けば,極端に短いコマンド名は避けるべきだと筆者は思います。
注3)
ag(やack)は,⁠$ ag hoge」「$ grep -r hoge *」と同等の動作をします。
注4)
ThinkPad T430s,RAM 8GB,SSD換装済み。

パッケージのインストール

Debian unstableやUbuntu 13.10では,silversearcher-agというパッケージが用意されています。以下のようにパッケージをインストールすることで,agコマンドが使用できるようになります。またbash用のcompletionも同梱されていますので,シェルにbashを使っている場合,Tabキーでオプションを補完することも可能です。

Ubuntu 13.04向けには,PPAにパッケージを用意しました。筆者のPPAを追加して「apt-get update」を実行した後に,インストールを行ってください。今後Debian unstableのパッケージが更新された場合,このPPAに都度バックポートを行う予定です注5)⁠前述のとおり,Ubuntu 13.10以降はPPAを追加しなくてもUniverseのパッケージを利用することができますが,筆者のPPAを追加することで最新版を利用できるかもしれません。

agをパッケージからインストールする

$ sudo apt-get install silversearcher-ag

Ubuntu 13.04では,筆者のPPAを追加する

$ sudo apt-add-repository ppa:mizuno-as/silversearcher-ag
[sudo] password for mizuno:
以下のPPAをシステムに追加しようとしています:
 Backport PPA for The Silver Searcher from Debian sid / Ubuntu development branch.
The Silver Searcher (a.k.a. ag)のバックポート用PPAです。

 詳しい情報: https://launchpad.net/~mizuno-as/+archive/silversearcher-ag
[ENTER] を押すと続行します。ctrl-c で追加をキャンセルできます

$ sudo apt-get update

図2 オプションの補完。シェルにbashを利用しているならば,Tabキーでの補完が有効になる

図2 オプションの補完。シェルにbashを利用しているならば,Tabキーでの補完が有効になる

注5)
もちろん予定は未定です。

Debianパッケージング道場

実は,Debianでsilversearcher-agパッケージをメンテナンスしているのは筆者です。なぜagのパッケージングとメンテナンスをすることになったのか,その経緯を少し紹介しておきます。

2013年2月,京都大学で「Debianパッケージング道場」というイベントが行われました。お題として「参加者は何かパッケージにしたいものを持ってきて,それをパッケージ化する」というものがあり,筆者はたまたま,そのころ話題になりつつあったagを選択しました。そのときに作成したパッケージがunstableに入り,そしてUbuntuでも,13.10から使えるようになったというわけです。

東京エリアDebian勉強会関西Debian勉強会では,未来のDebian開発者を育てることを目標に,毎月勉強会を開催しているほか,パッケージング道場のようなイベントを不定期に開催しています。

DebianやUbuntuの開発に興味のある方は,参加してみてはいかがでしょうか。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。株式会社インフィニットループ所属。

コメント

コメントの記入