32blogby StudioMitsu

grep完全ガイド:基本から高速なripgrepまで

grepの正規表現・実践パターンからripgrepへの移行まで解説。ログ解析・コード検索の効率を劇的に上げる方法を紹介。

12 min read
grepripgrepCLILinuxbashRust
目次

「ログファイルからエラーだけ抜き出したい」「コードベースから特定の関数を全部探したい」「設定ファイルからコメント行を除外して中身だけ見たい」

こういう場面で真っ先に出番が来るのが grep だ。そしてその進化版が Rust 製の ripgrep である。

この記事では grep の基本から実践パターン、さらに ripgrep でどれだけ快適になるかまで解説する。

grep とは

grepGlobal Regular Expression Print の略だ。テキストから正規表現にマッチする行を抽出するフィルタコマンドで、Unix/Linux の世界では最も基本的なツールの一つである。

主な特徴:

  • パイプラインの中核 — 他のコマンドと | で繋いで使うのが基本
  • ほぼ全ての Linux にプリインストール済み — サーバー上でも即使える
  • 正規表現で柔軟な検索 — 単純な文字列から複雑なパターンまで対応
  • 軽量で高速 — 巨大なログファイルでもストレスなく動く

1973年に Ken Thompson が書いた ed エディタのコマンド g/re/p(global / regular expression / print)が語源だ。50年以上現役で使われ続けている。

基本的な使い方

まずは grep の基本オプションを押さえよう。これだけで日常の検索作業の大半は対応できる。

文字列検索

bash
grep "error" logfile.txt

ファイル内の「error」を含む行がすべて表示される。

よく使うオプション

bash
# 大文字小文字を無視して検索
grep -i "error" logfile.txt

# 行番号を表示
grep -n "error" logfile.txt

# ディレクトリを再帰的に検索
grep -rn "TODO" src/

# マッチしない行を表示(除外フィルタ)
grep -v "debug" logfile.txt

# マッチした行数をカウント
grep -c "error" logfile.txt

# マッチしたファイル名のみ表示
grep -l "error" *.log

コンテキスト表示

マッチした行の前後を表示したいときは -A(After)、-B(Before)、-C(Context)を使う。

bash
# マッチした行の後ろ3行、前1行を表示
grep -A 3 -B 1 "error" logfile.txt

# 前後3行を表示(-A 3 -B 3 と同じ)
grep -C 3 "error" logfile.txt

複数パターン

bash
# OR検索(拡張正規表現)
grep -E "error|warning|fatal" logfile.txt

# 固定文字列として検索(正規表現を無効化)
grep -F "console.log(" src/app.js

正規表現パターン

grep の真価は正規表現にある。基本正規表現(BRE)と拡張正規表現(ERE)の2種類があり、-E オプションで ERE を使える。

よく使うパターン一覧

パターン意味
^pattern行頭にマッチgrep "^#" config.txt
pattern$行末にマッチgrep "\.js$" files.txt
.任意の1文字grep "h.t" words.txt
[abc]文字クラスgrep "[0-9]" data.txt
[^abc]否定文字クラスgrep "[^aeiou]" words.txt
*直前の文字の0回以上grep "ab*c" data.txt
+ (ERE)直前の文字の1回以上grep -E "[0-9]+" data.txt
? (ERE)直前の文字の0回か1回grep -E "colou?r" text.txt
\b単語境界grep -w "error" log.txt
{n,m} (ERE)n回以上m回以下grep -E "[0-9]{2,4}" data.txt

BRE vs ERE

基本正規表現(BRE)では +?{}|() をメタ文字として使うにはバックスラッシュが必要だ。拡張正規表現(ERE: -E)ではそのまま使える。

bash
# BRE: バックスラッシュが必要
grep "error\|warning" logfile.txt
grep "ab\{2,4\}" data.txt

# ERE: そのまま書ける(こちらが読みやすい)
grep -E "error|warning" logfile.txt
grep -E "ab{2,4}" data.txt

PCRE(Perl 互換正規表現)

-P オプションで Perl 互換の正規表現が使える。\d(数字)、\s(空白)、先読み・後読みなどが利用可能だ。

bash
# 郵便番号パターン(3桁-4桁)
grep -P "\d{3}-\d{4}" addresses.txt

# メールアドレスっぽい文字列を抽出
grep -oP "[\w.+-]+@[\w-]+\.[\w.]+" contacts.txt

実践ユースケース

ログファイル解析

サーバー運用で最も使う場面だ。

bash
# 特定期間のエラーを抽出(タイムスタンプ付きログ)
grep "2026-03-08.*ERROR" /var/log/app.log

# IPアドレスだけ抽出
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log

