What is The Silver Searcher
ファイルに対して再帰的に文字列検索を行なうコマンドです。要はスゴイ grep です。Silver だから ag というコマンド名という。
Why The Silver Searcher
-
とても速い。
- Pthreads を使用し並列処理を行なう。
-
.git や .svn を検索除外してくれる。
- .gitignore の内容も除外してくれる。
- ag のみで除外したい場合は .agignore というファイルも利用可能。
- .gitignore の内容も除外してくれる。
-
検索対象ファイルのファイルタイプをオプション指定できる。
- --ruby と指定すると (.rb .rhtml .rjs .rxml .erb .rake .spec) が対象になる。
インストール
OS X
Homebrew で
$ brew install the_silver_searcher
Debian系
$ sudo apt install silversearcher-ag
RHEL系
$ sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
$ sudo yum install the_silver_searcher
Fedora 22以降
$ sudo dnf install the_silver_searcher
使い方
カレントディレクトリ以下を検索
$ ag pthread
特定ディレクトリ以下を検索
$ ag pthread /usr/src
圧縮ファイルも検索
$ ag -z pthread
対応しているファイルフォーマットは以下の表の通り。xz は対応済みだが、bzip2 は非対応な点に注意。
フォーマット | 対応状況 |
---|---|
gzip | o |
bzip2 | x |
xz | o |
UNIX Compress | x |
ZIP | x |
ちなみに各種ツールを process fork して呼び出してるわけではなく、ag 自体で decompress しています。速度へのこだわりがすごい。
ファイル/ディレクトリ名のパターンを指定して検索
$ ag -G '\.(c|h)' pthread
パターンは正規表現で指定するため、shell の glob っぽく *.c と記載すると動かないので注意。
ファイルタイプを指定して検索
$ ag --cc pthread
一般的によく使われるであろう言語については下記の通り対応済み。
FILE TYPE | suffix |
---|---|
--cc | .c .h .xs |
--cpp | .cpp .cc .C .cxx .m .hpp .hh .h .H .hxx |
--html | .htm .html .shtml .xhtml |
--java | .java .properties |
--js | .js .jsx |
--perl | .pl .pm .pm6 .pod .t |
--php | .php .phpt .php3 .php4 .php5 .phtml |
--python | .py |
--ruby | .rb .rhtml .rjs .rxml .erb .rake .spec |
--shell | .sh .bash .csh .tcsh .ksh .zsh |
--xml | .xml .dtd .xsl .xslt .ent |
--yaml | .yaml .yml |
他の言語についても対応しているかどうかは下記コマンドで確認可能です。
$ ag --list-file-types
隠しファイルも検索
$ ag --hidden pthread
隠しファイルとは '.' から始まるファイルやディレクトリです。
全ファイルを検索
$ ag -u pthread
.agignore や .gitignore の内容も無視し、上記の隠しファイルも含めて全てのファイルを検索対象とします。
マッチしたファイル名だけ表示
$ ag -l pthread
ちなみに ag -l
で検索対象ファイルの全表示になります。
マッチしなかったファイル名だけ表示
$ ag -L pthread
上記の逆ですね。
ファイル名(相対パス含む)に対して検索
$ ag -g pthread
上記の -l はファイル内容にマッチしたファイル名のみ表示。こちらの -g はファイル名にマッチしたら表示。ややこしい。
再帰処理するディレクトリ階層の深さを指定
$ ag --depth 1 pthread
- 0 を指定すると指定したディレクトリのみ。
- 1 を指定すると 1階層までディレクトリ再帰処理する。
- -1 を指定すると無限に再帰処理する。
- デフォルトは 25。
セパレーターを NULL にして表示
$ ag -0 pthread
詳細は下記応用例で。
応用例
ファイル名が FILE_PATTERN にマッチして、かつ、PATTERN が含まれているファイル名を表示したい
$ ag -l -G FILE_PATTERN PATTERN
-l -g
だとダメなので注意。
PATTERN が含まれているファイルに xargs で COMMAND 処理を行なう
$ ag -l -0 PATTERN | xargs -0 COMMAND
ag -0
は find(1) でいうところの -print0
と同等で、ファイル名に空白が含まれていると xargs(1) 側でうまく処理ができないのが理由です。
Atom から使いたいよ
atom-fuzzy-grep を使うと便利。
↑ こんな感じでプロジェクトに含まれるファイル郡から fuzzy 検索できるようになります。 あまりに大量にファイルがあると結果出てくるまでに数秒かかったり結果リストがリアルタイムに更新されたりするけど、慣れれば気にならない予感。
自分の環境(OSX El Capitan + Homebrew + Homebrew Cask)だと ag がみつからないとエラーになってしまうので、設定画面で /usr/local/bin/ag -i --nocolor --nogroup --column
を設定して解決。 同様の Issue が Failed to spawn command ag
on second window として報告されてますなー。
ちなみに Atom 標準の Find and Replace package の Find in project のように新しいタブを開いて検索結果をリストアップ、という Package はまだない模様。
似たツールはないのかな
ack
高速grepツールの草分け?
perl で書かれているので ag と比較すると若干処理に時間がかかる。というより ag はスピードを追求した ack という出自っぽい。
sift
ag よりも速いし高機能のようだけど、メモリー使用量が結構すごいらしい(未検証)。
highway
ag よりも速い(手元の環境で確かに速かった)上に、EUC-JP や Shift-JIS にも対応していてステキ。
--column
オプションがないので、上記の atom-fuzz-grep はうまく動かない模様…。unite.vim だと動くようなのに…。
The Platinum Searcher
ag 相当の速度で Go で書かれていて、EUC-JP や Shift-JIS にも対応。
Go言語でag(The Silver Searcher)ライクな高速検索ツールをつくった。EUC-JP/Shift-JISも検索できマス。
まとめ
高速grepツールの進化がすごいので、これからも便利になる予感。
Atom の Find in project のような使い勝手で使えるようになるといいなー。そのうち自分で作るかもだけど、そもそも JavaScript 書けないしなー、とか。