grep・ripgrep コマンドビルダー
include、exclude、前後の行を指定して grep や ripgrep の検索コマンドを作成します。
このツールについて
パターン、検索場所、含める・除外するファイルやフォルダー、表示内容(前後の行、マッチ部分のみ、件数、ファイル名)を設定します。すべてのフラグの説明付きで対応する GNU grep と ripgrep のコマンドが得られ、ページ上でサンプルテキストを使ってパターンをテストすることもできます。
使い方
- 検索する文字列を入力します。複数行にすると複数のパターンになり、そのいずれかにマッチすれば一致とみなされます。
- 正規表現、基本、プレーンテキスト、Perl の構文から選び、大文字と小文字を区別しない、単語単位などのオプションを指定します。
- 検索場所と、含める・除外するファイルやフォルダーを設定します。
- 表示する内容を選び、サンプルテキストでパターンをテストしてから、grep または ripgrep のコマンドをコピーします。
よくある質問
- 再帰的に検索しつつ、一部のフォルダーをスキップするには?
- フォルダーごとに --exclude-dir を追加します。例: grep -r --exclude-dir=.git --exclude-dir=vendor pattern . ripgrep では .gitignore に記載されたものは自動的にスキップされ、-g '!folder/' でさらに除外できます。
- 特定の種類のファイルだけを検索するには?
- grep では --include='*.log' を追加します(シェルが * を展開しないよう引用符で囲みます)。ripgrep では -g '*.log' か、-t py や -t java のような組み込みの種類を使います。
- grep -E と通常の grep の違いは何ですか?
- 通常の grep は基本正規表現を使い、+ ? | ( ) はバックスラッシュでエスケープしない限り普通の文字です。-E を付けると拡張構文に切り替わり、多くのプログラミング言語と同じように演算子として機能します。
- grep と ripgrep、どちらを使うべきですか?
- ripgrep(rg)は大規模なプロジェクトで格段に速く、デフォルトで再帰的に検索し、.gitignore を考慮します。grep はすべての Unix システムにインストールされているため、サーバーやスクリプトではその点が重要です。
- マッチした行の前後の行を表示するには?
- 前後 3 行ずつを表示するには -C 3 を、前と後ろを別々に指定するには -B と -A を使います。ここのプレビューにも同じ前後の行が表示されます。
- ダッシュで始まるパターンを grep で検索するには?
- そのままでは grep がオプションとして読んでしまいます。grep -e "-v" notes.txt のように前に -e を付けるか、2 つのダッシュでオプションを終わらせます。例: grep -- "-v" notes.txt。このツールは、パターンがダッシュで始まる場合に自動的に -e を追加します。
- 圧縮された .gz のログファイルの中を検索するには?
- 通常の grep には圧縮されたバイト列しか見えないため、ここではデフォルトで *.gz を除外しています。ほとんどの grep オプションを受け付ける zgrep を使ってください。例: zgrep -i "timeout" /var/log/app.log.2.gz。ローテーションされたログのフォルダー全体なら、zgrep -i timeout /var/log/app.log* で通常のファイルと圧縮ファイルをまとめて検索できます。
- マッチした行ではなくマッチの数を数えるには?
- grep -c は行を数えるため、3 つマッチする行も 1 回として数えられます。すべての出現を数えるには、各マッチを 1 行ずつ出力してその行数を数えます。例: grep -o "error" app.log | wc -l。大文字小文字が混在する場合は、どちらの方法でも -i を追加してください。
grep で複数の単語を検索する方法
複数の単語のいずれかを含む行にマッチさせるには、拡張構文を使います。例: grep -E "error|warn" app.log。パターンごとに -e を 1 つずつ付ける grep -e error -e warn app.log でも同じ結果になり、ここで各パターンを 1 行ずつ入力するとこの形になります。基本構文では error\|warn と書く必要がありますが、これは GNU 拡張なので、macOS の BSD grep では使えない場合があります。
grep には AND 演算子がありません。両方の単語を順序を問わず含む行を探すには、検索をパイプでつなぎます。例: grep -i payment app.log | grep -i timeout。GNU grep では -P で先読みが使え、grep -P "^(?=.*payment)(?=.*timeout)" のように書けますが、macOS のデフォルトの grep には -P がありません。両方の単語を含む行ではなくファイルを探すには、grep -rl を xargs でつなぎます。
grep で何も見つからないのはなぜですか?
まずクォートを確認してください。クォートがないと、grep がパターンを受け取る前にシェルが * や $ を展開してしまうため、常にダブルクォートで囲み、$ を含む場合はシングルクォートで囲みます。次に構文を確認します。通常の grep では、-E を付けない限り + ? | は普通の文字です。また、ドットは任意の文字にマッチするため、バージョン番号をそのまま検索するには grep -F "1.2.3" を使います。
Windows の改行コードのファイルでは、$ でアンカーしたパターンがうまく機能しません。各行の末尾に目に見えないキャリッジリターンが付いているためです。grep -P "foo\r?$" でそれも含めてマッチさせるか、先に dos2unix でファイルを変換してください。grep が「binary file matches」と出力した場合は、NUL バイトが見つかっています。-a を付けるとファイルをテキストとして検索します。実際のファイルで実行する前に、ここか正規表現テスターでサンプルテキストを使ってパターンを試してください。
よく使う grep のフラグに相当する ripgrep のフラグ
ほとんどのフラグは両方で同じです。-i、-w、-v、-c、-l、-o、-m と、前後の行を表示する -A、-B、-C です。つまずきやすいのは違いのほうです。ripgrep はターミナルではデフォルトで行番号を表示するため、-N で非表示にします。ファイル名を非表示にするには、grep は -h を使いますが ripgrep は -I を使い、grep の -I はバイナリファイルをスキップするという意味です。シンボリックリンクをたどるには、grep は -R、ripgrep は -L を使います。
ripgrep は再帰的に検索し、隠しファイルと .gitignore に含まれるものをスキップするため、--hidden と --no-ignore でそれを無効にします。--include と --exclude の代わりにフラグは 1 つで、rg -g "*.py" TODO は Python ファイルだけを検索し、! で始まる glob は除外を意味します。生成されるコマンドではこれをシングルクォートで囲むため、bash が ! を履歴展開として扱うことはありません。-S(スマートケース)を使うと、小文字だけのパターンは大文字小文字を無視し、大文字を含むパターンは区別します。grep にはスマートケースがないため、grep のコマンドでは代わりに -i を使います。
うまく動かない、または結果がおかしいですか? このツールの問題を報告