Linux grep コマンドの使い方完全ガイド|基本構文・オプション一覧・正規表現・除外検索

コマンドリファレンス

grep(グレップ)は、指定したパターン(文字列・正規表現)に一致する行をファイルや標準入力から検索して表示するLinux/UNIXの標準コマンドです。名前は「Global Regular Expression Print」に由来します。
ログファイルからエラー行を抽出する、設定ファイルの特定行を探す、複数ファイルを横断して調査するなど、システム管理・開発の現場で最も使用頻度が高いコマンドの一つです。

  1. Linuxのgrepコマンドとは?できること
  2. Linux grepコマンドの基本構文(Syntax)
  3. 主なオプション一覧
  4. 実行例
    1. ファイルから文字列を検索
    2. 行番号を付けて検索
    3. 大文字小文字を区別せず検索
    4. 単語単位で検索(部分一致を除外)
    5. 複数ファイルを検索
    6. 前後の行も含めて表示
    7. ディレクトリを再帰的に検索
    8. エラー例(存在しないファイル)
  5. 正規表現を使った検索
    1. OR 検索(複数パターンのいずれかにマッチ)
    2. 行頭・行末のパターン
    3. IP アドレスのような繰り返しパターン
    4. 正規表現の基本記号一覧
  6. 特定パターンを除外する(grep 除外)
    1. ログから DEBUG 行を除外
    2. 設定ファイルのコメント行・空行を除外
    3. 複数パターンを除外
    4. 大文字小文字を区別せず除外
    5. 特定のディレクトリを検索対象から除外する(–exclude-dir)
    6. 特定の拡張子・ファイルを検索対象から除外する(–exclude)
    7. 除外検索の注意点
  7. 複数条件での検索(AND / OR)
    1. OR 検索(-E オプション)
    2. AND 検索(パイプで連結)
    3. NOT 検索との組み合わせ
  8. 実践活用:ログ調査・セキュリティチェック・他コマンドとの連携
    1. SSHの失敗ログイン数をカウントする
    2. find と組み合わせたファイル横断チェック
    3. awk と組み合わせた大量データのフィルタリング
    4. プロセスの絞り込み(ps aux | grep)
  9. grepを高速化するコツ
  10. よくある質問(FAQ)
    1. Q. grepの読み方・意味は?
    2. Q. 特定の文字列を含まない行だけを表示するには?
    3. Q. 単語単位で完全一致させるには?
    4. Q. マッチした行の前後を表示するには?
    5. Q. 特定のディレクトリを検索対象から除外するには?
    6. Q. 特定の拡張子のファイルを除外するには?
    7. Q. Gitのgrepと通常のgrepの違いは?
  11. 関連コマンド
  12. 備考
  13. 参考
  14. 関連記事

Linuxのgrepコマンドとは?できること

Linuxで grep は「指定した文字列・正規表現パターンにマッチする行だけを抜き出す」ためのコマンドです。次のような場面でよく使われます。

  • ログファイルから ERRORWARNING などの特定行だけを抽出する
  • 設定ファイルから特定の項目(例: ポート番号)を素早く探す
  • ps aux | grep nginx のようにパイプで他コマンドの出力を絞り込む
  • ディレクトリ配下のソースコードから特定のキーワード(例: TODO)を横断検索する

基本構文は次の通りです。

Linux grepコマンドの基本構文(Syntax)

grep [オプション] PATTERN [FILE...]

PATTERN には検索したい文字列や正規表現を、FILE には検索対象のファイルを指定します。FILE を省略すると標準入力(パイプで渡されたデータなど)が検索対象になります。

主なオプション一覧

