grepコマンドとは?基本構文・オプション・正規表現からログ検索まで実装者向けに解説【2026年版】
grepコマンドは、ファイルや標準入力のテキストから、指定したパターンに一致する行だけを抜き出して表示するコマンドです。この記事では、grep パターン ファイルという基本構文と、実務で使う-i(大小無視)・-v(反転)・-n(行番号)・-r(再帰)・-c(件数)・-A/-B/-C(前後行)を実行例つきで整理します。あわせて、基本正規表現BREと拡張正規表現ERE(-E)の使い分け、GNU grep 3.8でegrep・fgrepが非推奨警告を出すようになった変更、そしてripgrepとの使い分けやログ解析でのパイプライン設計まで、実装者が本番で迷わないところまで踏み込みます。
目次
まとめ:grepの要点とripgrep・用途別の使い分けの判断基準
grepは、テキストの中から条件に合う行を1行で絞り込むための検索コマンドです。ファイルを直接渡すだけでなく、ps aux | grep nginxのようにパイプで他コマンドの出力を受け取れるため、ログ調査やプロセス確認の起点になります。まず押さえるのは、パターンと対象を並べる基本構文と、頻度の高い数個のオプションだけです。
正規表現は、記号をそのまま使いたいときに-Eで拡張正規表現へ切り替える、という一点を覚えれば実務は回ります。2022年9月のGNU grep 3.8以降、egrep・fgrepは実行すると非推奨の警告を出すため、スクリプトはgrep -E・grep -Fへ寄せておくのが安全側です。数万ファイルのコード検索やギガ単位のログでは、grepより高速なripgrepへ切り替える判断も要ります。単発の行抽出はgrep、巨大なツリーの全文検索はripgrep、固定文字列だけなら-F。この軸で選び分けてください。
grepコマンドの仕組みと標準入力・パイプを介したテキスト検索の流れ
grepは Global Regular Expression Print の頭字語で、行単位でパターンに一致する箇所を出力する設計です。処理の対象はファイルの中身か、パイプで流れてくる別コマンドの出力になります。まず、grepが何を入力に取り、何を返すのかを押さえます。
grepの定義とコマンド名の由来(g・re・pの3語)と検索対象
grepという名前は、テキストエディタedの行操作コマンドg/re/p(global / regular expression / print、=全行に対して正規表現に一致する行を表示)に由来します。grepは1行ずつパターン照合し、一致した行をそのまま出力します。照合の単位はあくまで「行」で、複数行にまたがるパターンは既定では扱いません。対象はテキストファイルで、バイナリファイルに当たると既定では一致有無だけを報告します。grepが動く土台はLinux・UNIX系のシェル環境で、実行者やパーミッション、パスの概念を含む前提はLinuxの仕組みとサーバー用途に整理しています。
基本構文(grep パターン ファイル)とパイプでの標準入力検索
基本構文は「grep [オプション] パターン 対象ファイル」です。パターンに空白や記号を含むときは、シェルの展開を避けるため二重引用符で囲みます。
- ファイルから検索:
grep "error" app.log - 複数ファイルをまとめて検索:
grep "error" app.log app2.log - 他コマンドの出力を検索:
ps aux | grep nginx
ファイル名を省略してパイプで受け取ると、grepは標準入力を検索します。tailやcat、journalctlの出力を|でつなぐ形が、ログ調査での定番です。複数ファイルを渡すと、既定で各行の先頭に「ファイル名:」が付くため、どのファイルの何行目かを追いやすくなります。
終了ステータス(0・1・2)を使ったシェルスクリプトの条件分岐
grepは表示だけでなく、一致したかどうかを終了ステータスで返します。一致あり=0、一致なし=1、ファイルが開けない等のエラー=2です。この仕様を使うと、シェルスクリプトで「その文字列が含まれていたら処理する」という分岐を書けます。
- 存在確認だけしたいとき:
grep -q "ERROR" app.log(-qは出力を抑制し、ステータスだけ返す) - 監視用途:一致=0を検知トリガーにし、cronやCIのジョブから条件分岐する
-qを付けると本文を出さずに判定だけできるため、スクリプト内の存在チェックはこの形が軽量です。件数がゼロでもエラー終了させたくない場面では、終了ステータスの扱いに注意して組み込みます。
実務で頻度の高いgrepオプションと前後行・再帰検索の指定方法
grepのオプションは数が多いものの、実務で日常的に使うのは10個前後に収まります。頻度の高い順に、実行例つきで整理します。
頻度の高いgrepオプション(-i・-v・-n・-r・-c・-l)の一覧
迷ったら、この表の範囲でおおむね足ります。使用頻度の高い順に並べています。
| オプション | 役割 |
|---|---|
-i |
大文字小文字を区別しない |
-v |
一致しない行を表示(反転) |
-n |
一致行に行番号を付ける |
-r |
ディレクトリを再帰検索 |
-c |
一致した行数を数える |
-l |
一致したファイル名だけ表示 |
-o |
一致部分だけを抜き出す |
-w |
単語として完全一致で探す |
この中でも-iと-nは使用頻度が高く、grep -in "warning" app.logのようにまとめて指定できます。-vは「除外」の道具で、grep -v "健全な行のパターン"とすると、正常行を消して残るのはノイズだけです。件数だけ知りたいときは-c、どのファイルに含まれるかだけ知りたいときは-lを使うと、出力が短くなり判断が速くなります。
前後の行を表示する-A・-B・-Cオプションとログの文脈把握
障害調査では、一致した行だけでなくその前後を見たい場面が多くなります。grepは前後の行を一緒に出す3つのオプションを持ちます。
| オプション | 役割 |
|---|---|
-A 数 |
一致行の後ろN行も表示 |
-B 数 |
一致行の前N行も表示 |
-C 数 |
前後N行をまとめて表示 |
例外スタックトレースを追うならgrep -A 20 "Exception" app.logで例外発生後の20行を、直前の処理を見たいなら-Bを使います。前後を等しく見たいときはgrep -C 5 "timeout" app.logが便利です。ログはサーバー上に蓄積されるため、対象がどのサーバーのどのプロセスのものかを押さえておくと調査が速くなります。サーバーの役割と種類の前提はサーバーの役割・種類とクライアントとの違いに整理しています。
複数パターンの-e・-fとディレクトリ再帰検索の-r・–include
複数の語をOR条件で探すなら、-eを並べるか、後述の拡張正規表現でまとめます。パターンが多い場合はファイルに列挙して-fで読み込みます。
- 複数語をOR検索:
grep -e "error" -e "fatal" app.log - ソースツリーを再帰検索:
grep -rn "TODO" ./src - 拡張子を絞って再帰:
grep -rn --include="*.py" "import" ./src
再帰検索の-rはシンボリックリンクを既定でたどりませんが、たどりたいときは-Rを使います。対象が巨大なツリーのときは、--includeや--exclude-dir=node_modulesで範囲を絞るのが有効です。ここまで範囲が広がると、後述のripgrepのほうが速く済む場面が出てきます。
grepの正規表現(基本正規表現BREと拡張正規表現ERE)の使い分け
grepの検索パターンは、単なる文字列としても、正規表現としても書けます。つまずきやすいのは、grepが既定で使う正規表現の種類です。ここを整理します。
基本正規表現BREと拡張正規表現EREの違いと-Eを付ける判断
grepは既定で基本正規表現(BRE)を使います。BREでは+・?・|・( )・{ }はそのままの文字として扱われ、正規表現として効かせるにはバックスラッシュでエスケープが必要です。これらを素直な記号のまま使いたいときは-Eを付けて拡張正規表現(ERE)へ切り替えます。
- OR検索(ERE):
grep -E "error|fatal|panic" app.log - 直前1文字の繰り返し(ERE):
grep -E "ab+c" data.txt
迷ったときの指針は単純です。|や+、丸括弧のグループ化を使いたくなったら-Eを付ける。エスケープだらけの読みにくいBREを書くより、EREのほうが意図が伝わります。
grepでよく使うメタ文字(^・$・.・*・[ ])と実務での例
BRE・EREで共通して効くメタ文字は少数です。まずこの5種を押さえれば、日常の検索はほぼ書けます。
| 記号 | 意味と例 |
|---|---|
^ |
行頭に一致(^ERRORで行頭ERROR) |
$ |
行末に一致(done$で行末done) |
. |
任意の1文字 |
* |
直前文字の0回以上の繰り返し |
[ ] |
文字クラス([0-9]で数字) |
例えば行頭が日付で始まるログ行だけ拾うならgrep -E "^[0-9]{4}-[0-9]{2}" app.log、空行を除くならgrep -v "^$" file.txtと書けます。ドット.は任意の1文字に一致するため、リテラルのドットを探すときは\.とエスケープする点だけ注意します。
固定文字列を検索する-F(fgrep)でメタ文字を無効化する場面
IPアドレスやバージョン番号のように、ドットや記号を含む文字列をそのまま探したいときは-Fを使います。-Fはパターンを正規表現ではなく固定文字列として扱うため、メタ文字のエスケープが不要になり、大量の固定パターン照合では高速です。
- IPをそのまま検索:
grep -F "192.168.0.1" access.log - 記号入りの文字列を検索:
grep -F "app[v2].build" build.log
.を「任意の1文字」ではなくドットそのものとして探せるため、誤検知を減らせます。正規表現の機能が要らない単純な文字列照合では、-Fを既定にすると意図が明確になります。
GNU grep 3.8で変わったegrep・fgrepの非推奨と移行の指針
汎用の使い方記事では触れられないものの、実装者が2026年時点で押さえるべき変化があります。長年使われてきたegrep・fgrepという別コマンドが、非推奨の段階に入りました。
grep 3.8でegrep・fgrepが警告を出す変更とgrep -E・-Fへの移行
egrep(拡張正規表現版)とfgrep(固定文字列版)は、機能としては2007年のgrep 2.5.3の時点で非推奨扱いになっていました。2022年9月2日公開のGNU grep 3.8で、これらを実行すると「egrep: warning: egrep is obsolescent; using grep -E」という警告を標準エラー出力に出すようになりました。将来的にはegrep・fgrepコマンド自体が削除される計画で、正式な廃止時期は未定(3.8時点)ですが、推奨はgrep -E・grep -Fへの置き換えです。
スクリプトやCIでのegrep警告の混入と安全な書き換えの指針
この警告が実務で問題になるのは、egrepを内部で呼ぶビルドスクリプトやCIのログが警告で埋まるケースです。出力の突合や差分チェックをしている場合、標準エラーへの警告混入がテストを不安定にすることがあります。恒久策は、スクリプト内のegrepをgrep -Eへ、fgrepをgrep -Fへ機械的に置換することです。手元の環境差で挙動が変わる前に、早めに書き換えておくと、OSやディストリビューションの更新に振り回されずに済みます。
大規模検索でのgrepとripgrepの使い分けとログ解析の実務
grepを使うか、より新しいripgrep(rg)へ移すかは、検索対象の規模と用途で決めます。ここは独自の判断として言い切ります。
grepで足りる場面とripgrepへ切り替える条件と見送る判断
grepで足りるのは、対象が単一ファイルや数十ファイルで、パイプの一段として単発で行を絞り込む用途です。ログの調査、プロセス確認、設定ファイルの検索は、追加ツールを入れずに使えるgrepだけで完結します。一方、ripgrepへ切り替える価値があるのは、次の条件がそろう場面です。
- 数万ファイル規模のコードツリーを全文検索する(
.gitignoreを自動で尊重し、走査対象が減る) - 再帰検索が日常作業で、速度差が体感で効いてくる(並列処理で大規模ツリーに強い)
- 既定でバイナリや隠しディレクトリを賢く除外したい
逆に、ripgrepを見送ってよいのは、対象サーバーにツールを追加できない本番環境や、単発のログ調査です。標準で入っているgrepなら、どのUNIX系サーバーでも同じ書き方が通ります。移植性を優先する運用スクリプトは、grepのまま書くほうが事故が少なくなります。「開発マシンのコード検索はripgrep、本番のログ調査はgrep」と割り切ると選択を誤りません。
ログ解析・障害調査で使うgrepパイプラインの設計と運用の勘所
障害調査でのgrepは、単体で使うより他コマンドとつないでパイプラインを組む形が実務的です。エラーを抽出し、件数を数え、多いものから並べる、という流れを1行で書けます。
- 直近ログからエラーを実時間で追う:
tail -f app.log | grep --line-buffered "ERROR" - ステータス500の件数を数える:
grep -c " 500 " access.log - 多い順に集計:
grep "ERROR" app.log | sort | uniq -c | sort -rn
tail -fとつなぐときは--line-bufferedを付けると、バッファ遅延なく実時間で流れます。調査で抜き出したログを手元のマシンへ持ってくる工程は、SCPコマンドによるサーバー間ファイル転送と組み合わせると、抽出から回収までを一連の手順にできるのが利点です。こうした手元のコマンド運用を、監視・アラート・集約基盤として本番へ組み込む段階では、AWS・Google Cloud・Azureのインフラ構築支援で、ログ収集・解析・運用自動化の設計まで含めて相談できます。属人的なgrep調査から、チームで再現できる運用へ引き上げる局面で検討する価値があります。
grepコマンドの使い方・オプション・正規表現についてのよくある質問
grepの実運用でつまずきやすい点を、実際に検索される質問に沿って答えます。
grepとegrepの違いは何ですか?
egrepは、拡張正規表現(ERE)を既定で使うgrep、つまりgrep -Eと同じ動作をする別名コマンドです。ただしGNU grep 3.8(2022年9月)以降、egrepを実行すると非推奨の警告が出るようになりました。新しく書くスクリプトでは、egrepではなくgrep -Eを使うのが推奨です。
grepで大文字と小文字を区別せずに検索するには?
-iオプションを付けます。grep -i "warning" app.logとすると、WARNING・Warning・warningのいずれも一致する形です。他のオプションと組み合わせてgrep -in "error" app.logのように行番号付きで大小無視の検索もできます。
grepで特定の文字列を含まない行だけを表示するには?
-vオプションで一致を反転させます。grep -v "DEBUG" app.logはDEBUGを含む行を除いて表示する動作です。正常なパターンを-vで消してノイズを減らし、残った異常行だけを見る、という絞り込みに向いています。空行を除くならgrep -v "^$"です。
grepとripgrep(rg)はどちらを使うべきですか?
本番サーバーのログ調査や、ツールを追加できない環境では、標準で入っているgrepが確実です。開発マシンで数万ファイルのコードを再帰的に全文検索する用途では、.gitignoreを尊重して高速に走るripgrepが向きます。移植性を重視するならgrep、手元の大規模検索の速度を取るならripgrep、と使い分けます。
grepでファイルを再帰的に検索するにはどうしますか?
-rを付けてgrep -rn "検索語" ./srcのように書くと、指定ディレクトリ以下を再帰的に検索し、行番号も表示します。対象が広いときは--include="*.js"で拡張子を絞るか、--exclude-dir=node_modulesで除外すると、走査が速くなります。
関連記事
- Linuxとは?仕組み・ディストリビューション・サーバー用途:grepが動く基盤となるLinux環境(シェル・パーミッション・パス)の理解に
- SCPコマンドとは?基本構文・主要オプション・SSH越しの安全なファイル転送:grepで抽出したログを手元へ回収する転送手段として
- サーバーとは?役割・種類・クライアントとの違いと選び方:ログが蓄積されるサーバーの役割と調査対象の前提理解に