はじめに

この資料は Rust 製のコマンドラインツール ripgrep について紹介するものです。

Rustの環境構築やツールのインストール方法については以下を参照してください

Rust開発環境を整える

ripgrep について

ripgrep はRustで実装された検索ツールで、正規表現パターンに基づいてカレントディレクトリ以下を再帰的に検索します。デフォルトでは、ripgrep は gitignore 規則をサポートし、隠しファイル/隠しディレクトリとバイナリファイルを自動的にスキップします。コマンド名は rg です。

GitHub - BurntSushi/ripgrep: ripgrep recursively searches directories for a regex pattern while respecting your gitignore

rg_example.png

この例では、—colors オプションでパスの表示色を変えていますが、これは環境変数 RIPGREP_CONFIG_PATH に設定ファイルのパスを指定して、そのファイルに記述することができます。

RIPGREP_CONFIG_PATH=$HOME/dotfiles/.ripgreprc

$HOME/dotfiles/.ripgreprc にオプション指定を追加

--colors=path:fg:cyan

各ツールを比較したベンチマークテスト

このベンチマークテストでは、Linux カーネル ソース ツリー全体 (make defconfig && make -j8 を実行後) から [A-Z]+_SUSPEND を検索します (一致するのはすべて単語である必要があります)。

タイミングは Intel i7-6900K 3.2 GHz を搭載したシステムで収集されました。

ベンチマークは1つだけでは不十分であることを覚えておいてください。より多くのベンチマークと分析による非常に詳細な比較は、ripgrepに関する私のブログの記事をご覧ください。

ツール コマンド 行数 時間
ripgrep (Unicode) rg -n -w '[A-Z]+_SUSPEND' 452 0.136s
https://www.kernel.org/pub/software/scm/git/docs/git-grep.html git grep -P -n -w '[A-Z]+_SUSPEND' 452 0.348s
https://github.com/Genivia/ugrep ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND' 452 0.506s
https://github.com/ggreer/the_silver_searcher ag -w '[A-Z]+_SUSPEND' 452 0.654s
https://www.kernel.org/pub/software/scm/git/docs/git-grep.html LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' 452 1.150s
https://github.com/beyondgrep/ack3 ack -w '[A-Z]+_SUSPEND' 452 4.054s
https://www.kernel.org/pub/software/scm/git/docs/git-grep.html LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' 452 4.205s

上記と同じコーパスで、gitignoreファイルを無視し、代わりにホワイトリストで検索する別のベンチマークを示します。コーパスは先ほどのベンチマークと同じで、各コマンドに渡されるフラグは同等の処理を行うことを保証しています。