オプション説明使用例
-i大文字・小文字を区別せず検索grep -i error /var/log/syslog
-vマッチしない行を表示(否定検索)grep -v INFO /var/log/syslog
-n行番号を表示grep -n main program.c
-r / -Rディレクトリを再帰的に検索(-Rはシンボリックリンクも辿る)grep -r TODO src/
-lマッチしたファイル名のみ表示grep -l TODO *.c
-Lマッチしなかったファイル名のみ表示grep -L TODO *.c
-cマッチした行数を表示grep -c ERROR /var/log/syslog
-oマッチした部分文字列のみを表示grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" access.log
-w単語単位で一致(部分一致を除外)grep -w cat animals.txt
-e複数の検索パターンを指定grep -e error -e fail app.log
-f FILEファイルからパターンを読み込んで検索grep -f patterns.txt log.txt
-E拡張正規表現(egrepと同等)を使用grep -E "foo|bar" file.txt
-F正規表現を使わず固定文字列として検索(高速)grep -F "GET /index.html" access.log
-A NUMマッチ行の後ろに NUM 行も表示grep -A 2 ERROR /var/log/syslog
-B NUMマッチ行の前に NUM 行も表示grep -B 2 ERROR /var/log/syslog
-C NUMマッチ行の前後 NUM 行も表示grep -C 3 ERROR /var/log/syslog
--color=auto一致部分を色付きで表示grep --color=auto ERROR /var/log/syslog
--include / --exclude検索対象ファイルを拡張子等で絞り込み・除外grep -R --include="*.conf" port /etc/
--exclude-dir再帰検索から特定のディレクトリを除外grep -r --exclude-dir=node_modules TODO .

実行例

ファイルから文字列を検索

grep "ERROR" /var/log/syslog

出力例:

Aug 21 10:00 server app[1234]: ERROR: Failed to start service

行番号を付けて検索

grep -n "main" program.c

出力例:

