【完全リファレンス】Linux grepコマンドのオプション一覧と使い方|実用例80超で徹底解説

  • 作成日 2026.06.18
  • linux
【完全リファレンス】Linux grepコマンドのオプション一覧と使い方|実用例80超で徹底解説

grepはLinuxで最もよく使われるコマンドのひとつで、ファイル内検索からログ調査、シェルスクリプト処理まで、エンジニアの日常作業に欠かせないツールです。しかし、

  • 大量のオプションがあって覚えきれない
  • -E-P-Fの使い分けが分からない
  • 再帰検索でnode_modulesを除外したい
  • ログでマッチ箇所の前後行も見たい
  • 巨大ファイルで遅いがどう改善する?
  • 複数パターンを同時検索したい
  • 結果の活用方法(パイプ、xargs連携)

など、使いこなしには知識が必要です。

本記事では、grepコマンドの全主要オプションと実用パターンを、リファレンスとしてまとめ直しました。基本検索から正規表現の3バリエーション、再帰検索・除外、コンテキスト表示、ファイル絞り込み、パフォーマンス、macOSとの違い、80超の実用例、FAQまで完全網羅。この1本をブックマークすれば、grepに関するあらゆる疑問が解決します。


目次

結論:今すぐ使える基本パターン5選

時間がない方向けに、超頻出パターンを先に示します。

# ① ファイル内のキーワード検索
grep "ERROR" application.log

# ② 大文字小文字を無視
grep -i "error" application.log

# ③ ディレクトリ配下を再帰検索
grep -r "TODO" ./src/

# ④ マッチ箇所の前後3行も表示
grep -C 3 "Exception" application.log

# ⑤ 拡張子で絞って再帰検索
grep -r --include="*.py" "import" .

詳細・応用は以下で順に解説します。


grepコマンドの基本構文

grep [オプション] パターン [ファイル...]

最もシンプルな例

# ファイルから検索
grep "ERROR" /var/log/syslog

# 標準入力から検索
cat file.txt | grep "ERROR"
echo "Hello World" | grep "World"

# 複数ファイル
grep "config" file1.txt file2.txt file3.txt

結果がない場合

# マッチなしで終了コード1
grep "存在しないキーワード" file.txt
echo $?  # → 1

# マッチありで終了コード0
grep "ある キーワード" file.txt
echo $?  # → 0

シェルスクリプトで「マッチした/しなかった」を判定するのに使えます:

if grep -q "ERROR" application.log; then
    echo "エラーが見つかりました"
fi

-qは「結果を出力せず終了コードだけ返す」モードです。


主要オプション一覧表

頻度の高いものを集約した早見表です。

検索条件

オプション説明
-i大文字小文字を無視
-vマッチしない行を出力(反転)
-w単語単位でマッチ
-x行全体が一致
-cマッチした行数のみ表示
-m N最大N件でストップ

表示制御

オプション説明
-n行番号を表示
-Hファイル名を表示(強制)
-hファイル名を表示しない
-lマッチしたファイル名のみ表示
-Lマッチしなかったファイル名のみ表示
-oマッチした部分のみ表示
--colorマッチ部分を色付け
-A Nマッチ後 N 行も表示
-B Nマッチ前 N 行も表示
-C Nマッチ前後 N 行ずつ表示

パターン指定

オプション説明
-E拡張正規表現(ERE)
-PPerl互換正規表現(PCRE)
-F固定文字列として扱う
-G基本正規表現(デフォルト)
-e パターンパターン明示指定(複数可)
-f ファイルパターンをファイルから読み込み

再帰検索

オプション説明
-rディレクトリを再帰検索
-Rシンボリックリンクもたどる再帰検索
--include含めるファイルパターン
--exclude除外するファイルパターン
--exclude-dir除外するディレクトリ

その他

オプション説明
-q出力なし、終了コードのみ
-sエラーメッセージ抑制
-aバイナリも文字として扱う
-Iバイナリファイルを除外
-zNULL文字区切り(マルチライン処理)

基本的な検索オプション

-i:大文字小文字を無視

# ERROR, Error, error 全てにマッチ
grep -i "error" application.log

