タイトル: grep 文字列の検索
SEOタイトル: Linux grep コマンド完全ガイド
| この記事の要点 |
|
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" |
-P | Perl 互換正規表現 | 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 を自動尊重する点も便利です。
| 機能 | grep | ripgrep (rg) |
|---|---|---|
| 速度 | 標準 | 5〜10 倍高速 |
| 再帰検索 | grep -r | 既定で再帰 (rg pattern) |
.gitignore 尊重 | 不可 | 既定で尊重 |
| 正規表現 | BRE/ERE/PCRE | Rust 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。