Ubuntu Weekly Recipe

第579回 高速で便利なgrep「ripgrep」を活用する

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

数多くあるUnixコマンドの中でも,もっとも利用頻度の高いもののひとつがgrepではないでしょうか。設定ファイルやログから該当する箇所を調べたり,ソースコードを検索したり,あるいはパイプラインのフィルタとして利用したりと,あらゆる場面で活躍する超基本ツールです。

とはいえgrepは機能がシンプル過ぎるため,もう少し空気を読んだ,賢い検索をしてくれる代替ツールもまた数多く存在します。たとえば本連載287回ではThe Silver Searcher(ag)を紹介しました。

とはいえこれはもう6年も前の記事です。ag以降も,いろいろな検索ツールが登場しています。そこで今回はさらに高速な検索ツールである,ripgrepを紹介します。

ripgrepとは

ripgrepとは,公式サイトによると「ripgrep recursively searches directories for a regex pattern」だそうです。日本語にすると「正規表現でディレクトリを再帰的に検索できるツール」でしょうか。シンプルですね。

同サイトによると,⁠ripgrepを使うべき理由」として,以下のような理由が挙げられています。

  • 検索ツールとして必要なほとんどの機能が含まれており,他のツールの大抵のユースケースを置き換えることができる。
  • デフォルトでディレクトリを再起的に検索する。.gitignoreを見て不要なファイルを除外し,隠しファイルやバイナリは無視する。
  • 検索対象を特定のファイルタイプに限定して検索できる。カスタムマッチングルールを使えば,新しいファイルタイプにも対応できる。
  • 複数パターンの検索,色つきの強調表示,Unicodeの完全なサポートといった豊富な機能がある。
  • Unicodeをサポートしながらも高速である。
  • 正規表現エンジンニPCRE2を使用できる。これにより正規表現の先読み,後読み,後方参照が利用できる。
  • EUC-JPやShift-JISをサポートしている。
  • gzip,bzip2,xzなどの圧縮ファイルの中からも検索できる。
  • 様々な前処理フィルタをサポートしている。これによってPDFやサポート外の圧縮ファイルなどにも対応できる。

agと同じく「多機能で高速なgrep」を目指しているのがわかりますね。それでは実際に使ってみましょう。

ripgrepのインストール

Ubuntu 19.04であればリポジトリにパッケージが用意されていますので,APTでインストールが可能です。

aptコマンドでripgrepをインストール(Ubuntu 19.04以降)

$ sudo apt install ripgrep

また,ripgrepはsnapにもパッケージが用意されています。

snapでripgrepをインストール

$ sudo snap install ripgrep --classic

本記事執筆時点(2019年7月18日)で,Ubuntu 19.04のリポジトリにあるバージョンは0.10.0,snapにあるバージョンは11.0.1となっています※1)⁠最新リリースが使いたい場合や,OSにUbuntu 18.04 LTSを使っている場合はsnapを使うとよいでしょう。

※1
バージョンがいきなり飛んでいるように見えるかもしれませんが,0.10.0リリースの次が11.0.0リリースとなっています(参考: https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)⁠

ripgrepを使ってみる

ripgrepの実行コマンド名は「rg」です。以下のように引数としてオプション,検索パターン,検索対象を指定して実行します。検索対象を省略した場合は,カレントディレクトリが対象となります。

ripgrepのコマンドの書式

$ rg [OPTIONS] PATTERN [PATH ...]

見ての通り,使い方はagなどの先行プロダクトに倣っているため,それらの使用経験があれば戸惑うことはないでしょう。また当然ですが,パイプで標準入力からデータを流し込み,フィルタとして使うこともできます。

「–help」オプションでヘルプが表示されるため,最初に軽く目を通しておきましょう。とはいえ,主要なオプションはどれもどこかで見たようなものばかりです。例をあげると,以下のようなものがあります。

  • マッチしたファイル名のみを表示する「-l」オプション。
  • 大文字小文字の区別をしない「-i」オプション,逆に区別する「-s」オプション※2)⁠
  • マッチした行の前後行も表示する「-A」⁠-B」オプション。
  • ファイルごとに,マッチした件数を表示する「-c」オプション。
  • 隠しファイルを検索対象にする「–hidden」オプション。
※2
rgではデフォルトで大文字小文字を区別します(-sオプション付加状態)⁠これはデフォルトで大文字小文字を区別しない(-iオプション付加状態)のagとは逆なので注意してください。

「-t」オプションを使うと,特定のファイルタイプに検索対象を限定できます。オプション引数に対象としたいファイルタイプを指定して使います。たとえば

Markdownファイルに検索対象を限定する例

$ rg -tmd PATTERN

とすることで,カレントディレクトリ以下のMarkdownファイル(拡張子がmarkdown,md,mdown,mkdnのもの)のみが検索対象となります。また「–type-list」オプションを指定すると,対応しているファイルタイプの一覧が確認できます。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。