-v:反転(マッチしない行)

# DEBUGを含まない行
grep -v "DEBUG" application.log

# 空行を除外
grep -v "^$" config.txt

# 複数条件で除外(DEBUGとINFOを除外)
grep -v -e "DEBUG" -e "INFO" application.log

-n:行番号表示

grep -n "TODO" main.py
# 42:    # TODO: implement this
# 87:    # TODO: refactor

-c:マッチ件数のみ

# ERRORが何件あるか
grep -c "ERROR" application.log
# 23

-w:単語単位マッチ

# "test" だけにマッチ。"testing", "testcase" は対象外
grep -w "test" file.txt

-x:行全体一致

# 行全体が "ERROR" の行のみ("ERROR: ..." はマッチしない)
grep -x "ERROR" file.txt

-m N:最大件数で停止

# 最初の10件で打ち切り
grep -m 10 "ERROR" huge.log

巨大ファイルで最初のヒットだけ知りたい時に高速化できます。


表示制御オプション

-l:マッチしたファイル名だけ表示

# パターンを含むファイルだけリスト
grep -l "TODO" *.py
# main.py
# utils.py

-L:マッチしないファイル名

# Copyrightが書かれていないファイル
grep -L "Copyright" *.py

-o:マッチ部分のみ抽出

# IPアドレスっぽいものを抽出
grep -oE "\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b" access.log

# emailアドレス抽出
grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+" contacts.txt

-oマッチした文字列のみを出力します。ログから特定パターンの値だけ抽出する時に強力。

-A / -B / -C:前後の行を含める(ログ調査必須)

# マッチ後10行も表示(after)
grep -A 10 "Exception" application.log

# マッチ前5行も表示(before)
grep -B 5 "Exception" application.log

# マッチ前後3行ずつ(context)
grep -C 3 "Exception" application.log

スタックトレース調査の必須技です。

–color:色付け

# マッチ部分を色付け表示
grep --color "ERROR" application.log

多くのディストリビューションではgrepgrep --color=autoにエイリアスされており、自動的に色付けされます。

-H / -h:ファイル名表示の制御

# 単一ファイルでもファイル名表示
grep -H "ERROR" application.log

# 複数ファイルでもファイル名を表示しない
grep -h "ERROR" *.log

再帰検索(最重要機能)

ディレクトリ内のすべてのファイルを検索する機能です。

-r / -R:再帰検索

# カレント以下を再帰検索
grep -r "TODO" .

# 特定ディレクトリ
grep -r "TODO" /var/log/

# シンボリックリンクもたどる(-R)
grep -R "TODO" .

通常は-rで十分。-Rはシンボリックリンクで循環の危険があるため注意。

–include:含めるファイルパターン

# .py ファイルのみを対象に
grep -r --include="*.py" "import" .

# 複数パターン
grep -r --include="*.py" --include="*.js" "function" .

–exclude:除外するファイルパターン

# .log ファイルを除外
grep -r --exclude="*.log" "ERROR" /tmp/

# 複数
grep -r --exclude="*.log" --exclude="*.bak" "config" .

–exclude-dir:除外するディレクトリ

# node_modules を除外(最重要)
grep -r --exclude-dir="node_modules" "console.log" .

# 複数の除外
grep -r \
    --exclude-dir="node_modules" \
    --exclude-dir=".git" \
    --exclude-dir="dist" \
    "TODO" .

よく使う除外パターン

Node.js プロジェクト

grep -r \
    --exclude-dir={node_modules,.git,.next,dist,build,coverage} \
    "TODO" .

Python プロジェクト

grep -r \
    --exclude-dir={__pycache__,.venv,venv,.git,.tox,dist,build,.pytest_cache} \
    --include="*.py" \
    "import" .

Java プロジェクト

grep -r \
    --exclude-dir={target,.git,.idea,.gradle,build} \
    --include="*.java" \
    "@Override" .

.gitignore対応(再帰検索の罠)

grep.gitignoreを無視するため、node_modules等まで検索してしまいます。除外オプションを毎回書くのが面倒なら、ripgrep(後述)を使うのが現実的です。


正規表現の使い分け(-E / -P / -F / -G)