# HTTPステータスコード別に集計(grep + awk + sort の合わせ技)
grep -oE "HTTP/[0-9.]+ [0-9]+" access.log | awk '{print $2}' | sort | uniq -c | sort -rn

コードベース検索

bash
# TODO/FIXME をプロジェクト全体から検索
grep -rn "TODO\|FIXME" --include="*.ts" src/

# 特定の関数呼び出し箇所を探す
grep -rn "useState(" --include="*.tsx" src/

# import文を検索(何をどこからインポートしているか)
grep -rn "^import.*from" --include="*.ts" --include="*.tsx" src/

設定ファイルフィルタリング

bash
# コメント行と空行を除外して有効な設定だけ表示
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

# 特定のセクションを抽出
grep -A 10 "\[database\]" config.ini

パイプラインでの活用

grep は単独でも使えるが、他のコマンドと組み合わせて真価を発揮する。

bash
# 実行中のnginxプロセスを確認(grep自身を除外)
ps aux | grep "[n]ginx"

# コマンド履歴からgit関連を検索
history | grep "git"

# カーネルメッセージからエラーを抽出
dmesg | grep -i "error"

# ファイル一覧から特定の拡張子だけフィルタ
find . -type f | grep "\.mdx$"

ripgrep:モダン代替

ripgrep(コマンド名: rg)は Rust で書かれた grep の代替ツールだ。Andrew Gallant が開発し、多くの開発者がデフォルトの検索ツールとして採用している。

主な特徴:

  • 圧倒的な速度 — マルチスレッドで並列検索
  • .gitignore 自動尊重node_modulesdist を勝手にスキップ
  • Unicode 完全対応 — 日本語でも問題なく検索できる
  • バイナリファイル自動スキップ — 画像やコンパイル済みファイルを無視
  • デフォルトで再帰検索-r を付ける必要がない

インストール

powershell
winget install BurntSushi.ripgrep.MSVC

基本的な使い方

bash
# カレントディレクトリ以下を再帰検索(-r 不要)
rg "TODO"

# ファイルタイプを指定して検索
rg "TODO" --type js
rg "TODO" -t py

# globパターンで対象ファイルを絞る
rg "TODO" -g "*.tsx"

# 固定文字列として検索(正規表現を無効化)
rg -F "console.log("

# 大文字小文字を無視
rg -i "error"

# 行番号は常に表示される(デフォルト)
rg "error" src/

高度な機能

bash
# JSON形式で出力(他ツールとの連携に便利)
rg "error" --json

# 置換プレビュー(実際にはファイルを変更しない)
rg "old_func" -r "new_func"

# マッチした部分だけ表示(grepの -o に相当)
rg -o "\d{3}-\d{4}" addresses.txt

# 隠しファイルも検索対象に含める
rg --hidden "SECRET_KEY"

# .gitignore を無視して全ファイル検索
rg --no-ignore "password"

.rgignore で除外設定

プロジェクトルートに .rgignore ファイルを置くと、ripgrep 固有の除外設定ができる。書式は .gitignore と同じだ。

text
# .rgignore
dist/
coverage/
*.min.js
*.map

grep vs ripgrep

両方を理解した上で、使い分けの判断基準を整理する。

項目grepripgrep
速度(大規模リポジトリ)単一スレッドマルチスレッドで高速
.gitignore無視する自動で尊重
Unicode限定的完全対応
デフォルトの再帰検索-r が必要デフォルトで再帰
バイナリファイル要オプションで除外自動スキップ
依存関係なし(標準搭載)別途インストール
PCRE サポート-P で対応--pcre2 で対応
カラー出力--color=autoデフォルトでカラー

使い分けの結論

  • サーバー上 — grep 一択。追加インストールなしで使える
  • 開発マシン — ripgrep が圧倒的に快適。インストールして損はない
  • シェルスクリプト — 移植性を考えるなら grep。自分の環境だけなら rg

両方の基本を覚えておけば、どんな環境でも困ることはない。grep で基礎を固め、ripgrep で生産性を上げるのがベストだ。

まとめ

grep はテキスト検索の基本であり、Linux を使う限り避けて通れないコマンドだ。正規表現と組み合わせれば、ログ解析・コード検索・設定ファイルのフィルタリングなど、あらゆる場面で活躍する。

そして ripgrep は、grep の知識をそのまま活かしながら速度と利便性を大幅に向上させてくれる。.gitignore の自動尊重とマルチスレッド検索は、一度体験すると戻れなくなる。

次のステップとして、sed・awk で抽出した結果を加工する方法や、fzf と ripgrep を組み合わせたインタラクティブ検索も試してみてほしい。検索と加工を組み合わせることで、CLI での作業効率は飛躍的に上がる。

関連記事: