この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: grep 文字列の検索
SEOタイトル: Linux grep コマンド完全ガイド

この記事の要点
  • grep はファイルから正規表現でパターンマッチした行を抽出する Unix の定番コマンド
  • 基本: grep "pattern" file、ディレクトリ再帰は -r、大文字小文字無視は -i
  • 便利オプション: -n(行番号) -v(反転) -l(ファイル名のみ) -c(件数) -A/-B/-C(前後行)
  • 拡張正規表現は -E (egrep)、固定文字列は -F (fgrep)、複数パターンは -e を重ねる
  • 大規模コードは ripgrep (rg) が圧倒的に高速で .gitignore も尊重 → 推奨

grep の基本

grep (Global Regular Expression Print) は、ファイル中で正規表現にマッチする行を出力する Unix 標準コマンドです。ログ解析・ソース検索・grep | awk のパイプ処理など、Linux 作業の最頻出ツールです。

# 基本: ファイルから pattern を含む行を抽出
grep "ERROR" /var/log/syslog

# 複数ファイル
grep "TODO" *.php

# 標準入力から
cat access.log | grep "404"
ps aux | grep nginx

頻出オプション一覧

オプション意味
-i大文字小文字を区別しないgrep -i error log
-r / -Rディレクトリ再帰grep -r "TODO" src/
-n行番号表示grep -n func main.go
-vマッチしない行 (反転・除外)grep -v "^#" conf
-lマッチしたファイル名のみgrep -rl password .
-Lマッチしなかったファイル名のみgrep -rL TODO src/
-cマッチ件数のみgrep -c ERROR log
-oマッチ部分のみ抽出grep -oE "[0-9]+" file
-w単語境界一致grep -w int main.c
-x行全体一致grep -x "exact" file
-E拡張正規表現 (egrep)grep -E "cat|dog"
-F固定文字列 (fgrep)grep -F "1.2.3"
-PPerl 互換正規表現grep -P "\d+"
-A Nマッチ行の後 N 行も表示grep -A 3 error log
-B Nマッチ行の前 N 行も表示grep -B 3 error log
-C N前後 N 行 (Context)grep -C 3 error log
--includeファイル名パターンで絞りgrep -r --include="*.py" foo .
--exclude-dirディレクトリ除外grep -r --exclude-dir=node_modules .

正規表現の使い分け

モードコマンド特徴
基本正規表現 (BRE)grep+ ? | ( )\ エスケープ必要
拡張正規表現 (ERE)grep -E / egrep+ ? | ( ) をそのまま使える
Perl 互換 (PCRE)grep -P\d \w \s 等の Perl 表記が使える
固定文字列grep -F / fgrep正規表現として解釈しない (高速)
# BRE: + を使うには \ 必要
grep "a\+b" file

# ERE: そのまま使える
grep -E "a+b" file

# PCRE: \d 等が使える
grep -P "\d{3}-\d{4}" file

# 固定文字列: 1.2.3 がドットでなくリテラル
grep -F "1.2.3" file

複数パターンの検索

# 複数パターン (OR)
grep -e "ERROR" -e "WARN" log

# ファイルに書かれたパターンリスト
grep -f patterns.txt log

# 拡張正規表現で OR
grep -E "ERROR|WARN|FATAL" log

# AND (パイプで連結)
grep "ERROR" log | grep "database"

前後の行も見たい (Context)

エラー行だけ見ても原因が分からないとき、前後の行を取り出すと文脈が掴めます:

# マッチ行の後 5 行も
grep -A 5 "Exception" app.log

# マッチ行の前 5 行も
grep -B 5 "Exception" app.log

# 前後 5 行ずつ (Context)
grep -C 5 "Exception" app.log

# 行番号付き
grep -nC 3 "Exception" app.log

再帰検索 (ソースツリー全体)

# プロジェクト全体から TODO を探す
grep -rn "TODO" .

# 特定拡張子だけ
grep -rn --include="*.php" "function login" .

# 除外ディレクトリ
grep -rn --exclude-dir={node_modules,vendor,.git} "secret" .

# ファイル名だけ表示
grep -rl "deprecated" src/

ログ解析の実例

# Nginx の 5xx エラー行のみ
grep -E " 5[0-9]{2} " /var/log/nginx/access.log

# 5xx の件数
grep -cE " 5[0-9]{2} " /var/log/nginx/access.log

# 直近の特定 IP のリクエスト
tail -10000 access.log | grep "203.0.113.5"

# ERROR を除く WARN 以上
grep -E "WARN|ERROR|FATAL" app.log | grep -v "ERROR.*known"

# 時刻フィルタ
grep "2026-06-10 12:" app.log | grep ERROR

ripgrep (rg) との比較

近年は Rust 製の ripgrep (rg) が標準ツールとして広く使われています。grep より圧倒的に高速で、.gitignore を自動尊重する点も便利です。

機能grepripgrep (rg)
速度標準5〜10 倍高速
再帰検索grep -r既定で再帰 (rg pattern)
.gitignore 尊重不可既定で尊重
正規表現BRE/ERE/PCRERust regex (PCRE 風)
Unicode制限あり完全対応
カラー--color=auto既定でカラー
# ripgrep のインストール
sudo apt install ripgrep
brew install ripgrep

# 使い方は grep とほぼ同じ
rg "ERROR" .
rg -i "error" .
rg -t py "def main"          # Python ファイルのみ
rg -g "*.php" "function"     # glob で絞る
rg -C 3 "Exception"

パフォーマンス Tips

  • 正規表現が不要なら -F を付ける (高速化)
  • LC_ALL=C grep でロケール処理を省くと数倍速くなる場合あり
  • 大きなログは grep | head で早期打ち切り
  • 連続パイプより grep -e A -e B でまとめると速い
  • 巨大ファイル走査は ripgrep

FAQ

Q: 「Binary file ... matches」と出る
A: バイナリと判定されたファイル。テキスト扱いするには -a (or --text)、無視するには -I

Q: 自分の grep プロセスも引っかかる (ps | grep nginx)
A: 古典的なテクニックで ps aux | grep [n]ginx と書くと、自プロセスは正規表現にマッチせず除外されます。

Q: マッチ部分だけ色付けしたい
A: 多くのディストリで --color=auto が既定エイリアス。明示的には grep --color=always