grepは4種類の正規表現エンジンを切り替えられます。

基本:BRE(Basic Regular Expression、デフォルト)

# 基本正規表現
grep "^ERROR" file.txt    # 行頭
grep "$" file.txt          # 行末
grep "[0-9]" file.txt      # 数字

-E:ERE(Extended Regular Expression、拡張)

# パイプ(または)、丸括弧、+、?、{} がエスケープなしで使える
grep -E "ERROR|WARNING" file.txt
grep -E "[0-9]+" file.txt
grep -E "https?://" file.txt
grep -E "^(GET|POST) /" access.log

または egrep でも同じ(非推奨ですが使われ続けています):

egrep "ERROR|WARNING" file.txt  # = grep -E

-P:PCRE(Perl Compatible Regular Expression)

# 後読み・先読み、\d、\w、\s等が使える
grep -P "\d{3}-\d{4}-\d{4}" file.txt        # 電話番号
grep -P "(?<=user=)\w+" file.txt             # 後読み
grep -P "\bword\b" file.txt                  # 単語境界
grep -P "^(?!#)" config.txt                  # 否定先読み

PCREは最も表現力が高い反面、対応していない環境(macOS BSD grepなど)があります。

-F:固定文字列(高速)

# 正規表現メタ文字を文字として扱う(高速)
grep -F "a.b.c" file.txt    # "a.b.c" として検索(.は任意1文字でない)

# 複数固定文字列を改行区切りで
grep -F "ERROR
CRITICAL
FATAL" file.txt

または fgrep(非推奨):

fgrep "192.168.1.1" file.txt  # = grep -F

-G:BRE 明示

# デフォルトと同じ(明示する意味は少ない)
grep -G "pattern" file.txt

使い分けの指針

状況推奨
シンプルなキーワード検索-F(最速)
単純な正規表現デフォルトまたは -G
`+?` を使いたい
\d \w 先読み後読み-P

複数パターンの検索

-e で複数パターン

# ERROR または WARNING
grep -e "ERROR" -e "WARNING" application.log

# 同じことを -E で書く
grep -E "ERROR|WARNING" application.log

-f でパターンファイル

# パターン.txt の各行をパターンとして使う
grep -f patterns.txt application.log

patterns.txt の例:

ERROR
WARNING
CRITICAL
FATAL

複数キーワードを管理しやすく、また正規表現メタ文字を考慮する必要がないためエスケープ忘れを防げます。

重複行を排除

# 検索結果の重複を排除
grep "ERROR" *.log | sort -u

ファイル指定の応用

バイナリファイルの扱い

# バイナリも文字として検索
grep -a "PATTERN" binary_file

# バイナリファイルは除外
grep -rI "PATTERN" .

# バイナリと判定したファイル名のみ通知
grep -rl --binary-files=binary "PATTERN" .

圧縮ファイル内検索

# gzip圧縮ファイル
zgrep "ERROR" application.log.gz

# bzip2
bzgrep "ERROR" application.log.bz2

# xz
xzgrep "ERROR" application.log.xz