42:int main(int argc, char *argv[]) {

大文字小文字を区別せず検索

grep -i "warning" messages.log

単語単位で検索(部分一致を除外)

何も指定しないと catconcatenate のような部分一致にもマッチしてしまいます。単語として完全一致させたい場合は -w を使います。

grep -w "cat" animals.txt

複数ファイルを検索

grep "TODO" *.c

出力例:

main.c:10:// TODO: refactor this function
util.c:25:// TODO: add error handling

前後の行も含めて表示

grep -C 2 "ERROR" /var/log/syslog

出力例:

Aug 21 09:59 server app[1234]: Starting service
Aug 21 10:00 server app[1234]: ERROR: Failed to start service
Aug 21 10:00 server app[1234]: Service stopped

ディレクトリを再帰的に検索

grep -r "config" /etc/

エラー例(存在しないファイル)

grep "ERROR" missing.log

出力例:

grep: missing.log: No such file or directory

正規表現を使った検索

grep はデフォルトでも基本的な正規表現を使えますが、-E オプション(または egrep)を使うと拡張正規表現が利用でき、より柔軟なパターン検索が可能になります。

OR 検索(複数パターンのいずれかにマッチ)

grep -E "ERROR|WARNING" /var/log/syslog

行頭・行末のパターン

# 行頭が数字で始まる行
grep "^[0-9]" data.txt

# .log で終わる行
grep "\.log$" filelist.txt

IP アドレスのような繰り返しパターン

grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log

正規表現の基本記号一覧

記号意味使用例
.任意の1文字grep "e.g" file.txt
^行の先頭grep "^Hello" file.txt
$行の末尾grep "end$" file.txt
*直前の文字が0回以上の繰り返しgrep "ab*c" file.txt
+直前の文字が1回以上の繰り返し(-Eが必要)grep -E "e+" file.txt
[abc]a・b・cのいずれか1文字grep "[aeiou]" file.txt
[^abc]a・b・c以外の1文字grep "[^0-9]" file.txt
(abc|def)“abc” または “def”(-Eが必要)grep -E "(error|warn)" file.txt

Bashの [[ ]] 構文と組み合わせた正規表現マッチングや、シェルのワイルドカードパターンとの違いについてはパターン・正規表現の使い分け|[[ ]] / extglob / grep -Eで詳しく解説しています。

特定パターンを除外する(grep 除外)

-v オプションを使うと、指定したパターンに一致しない行だけを表示できます。ログから不要な行を取り除いたり、コメント行をスキップしたりする場面で頻繁に使われます。

ログから DEBUG 行を除外

grep -v "DEBUG" /var/log/app.log

設定ファイルのコメント行・空行を除外

# コメント行(# で始まる行)を除外
grep -v "^#" /etc/ssh/sshd_config

# 空行も除外して両方を取り除く
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

複数パターンを除外

grep -vE "DEBUG|INFO" /var/log/app.log

大文字小文字を区別せず除外

-v-i を組み合わせると、大文字・小文字の違いを無視して除外できます。

# Error / error / ERROR をすべて除外
grep -vi "error" app.log

特定のディレクトリを検索対象から除外する(–exclude-dir)

-v が「行の内容」を除外するのに対し、--exclude-dir は再帰検索(-r)時に「特定のディレクトリそのもの」を検索対象から除外します。node_modules.git のような、検索結果に不要なディレクトリを除外する際に使います。

# node_modules を除外して再帰検索
grep -r --exclude-dir=node_modules "DEBUG" .

# 複数ディレクトリを除外({}で列挙)
grep -r --exclude-dir={node_modules,.git,vendor} "DEBUG" .

特定の拡張子・ファイルを検索対象から除外する(–exclude)

--exclude はファイル名のパターン(シェルのワイルドカード)に一致するファイルを検索対象から除外します。正規表現ではなくglobパターンである点に注意してください。

# .log ファイルを除外して検索
grep -r --exclude="*.log" "DEBUG" .

# 反対に対象を絞り込みたい場合は --include を使う
grep -r --include="*.js" "DEBUG" .

除外検索の注意点

  • -v は「行の内容」による除外、--exclude / --exclude-dir は「ファイル・ディレクトリ名」による除外で、対象が異なります。両方を組み合わせて使うことも可能です。
  • --exclude / --exclude-dir のパターンはワイルドカード(glob)であり、正規表現ではありません。*.log のように指定します。
  • パイプで grep -v を複数連結する場合、除外したいパターンの数だけ | grep -v "パターン" を重ねるか、-vE "A|B" でまとめて指定します。連結順序が変わっても結果は同じですが、可読性のためにまとめて書く方が保守しやすいです。
  • 除外パターンに正規表現の特殊文字(.* など)が含まれる場合は、意図しない一致を避けるためエスケープするか -F(固定文字列)を検討してください。

複数条件での検索(AND / OR)

grep 単体では AND 検索を直接表現できませんが、パイプを使って複数の grep を連結することで実現できます。

OR 検索(-E オプション)

grep -E "ERROR|CRITICAL" /var/log/syslog

AND 検索(パイプで連結)

# "ERROR" かつ "2024" を含む行
grep "ERROR" /var/log/syslog | grep "2024"

# "ERROR" かつ "database" を含む行
grep "ERROR" /var/log/app.log | grep "database"

NOT 検索との組み合わせ

# "ERROR" を含むが "timeout" は含まない行
grep "ERROR" /var/log/app.log | grep -v "timeout"

実践活用:ログ調査・セキュリティチェック・他コマンドとの連携

SSHの失敗ログイン数をカウントする

grep "Failed password" /var/log/auth.log | wc -l

認証ログから不正アクセス試行の回数を素早く把握できます。grepの終了コード(マッチ有無)をスクリプトの条件分岐に使う方法はbash if文の書き方|else・elif・数値比較・ファイル判定を例文で解説【早見表付き】を参照してください。

if grep -q "Failed password" /var/log/auth.log; then
  echo "不正ログイン試行を検知しました"
fi

find と組み合わせたファイル横断チェック

find /usr/bin -type f -exec md5sum {} + | grep -v "known_hash"

-v(除外検索)と組み合わせることで、既知のハッシュ値と一致しないファイルだけを抽出するセキュリティチェックにも応用できます。find の詳しい使い方はfind コマンド / locate|Linuxでファイルを検索する方法を、find の検索結果を grep に渡す際の xargs 活用はxargs コマンド|標準入力を引数に渡す・ find / grep との連携パターンを参照してください。

awk と組み合わせた大量データのフィルタリング

awk -F, '$3 > 10' data.csv | grep "pattern"

まず awk で条件に合う行を絞り込み、その結果をさらに grep でパターンフィルタリングする手法です。大量のCSVデータを多段階で絞り込む際に有効です。awk の詳しい書き方はawk コマンド|テキストの抽出・集計・変換を実務パターンで解説を参照してください。

プロセスの絞り込み(ps aux | grep)

ps aux | grep "nginx"

実行中のプロセスから特定の名前を含むものを探す定番の使い方です。PIDの取得や条件付きの検索だけを行いたい場合は、専用コマンドのpgrep – 条件に一致するプロセスのPIDを検索するの方が簡潔に書けます。

ログ調査の実務パターンをさらにまとめて知りたい場合はログ調査がサクサク進む:grep・awk・sedで原因特定する実務パターン集も参考にしてください。

grepを高速化するコツ

grep は標準でも高速ですが、大量のログファイルや大規模なディレクトリを検索する際は、以下の工夫でさらに速くできます。

  • -F オプションを使う:単純な文字列検索なら、正規表現ではなく固定文字列として扱う -Ffgrep相当)の方が高速です。grep -F "ERROR" app.log
  • ロケールを見直す:検索対象が英数字中心であれば LC_ALL=C grep "pattern" largefile.txt のようにロケールを C にすることで文字コード変換のコストを減らせます。
  • --include / --exclude で対象を絞る:再帰検索時に不要なファイルをスキップすると処理量が減ります。grep -R --exclude="*.log" "pattern" ./
  • 大規模・頻繁な検索には ripgrep も検討:並列処理に対応し、.gitignoreを自動で考慮するなどgrepより高速に動作するケースが多いツールです。詳しくはrgコマンド(ripgrep)の使い方|インストール〜実務で使うオプション早見表【コピペ例付き】を参照してください。

