grep(グレップ)は、ファイルや標準入力(パイプ)から指定した文字列・正規表現パターンに一致する行を高速に検索・抽出するLinuxの必須コマンドです。
「オプションの組み合わせを毎回忘れてしまう」「実務ですぐに動くコピペ例が知りたい」「最近よく聞くripgrepと何が違うのか」というエンジニア向けに、最重要オプション6選の早見表、目的別の逆引き一覧、ripgrep(rg)との性能・使い分け比較、そして実務で頻出する検索パターン20選を体系的にまとめました。日々のログ調査やソースコード解析の辞書としてご活用ください。
- 【まずはここから】必須オプション(-r, -i, -n, -v, -E, -C)最速早見表
- 【目的別】grepコマンド主要オプション逆引き一覧表
- grep vs ripgrep(rg)徹底比較|使い分けと検索速度対比
- grepコマンドの基本構文と実務の鉄則
- grep主要オプション完全一覧表
- 実務で役立つgrep正規表現・検索パターン20選
- 1. 大文字・小文字を区別せずに検索(-i)
- 2. 単語境界での完全一致検索(-w)
- 3. 行全体の完全一致検索(-x)
- 4. マッチした部分文字列だけを抽出(-o)
- 5. 固定文字列の超高速検索(-F)
- 6. 複数条件のOR検索(拡張正規表現 -E)
- 7. 複数条件のAND検索(パイプ連携)
- 8. 設定ファイルからコメント行と空行を除外して表示
- 9. 特定の拡張子・ディレクトリを除外して再帰検索
- 10. 一致しない行を反転抽出(-v)
- 11. 行頭(^)および行末($)の厳格マッチング
- 12. IPアドレス・ポート番号のパターン抽出
- 13. 日時・タイムスタンプ指定でのログ抽出
- 14. メールアドレスやURL形式のパターンマッチング
- 15. 文字クラスと数量子を活用した柔軟検索
- 16. エラー発生前後のコンテキスト抽出(-B / -A / -C)
- 17. 一致したファイル名のみの一覧表示(-l / -L)
- 18. gzip圧縮ログを解凍せずに直接検索(zgrep)
- 19. psとgrep連携で自分自身のgrepプロセスを除外
- 20. シェルスクリプト内での成否判定(-q)
- よくあるエラー・落とし穴と対処法
- まとめ
- 関連記事・コマンド早見表
- 関連記事
【まずはここから】必須オプション(-r, -i, -n, -v, -E, -C)最速早見表
grepには多数のオプションがありますが、実務の9割以上は以下の6つの必須オプションでカバーできます。迷ったらまずこの表を確認してください。
| オプション | 機能(やりたいこと) | 実用コマンド例(コピペOK) |
|---|---|---|
-r | ディレクトリ内を再帰的に検索 | grep -r "TODO" ./src/ |
-i | 大文字・小文字を無視して検索 | grep -i "error" /var/log/syslog |
-n | 一致した行番号を表示 | grep -n "main" app.py |
-v | 条件に一致しない行を抽出(除外) | grep -v "^#" config.conf |
-E | 拡張正規表現(複数条件のOR検索等) | grep -E "error|fatal|warn" app.log |
-C NUM | マッチ行の前後NUM行(文脈)も表示 | grep -C 3 "Exception" app.log |
複数のオプションは grep -rin "error" ./src/ のようにまとめて指定可能です(大文字小文字無視 + 行番号表示 + 再帰検索)。
【目的別】grepコマンド主要オプション逆引き一覧表
「やりたい処理」から逆引きできる一覧表です。コマンド例をコピーしてそのままターミナルで実行できます。
| やりたいこと | コマンド例(コピペOK) | 使用オプション |
|---|---|---|
| 大文字・小文字を無視して検索 | grep -i "error" app.log | -i(ignore-case) |
| 行番号を表示して検索 | grep -n "main" main.c | -n(line-number) |
| 条件に一致しない行を抽出(除外) | grep -v "DEBUG" app.log | -v(invert-match) |
| ディレクトリ配下を再帰的に検索 | grep -r "TODO" ./src/ | -r(recursive) |
| 一致したファイル名だけを表示 | grep -rl "API_KEY" ./src/ | -l(files-with-matches) |
| 特定ファイル・ディレクトリを除外 | grep -r --exclude="*.log" --exclude-dir=node_modules "TODO" . | --exclude, --exclude-dir |
| 複数条件のOR検索(拡張正規表現) | grep -E "error|fatal|fail" app.log | -E(extended-regexp) |
| 複数条件のAND検索(パイプ連携) | grep "error" app.log | grep "timeout" | パイプ連携 |
| マッチ行の前後の行(文脈)も表示 | grep -C 3 "Exception" app.log | -C NUM(前後NUM行) |
| マッチした行数(件数)をカウント | grep -c "404" access.log | -c(count) |
| 単語単位で完全一致(単語境界) | grep -w "port" config.yml | -w(word-regexp) |
| 行全体で完全一致 | grep -x "ENABLE=true" settings.env | -x(line-regexp) |
| マッチした文字列部分のみ抽出 | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log | -o(only-matching) |
| バイナリファイルを無視して検索 | grep -rI "secret" ./ | -I(ignore-binary) |
| 終了ステータスのみ判定(出力非表示) | if grep -q "OK" health.txt; then ... | -q(quiet) |
grep vs ripgrep(rg)徹底比較|使い分けと検索速度対比
近年、Rust製の高速文字列検索ツール ripgrep(rg コマンド) が急速に普及しています。「grepとripgrepのどちらを使うべきか?」と迷うエンジニア向けに、機能・速度・使い分けの対比表を用意しました。
| 比較項目 | grep コマンド | ripgrep(rg コマンド) |
|---|---|---|
| 標準搭載 / インストール | ほぼすべてのLinux/Unixに標準搭載(即使用可) | 事前インストールが必要(cargo / apt / brew 等) |
| 再帰検索のデフォルト | ファイル指定が必要(再帰は -r / -R) | デフォルトでカレント配下を自動再帰検索 |
| .gitignore / 隠しファイル | すべて検索(除外は --exclude-dir が必要) | .gitignore や隠しファイルをデフォルトで自動除外 |
| バイナリファイルの扱い | デフォルトで探索(除外は -I が必要) | デフォルトでバイナリファイルを自動スキップ |
| 検索速度(大規模コード) | 標準的(シングルスレッドベース) ※ LC_ALL=C で高速化可能 | 圧倒的に高速(マルチスレッド・SIMD並列最適化) |
| パイプ / スクリプト適性 | 極めて高い(POSIX準拠、互換性抜群) | 対話的開発向き(スクリプトでも利用可能) |
| カラー表示 / 行番号 | オプション指定(-n, --color) | デフォルトで行番号・ファイル名・カラー表示 |
実務における賢い使い分け基準
- grep を使うべき場面:
- 本番サーバーや踏み台サーバーなど、外部ツールを勝手にインストールできない環境
- シェルスクリプト内の処理やCI/CDパイプライン(環境を選ばず確実に動作させたい場合)
tail -f | grep "ERROR"やps aux | grep nginxなどパイプラインでの標準入力フィルタリング
- ripgrep(rg)を使うべき場面:
- ローカルPCでのソースコード調査・リポジトリ全体の探索(
node_modulesや.gitを意識せず高速検索) - 数万〜数十万ファイル規模の大規模プロジェクトでの高速テキスト検索
- ローカルPCでのソースコード調査・リポジトリ全体の探索(
ripgrepのインストール方法や具体的なコマンド例は、rgコマンド(ripgrep)の使い方|インストール手順と主要オプション早見表 で詳しく解説しています。
grepコマンドの基本構文と実務の鉄則
# 基本構文
grep [オプション] '検索パターン' [対象ファイルまたはディレクトリ...]
1. 検索パターンはシングルクォートで囲むのが基本
検索パターンにスペースや特殊文字(*, $, |, ., ? 等)が含まれる場合、シェルによる意図しない変数展開やワイルドカード解釈を防ぐため、必ずシングルクォート('...')で囲むのが鉄則です。
シェル変数を展開して動的に検索したい場合のみ、ダブルクォート("...")を使用します。
2. 不要な cat パイプ(UUOC)を避ける
cat file.log | grep pattern のようにパイプを挟む記述は、無駄なプロセスを生成してリソースを消費します(UUOC: Useless Use of cat)。ファイル指定が可能な場合は、直接 grep pattern file.log と記述しましょう。
grep主要オプション完全一覧表
| オプション | 名称・機能 | 実用例・使いどころ |
|---|---|---|
-i | 大文字・小文字を無視(ignore-case) | grep -i error app.log(ERROR/Error/errorをすべて検出) |
-v | 条件に一致しない行を抽出(invert-match) | grep -v "^#" config.conf(コメント行を除外) |
-r / -R | ディレクトリ配下を再帰検索(recursive) | grep -r "API_KEY" ./src/(-Rはシンボリックリンクを追従) |
-n | 一致行の行番号を表示(line-number) | grep -n "function" index.js(ソースコードの特定行確認) |
-l | 一致したファイル名のみ表示(files-with-matches) | grep -rl "DB_HOST" /etc/(該当ファイルの一覧化) |
-L | 一致しなかったファイル名を表示(files-without-match) | grep -rL "LICENSE" ./packages/(ライセンス未記載の検出) |
-c | 一致した行数をカウント(count) | grep -c "ERROR" /var/log/syslog(エラー発生件数の集計) |
-E | 拡張正規表現を有効化(extended-regexp) | grep -E "apple|banana" list.txt(| や + や ? を直接使用) |
-F | 固定文字列として検索(fixed-strings) | grep -F "192.168.1.1" access.log(正規表現を解釈せず最速化) |
-w | 単語全体で完全一致(word-regexp) | grep -w "log" script.sh(loginやblogを除外) |
-x | 行全体で完全一致(line-regexp) | grep -x "true" settings.txt(余計な文字を含まない完全一致) |
-o | マッチした文字列のみ出力(only-matching) | grep -oE "[0-9]+" file.txt(数値やIPのみ抜き出す) |
-A NUM | マッチ行の後ろ(After)NUM行を表示 | grep -A 5 "Traceback" error.log(エラー詳細・スタックトレース確認) |
-B NUM | マッチ行の前(Before)NUM行を表示 | grep -B 3 "panic:" crash.log(クラッシュ直前の処理確認) |
-C NUM | マッチ行の前後(Context)NUM行を表示 | grep -C 3 "FATAL" server.log(前後文脈の把握) |
-q | 出力を抑制し終了コードのみ返す(quiet) | if grep -q "OK" health.txt; then ...(シェルスクリプトの条件分岐) |
-I | バイナリファイルを無視(ignore-binary) | grep -rI "secret" .(画像やバイナリのノイズ防止) |
--exclude | 特定パターンのファイルを除外 | grep -r --exclude="*.min.js" "data" . |
--exclude-dir | 特定ディレクトリを除外 | grep -r --exclude-dir={.git,node_modules,dist} "foo" . |
実務で役立つgrep正規表現・検索パターン20選
日常のサーバー運用・障害調査・開発業務で即座にコピペして使える実践的な検索パターン20選をカテゴリ別に解説します。
1. 大文字・小文字を区別せずに検索(-i)
# ERROR, Error, error など表記揺れを一括検索
grep -i 'error' /var/log/syslog
2. 単語境界での完全一致検索(-w)
grep 'port' だと report や support にも一致してしまいます。-w オプションを使うことで、独立した単語 port のみに絞り込めます。
# support や export を除外して "port" 単語のみに一致
grep -w 'port' /etc/services
3. 行全体の完全一致検索(-x)
# "ENABLE=true" など行全体が完全に一致する行だけを抽出
grep -x 'ENABLE=true' /etc/default/*
4. マッチした部分文字列だけを抽出(-o)
行全体ではなく、マッチした文字列そのものを取り出したいときに重宝します。
# ログからアクセス元IPアドレスのみを抽出してユニーク一覧化
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /var/log/nginx/access.log | sort -u
5. 固定文字列の超高速検索(-F)
正規表現の記号(. や * や [ 等)を特殊文字としてではなく文字通りに検索したい場合、-F を指定すると正規表現エンジンのコンパイル処理をスキップし、高速に処理できます。
# ドットを「任意の一文字」ではなく通常のピリオドとして高速検索
grep -F '192.168.1.1' /var/log/nginx/access.log
6. 複数条件のOR検索(拡張正規表現 -E)
# error, warn, fatal のいずれかを含む行を抽出
grep -E 'error|warn|fatal' /var/log/app/application.log
7. 複数条件のAND検索(パイプ連携)
同じ行の中に指定した複数のキーワードがすべて含まれている行を抽出します。
# "error" を含み、かつ "timeout" も含む行を抽出
grep 'error' /var/log/app/application.log | grep 'timeout'
8. 設定ファイルからコメント行と空行を除外して表示
設定ファイルの有効な設定項目だけを一覧表示する実務の定番テクニックです。
# #で始まるコメント行と空行を同時に除外してスッキリ表示
grep -v -E '^(#|$)' /etc/nginx/nginx.conf
# ; で始まるコメント行やインデント付きコメントも除外する場合
grep -v -E '^[[:space:]]*(#|;|$)' /etc/php/8.3/fpm/php.ini
9. 特定の拡張子・ディレクトリを除外して再帰検索
# node_modules や .git、ログファイルを除外してソースコード内を再帰検索
grep -rn --exclude="*.log" --exclude="*.min.js" --exclude-dir={.git,node_modules,vendor,dist} "API_ENDPOINT" ./
10. 一致しない行を反転抽出(-v)
# ステータスコード200(正常)以外のログ行を抽出
grep -v 'HTTP/1.1" 200' /var/log/nginx/access.log
11. 行頭(^)および行末($)の厳格マッチング
# 行頭が "server" で始まるブロック定義を検索
grep '^server' /etc/nginx/conf.d/*.conf
# 行末がセミコロンで終わっていない行を検出
grep -v ';$' source_code.txt
12. IPアドレス・ポート番号のパターン抽出
# IPv4アドレス形式に合致する行を抽出
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/auth.log
13. 日時・タイムスタンプ指定でのログ抽出
# 2026年8月30日 14時台のログ行のみを抽出
grep '^2026-08-30 14:' /var/log/app/production.log
14. メールアドレスやURL形式のパターンマッチング
# メールアドレス形式に一致する文字列を抽出
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' user_list.csv
15. 文字クラスと数量子を活用した柔軟検索
# HTTP 4xx / 5xx エラーレスポンス(400〜599)を抽出
grep -E 'HTTP/1\.[01]" [45][0-9]{2}' /var/log/nginx/access.log
16. エラー発生前後のコンテキスト抽出(-B / -A / -C)
エラーログを調査する際、エラー行だけでは前後の状況が掴めないことがよくあります。-B(前行)、-A(後行)、-C(前後行)を使い分けましょう。
# Exception発生前の3行と発生後の5行(スタックトレース)を抽出
grep -B 3 -A 5 'NullPointerException' /var/log/app/app.log
# エラー発生の前後各3行をまとめて表示
grep -C 3 'FATAL' /var/log/syslog
ログからの詳しい原因特定手順については、エラーメッセージを素早く探す方法|grepでログから原因を抽出する基本 もあわせてご覧ください。
17. 一致したファイル名のみの一覧表示(-l / -L)
# "TODO" が含まれるファイル名だけを出力
grep -rl "TODO" ./src/
# "Strict-Transport-Security" ヘッダーが未設定のnginx設定ファイルを一覧化
grep -rL "Strict-Transport-Security" /etc/nginx/sites-available/
18. gzip圧縮ログを解凍せずに直接検索(zgrep)
ログローテーションで .gz に圧縮された過去ログは、gunzip で解凍することなく zgrep コマンドでそのまま検索できます。
# 圧縮された過去ログから500エラーを直接検索
zgrep 'HTTP/1.1" 500' /var/log/nginx/access.log.*.gz
19. psとgrep連携で自分自身のgrepプロセスを除外
ps aux | grep nginx を実行すると、grep nginx 自身が結果に含まれてしまいます。文字クラス [] を使うか pgrep を使うのが実務の鉄則です。
# 文字クラス[]を使って自己プロセスを除外
ps aux | grep '[n]ginx'
# または pgrep コマンドでプロセス一覧を確認
pgrep -a nginx
20. シェルスクリプト内での成否判定(-q)
-q オプションを使うと標準出力を一切出さず、一致したかどうかの終了ステータス(0: 一致、1: 不一致)のみを返します。
# 設定ファイル内に特定のディレクティブが存在するか判定
if grep -q 'server_tokens off;' /etc/nginx/nginx.conf; then
echo "セキュリティ設定は有効です"
else
echo "警告: server_tokens off が設定されていません"
fi
よくあるエラー・落とし穴と対処法
| トラブル・現象 | 原因 | 解決策 |
|---|---|---|
Binary file ... matches と出て中身が見えない | バイナリファイル(画像や圧縮ファイル)がヒットした | ノイズ除外は -I(大文字i)、テキストとして強制表示は -a を指定 |
| や + や ? が正規表現として動かない | デフォルトの基本正規表現(BRE)ではエスケープが必要 | -E オプションを付与して拡張正規表現(ERE)を有効化する |
ハイフン(-)から始まる文字列を検索するとエラーになる | grepのオプションとして誤解釈されてしまう | grep -- "-option-name" file.txt のように -- で区切る |
| 数GB以上の巨大ログファイルの検索が極端に遅い | UTF-8マルチバイト文字のロケール検証オーバーヘッド | LC_ALL=C grep "pattern" big.log でバイト単位処理にして劇的高速化 |
大規模ファイルでの超高速化テクニック(LC_ALL=C)
GB単位の巨大ログファイルを grep する場合、環境変数 LC_ALL=C を先頭に付与することで、マルチバイト文字の判定をスキップし、ASCIIバイト単位の最速モードで動作させることができます。
# 通常のgrepよりも数倍〜10倍近く高速に検索
LC_ALL=C grep 'CRITICAL' /var/log/huge_application.log
まとめ
- 必須6オプション(
-r,-i,-n,-v,-E,-C) で実務の9割を即座に解決 - 本番ログ・スクリプト連携は
grep、大規模リポジトリ探索はripgrep(rg)と使い分ける - 複数条件は
-E 'A|B'(OR)やパイプgrep A | grep B(AND)、巨大ファイルはLC_ALL=Cで超高速化

コメント