# 複数圧縮ファイルを一括検索
zgrep "ERROR" /var/log/*.gz

標準入力との連携

# パイプ経由
ps aux | grep nginx

# プロセス除外(自分自身を除く)
ps aux | grep [n]ginx

# tail -f との連携(リアルタイム監視)
tail -f application.log | grep --line-buffered "ERROR"

--line-bufferedバッファリングを無効化し、リアルタイムで表示するために重要。


find・xargs との連携

grep単体での再帰検索ではなく、findと組み合わせる方法もあります。

find + grep

# find で対象を絞り、grep で検索
find . -name "*.py" -exec grep -l "import os" {} \;

# 高速版
find . -name "*.py" -exec grep -l "import os" {} +

find + xargs + grep

# パスに空白があっても安全
find . -name "*.py" -print0 | xargs -0 grep -l "import os"

grep の再帰検索 vs find+grep

アプローチメリット
grep -r --includeシンプル、grep単体で完結
find + grep複雑なファイル条件(更新日時など)と組み合わせ可能
# 過去24時間以内に変更された .py ファイルから検索(find活用)
find . -name "*.py" -mtime -1 -exec grep -l "TODO" {} +

# 1MB以上のファイルからのみ検索
find . -type f -size +1M -exec grep -l "PATTERN" {} +

findの詳細は[Linux find オプション一覧]の記事を参照してください。


パフォーマンス Tips

LANG=C で高速化

# UTF-8処理を無効化(ASCII限定なら大幅高速化)
LANG=C grep "PATTERN" huge_file.log

# 環境変数で永続化
export LANG=C

日本語等のマルチバイト文字を含まない検索なら、5〜10倍速くなることがあります。

-F(固定文字列)の活用

# 正規表現を使わないなら -F が最速
grep -F "192.168.1.1" huge_log.log

早期終了

# 最初の1件で終了
grep -m 1 "PATTERN" huge.log

# 結果を使わず存在確認だけ
grep -q "PATTERN" huge.log && echo "Found"

ripgrep(rg)の活用

grepはGNU実装ですが、より高速なRust製のripgrepがあります:

# インストール
sudo apt install ripgrep  # Ubuntu
brew install ripgrep      # Mac

# 使い方(grepと似ているが高速+デフォルトでgitignore対応)
rg "PATTERN"
rg -t py "import"           # Pythonファイルのみ
rg --files-with-matches "PATTERN"

利点:

  • gitignoreを自動で尊重
  • 並列処理で高速
  • 色付け・スマートケース等のデフォルト動作が便利
  • バイナリ自動スキップ

開発マシンでの日常利用ならrgへの移行をおすすめします。


実用パターン集(80超を厳選)

ログ調査系

# 直近のエラー
tail -1000 application.log | grep -i "error"

# エラーとその前後10行
grep -C 10 "Exception" application.log

# 特定時間帯のログ
grep "2026-06-17 10:" application.log

# Apache/Nginx の特定ステータスコード
grep ' 500 ' access.log
grep -E ' (4|5)[0-9]{2} ' access.log  # 4xx と 5xx

# 特定IPからのアクセス
grep "192.168.1.100" access.log

# User-Agentの集計
grep -oE '"[^"]*"$' access.log | sort | uniq -c | sort -rn | head

# 1分間に何回エラーが出たか
grep "ERROR" application.log | cut -c1-16 | sort | uniq -c

コード調査系

# TODOコメントを一覧
grep -rn "TODO" --include="*.py" .

# 関数定義を探す
grep -rn "^def " --include="*.py" .

# import文の一覧
grep -rh "^import\|^from" --include="*.py" . | sort -u

# 特定変数の使用箇所
grep -rn "DATABASE_URL" .

# ハードコードされたパスワード探索(セキュリティ)
grep -rEn "(password|secret|api_key)\s*=\s*['\"]" --include="*.py" .

設定ファイル系

# コメントを除いた有効行のみ
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

# 短くした版
grep -v "^\s*#" config.txt | grep -v "^$"

# 設定値の確認
grep "^Port" /etc/ssh/sshd_config

# ファイル内の現在の設定を一覧
grep -E "^[a-zA-Z_]+\s*=" .env

システム調査系

# 実行中のプロセス検索
ps aux | grep nginx

# 自分自身を除外する技
ps aux | grep [n]ginx

# 起動中のサービス
systemctl list-units --type=service | grep running

# CPUを使っているプロセスTop10
ps aux | sort -rn -k 3 | head -10

# 特定ポートを使うプロセス
ss -tlnp | grep ":80 "

# システムログでエラー
journalctl | grep -i error | tail -20

テキスト処理系

# 行数カウント
grep -c "PATTERN" file.txt

# 単語の出現回数
grep -oE "[a-zA-Z]+" file.txt | sort | uniq -c | sort -rn | head

# 数字のみ抽出
grep -oE "[0-9]+" file.txt

# 重複行
sort file.txt | uniq -d

# ユニーク行
sort file.txt | uniq -u

URLやIPアドレス系

# URLを抽出
grep -oE "https?://[^[:space:]]+" file.txt

# IPアドレスを抽出
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" file.txt

# メールアドレスを抽出
grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt

Git連携

# 変更履歴からのキーワード検索(git log側)
git log --all --grep="bugfix"

# 変更内容からの検索
git log -S "search_term"

# 現在のリポジトリから検索(gitignore考慮)
git grep "PATTERN"

# 過去のコミットも含む
git grep "PATTERN" $(git rev-list --all)

git grepは通常のgrepより高速で、.gitignoreを自動考慮します。

docker 関連

# Dockerコンテナのログから検索
docker logs container_name 2>&1 | grep ERROR

# 全コンテナのエラーログ
for c in $(docker ps -q); do
    echo "=== $c ==="
    docker logs $c 2>&1 | grep -i error | tail -5
done

macOS(BSD grep)との違い

macOSはgrepはBSD系で、Linuxのgrep(GNU)と一部挙動が異なります。

主な違い

機能GNU grep(Linux)BSD grep(macOS)
-P(PCRE)✅ あり❌ なし(macOS既定)
--include✅ あり✅ あり
--exclude-dir✅ あり✅ あり
-A/-B/-C✅ あり✅ あり
色出力 --color✅ デフォルトauto✅ あり
後方互換 egrep/fgrep⚠️ 非推奨✅ あり

Mac で GNU grep を使う

brew install grep
# /opt/homebrew/bin/ggrep として使える
ggrep -P "\d+" file.txt

PATHを調整すればgrepとして使えます:

echo 'export PATH="/opt/homebrew/opt/grep/libexec/gnubin:$PATH"' >> ~/.zshrc

macOS で動かない代表例

# ❌ macOS では失敗
grep -P "\d+" file.txt

# ✅ macOS でも動作(-Eを使う)
grep -E "[0-9]+" file.txt

トラブルシューティング

マッチしないはずがマッチする

# 正規表現メタ文字が解釈されている
grep "a.b" file.txt  # "axb", "ayb" などにもマッチ

# 文字として扱うには -F
grep -F "a.b" file.txt

結果が出ない

考えられる原因:

  • 大文字小文字の違い → -iを試す
  • ファイルが空またはバイナリ → -aで文字列として処理
  • パターンがエスケープされていない → \ でエスケープ or -F

Binary file matches

# 「Binary file XXX matches」表示
grep "PATTERN" mixed_file
# Binary file mixed_file matches

# テキストとして強制処理
grep -a "PATTERN" mixed_file

# バイナリは検索しない
grep -I "PATTERN" mixed_file

「No such file or directory」が大量に出る

# stderr を捨てる
grep -r "PATTERN" / 2>/dev/null

grep が遅い

主な原因と対処:

  1. 巨大ファイル → LANG=C grep で高速化
  2. 正規表現が複雑 → -F を使う or 単純化
  3. ディレクトリが大きい → --exclude-dirで絞る
  4. それでも遅い → ripgrep(rg)を試す

パイプの後ろが反応しない

# ❌ バッファリングで遅い・反応しない
tail -f file.log | grep "PATTERN" | awk '{...}'

# ✅ ラインバッファリング有効化
tail -f file.log | grep --line-buffered "PATTERN" | awk '{...}'

よくある質問(FAQ)

Q1. grep と egrep の違いは?

egrep = grep -E です。POSIX的には egrep非推奨で、grep -E を使うのが標準とされています。

# 同じ意味
egrep "ERROR|WARNING" file.txt
grep -E "ERROR|WARNING" file.txt

Q2. grep と fgrep の違いは?

fgrep = grep -F で、固定文字列検索(正規表現を解釈しない)です。これも非推奨。

# 同じ意味
fgrep "192.168.1.1" file.txt
grep -F "192.168.1.1" file.txt

Q3. -A と -B と -C の覚え方は?

  • -A = After(マッチ後)
  • -B = Before(マッチ前)
  • -C = Context(前後)
grep -A 3 "Exception" log   # マッチ後3行
grep -B 3 "Exception" log   # マッチ前3行
grep -C 3 "Exception" log   # マッチ前後3行

Q4. 「自分自身が grep にマッチしてしまう」を防ぐには?

# ps aux | grep nginx だと grep nginx 自身もマッチ
ps aux | grep nginx

# 解決1:角括弧トリック
ps aux | grep [n]ginx

# 解決2:grep を除外
ps aux | grep nginx | grep -v grep

# 解決3:pgrep を使う
pgrep -fl nginx

Q5. ファイル名も一緒に出したい

複数ファイル検索時は自動でファイル名が表示されますが、単一ファイル時は出ません:

# -H で強制表示
grep -H "PATTERN" file.txt
# file.txt:該当行

Q6. -P オプションが「ライセンスのため使えない」と出ます

GNU grepでPCREサポートがビルドされていない場合に発生します。pcregrepを使うか、ripgrepに移行してください:

sudo apt install pcregrep
pcregrep "\d+" file.txt

Q7. 結果に色を付けたい

# 色付け
grep --color "PATTERN" file.txt

# 環境変数で永続化(.bashrcに追加)
export GREP_OPTIONS='--color=auto'  # 非推奨だが多くの環境で動く

# エイリアスで設定(推奨)
alias grep='grep --color=auto'

Q8. 改行をまたいだパターンを検索したい

grepは行単位処理のため、複数行マッチは標準でできません。代替策:

# -z で NULL区切り(ファイル全体を1行として扱う)
grep -Pz "(?s)BEGIN.*?END" file.txt

# pcregrep の M (multiline) オプション
pcregrep -M "BEGIN.*?END" file.txt

# またはawk
awk '/BEGIN/,/END/' file.txt

Q9. 大量のファイルから速く検索するには?

# ripgrep(最速)
rg "PATTERN"

# ag (the silver searcher) も高速
ag "PATTERN"

# grep の並列化(xargs)
find . -name "*.txt" -print0 | xargs -0 -P 8 grep "PATTERN"

Q10. grep の結果を別ファイルに保存しつつ表示も見たい

# tee を使う
grep "PATTERN" file.txt | tee results.txt

# 追記したい場合
grep "PATTERN" file.txt | tee -a results.txt

Q11. シェルスクリプトでgrepの結果を変数に入れたい

# 結果が複数行ある場合
RESULT=$(grep "PATTERN" file.txt)
echo "$RESULT"

# 件数を取得
COUNT=$(grep -c "PATTERN" file.txt)
echo "Found $COUNT matches"

# 存在確認のみ
if grep -q "PATTERN" file.txt; then
    echo "Found"
fi

Q12. grep より新しい・速いツールはありますか?

ツール特徴
ripgrep (rg)Rust製、最速、gitignore対応
ag (the silver searcher)Go製、ripgrepの先駆者
ackPerl製、開発者向け
git grepgitリポジトリ専用、ripgrep並み高速

開発マシンでの日常使いならripgrepを強く推奨します。


参考リンク・関連資料

公式ドキュメント

正規表現

代替ツール

関連記事(本サイト)


まとめ

grepコマンドはLinuxで最頻出の検索ツール。要点を再整理します。

  • 基本構文: grep [オプション] パターン [ファイル...]
  • 超頻出オプション: -i(大小無視)、-r(再帰)、-n(行番号)、-v(反転)、-C N(前後N行)
  • 正規表現の使い分け: -F(固定)、デフォルト(BRE)、-E(ERE)、-P(PCRE)
  • 再帰検索の鍵: --include/--exclude/--exclude-dir
  • 複数パターン: -e 複数指定、-f ファイル指定
  • xargs/findとの連携: -print0 | xargs -0 grepfind -exec grep
  • パフォーマンス: LANG=C-F-m、ripgrep への移行
  • macOS注意: BSD grepは-P非対応、HomebrewでGNU grep可
  • 代替ツール: ripgrep(rg)が圧倒的に高速&便利

これらの知識は、ログ調査・コード探索・サーバー運用・テキスト処理など、エンジニアの日常業務すべてで活用できます。本記事をブックマークしておけば、いつでも適切なgrepコマンドを組み立てられるようになります。


本記事は2026年6月時点の情報をもとに、GNU grep 3.x(Ubuntu 24.04標準)、BSD grep(macOS Sonoma/Sequoia)での動作確認に基づき作成しています。バージョンによってオプション挙動が異なる場合があるため、最新の情報は公式マニュアルもあわせてご確認ください。