ackを使おう!

みなさんgrepしてますか!?

便利ですよねgrep。自分はLinuxを触りはじめたころ、

grepを使いこなせるようになれば一人前だ

って言われて、なにいってんのこの人きもいとか思ってないですよ全然。



まあ今となってはgrepをそれなりに使いこんでるわけですよ。

$ find . -name "*hoge" -type -f | grep -v '\.svn' | xargs grep piyopiyo

とかやってね。
なんかfind|xargs|grepとかまさにUNIX的ですよね。素敵やん。
簡単なコマンドを組み合わせてでっかいことやっちゃう??みたいな??


めんどくせーよっ!!!


ってことで、ackを使いましょう。
ack昨日知りました。
で、今日、使いはじめて2日目。


とりあえず、公式(Beyond grep: ack 2.12, a source code search tool for programmers)をおもいきり意訳しました。
↓↓

ackとは?

ackはgrep みたいなツールです。でかくてごちゃごちゃのソースコードを相手にしてるプログラマのために作られてるよ。
ackは全部Perlで書かれてるからPerl正規表現使えちゃう!

インストール方法
  • CPAN で App::Ack をインストール。Perlユーザならこれが楽だね。
  • standalone versionあるよ。CPANセットアップすんのマンドクセって人はこれ。
  • あと、Macport、Ubuntu、Fedora、Gentoo、Arch用にパッケージあるよ。
Textmateユーザへ

Textmateならいいかんじのプラグインあるよ!
Check it out at: http://github.com/protocool/ack-tmbundle/tree/master

各方面から喜びの声が!
  • わお!最高! grepよりずっとイイネ! (Djangoの中の人)
  • ack作ってくれてありがとう!毎日がちょっと楽しくなりました。 (Alan)
  • ackに出あってgrepとはおさらばしました。細かいところに気が聞くね! (Samuel)
  • ack最高! (redditのBill)
  • grepとかありえなーい。 (Thomas)
  • さよならfind-grep-xargs (Johnson)
  • --thppt に惚れました/// (Daring) (← $ ack --thppt ってやってみよう)
  • .svn無視してくれんのがいいよねー。 (Paul)
  • standaloneをプロジェクトのdevtoolsに入れちゃった。 (Jason Gessner)
  • ackまじパねえっす。 (Benjamin)
  • grepでやってたことの90%はackでやってるよ。 (Randall)
  • ackを使って身長がのびました。 (Jerry)
  • ackを使って彼女ができました。 (Andrew)
grepよりackを使うべき10の理由
  1. 速い。探したいやつだけ探すから。
  2. 全部PerlだからWindowsでも動く。
  3. Standalone versionを入れれば標準モジュールしか使わないし、余計なこと気にしないですむ。
  4. デフォルトでツリー全体を検索。でも.svnとかは無視!
    • どっちが楽?
      • $ grep pattern $(find . -type f | grep -v '\.svn')
      • $ ack pattern
  5. どうでもいいファイルは探しません。
    • VCSのディレクトリとか
    • blibとか
    • バックアップファイルとか
    • binaryとかコアダンプとか
  6. .svnとかを無視するからgrepより速い
  7. ファイルタイプを指定しよう! --perlとか --nohtmlとか
    • どっちが楽?
      • $ grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)
      • $ ack --perl pattern
        • それからackは--perlってやると拡張子なしのshebangまで探してくれます。これfindじゃできないよね!
  8. ack -f を使うとファイルのフィルタリングが出来る!
    • たとえばこうやると特定のタイプのファイルのリストが取得できるよ。
  9. ファイルの検索結果を色つきでハイライトしてくれる。
  10. GNUのサブセットじゃなくてPerlの正規表現が使える。
  11. Perlのスペシャル変数で出力を特定できる。
    • $ ack '(Mr|Mr?s)\. (Smith|Jones)' --output='$&'
  12. コマンドラインオプションがgrepと似ている。
    • -w は単語のみ
    • -c 一致した行数の表示
    • -l マッチした行ではなくファイル名を表示
  13. 「grep」より25%も短い!「grep -r」より50%も短い。

(...なんで13あるんだよ)

補足

すべてのファイルを検索

拡張子なしのファイルから探すときとかは-a付ければ検索対象になります。

.ackrc

たとえば、php書いてるんだけど、中に拡張子がhogeとかbarとかのファイルがあるんだよねー、ってときは

--type-set=php=.hoge,.bar

を~/.ackrcに書く、というような具合。

emacsから

emacserなら使ってるよねfind-grep(grep-find)。
それのコマンドを"ack --nocolor --nogroup" に入れかえちゃえばemacsからackが使えちゃう!
grep-findより断然おすすめです。.svnもhoge~も#hoge#も無視してくれる。バイナリも無視してくれる。


ack.elなんてのがあったからそれ使うといいんじゃないかな。
これならfind-grepも今までどおり使えるし。
http://repo.or.cz/w/ShellArchive.git?a=blob_plain;hb=HEAD;f=ack.el



以上、ackの紹介でした。