よくある質問(FAQ)

Q. grepの読み方・意味は?

A. 「グレップ」と読みます。「Global Regular Expression Print」の略で、指定した正規表現パターンにマッチする行をグローバル(ファイル全体)から表示する、という意味です。

Q. 特定の文字列を含まない行だけを表示するには?

A. -v オプションを使います。grep -v "パターン" file.txt で、指定したパターンにマッチしない行だけを抽出できます。複数パターンを同時に除外したい場合は -vE| 区切りを組み合わせます(grep -vE "A|B" file.txt)。

Q. 単語単位で完全一致させるには?

A. -w オプションを使います。grep "cat"concatenate のような部分一致にもマッチしますが、grep -w "cat" なら独立した単語としての cat のみにマッチします。

Q. マッチした行の前後を表示するには?

A. -A NUM(後ろNUM行)、-B NUM(前NUM行)、-C NUM(前後NUM行)を使います。例: grep -C 2 "ERROR" /var/log/app.log

Q. 特定のディレクトリを検索対象から除外するには?

A. --exclude-dir オプションを使います。grep -r --exclude-dir=node_modules "パターン" . のように指定すると、再帰検索から指定ディレクトリを除外できます。複数指定する場合は --exclude-dir={dir1,dir2} と列挙します。

Q. 特定の拡張子のファイルを除外するには?

A. --exclude="*.log" のようにファイル名のワイルドカードパターンで指定します。-v(行の内容を除外)とは対象が異なる点に注意してください。

Q. Gitのgrepと通常のgrepの違いは?

A. git grep はGitリポジトリ管理下のファイルを対象に高速検索する専用コマンドです。通常の grep はファイルシステム上の任意のファイルを検索対象にできますが、git grep はGit管理下のファイルに最適化されています。

関連コマンド

  • egrep : grep -E と同等(拡張正規表現)
  • fgrep : grep -F と同等(正規表現を使わず文字列検索)
  • sed : テキストの置換や加工に利用
  • awk : テキスト処理や抽出に利用
  • wc : grep の結果件数を数えるときに grep "keyword" file.txt | wc -l の形でよく使われる
  • pgrep : プロセス名からPIDだけを検索する専用コマンド

備考

  • 検索対象は標準入力でも指定可能(例: dmesg | grep usb)。
  • grep はシンプルな検索に向き、複雑な処理は awksed と組み合わせることが多いです。
  • GNU grep と BSD grep ではオプションの一部挙動が異なる場合があります(例: -P によるPCRE対応はGNU grepのみ)。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント