grep(グレップ)は、指定したパターン(文字列・正規表現)に一致する行をファイルや標準入力から検索して表示するLinux/UNIXの標準コマンドです。名前は「Global Regular Expression Print」に由来します。
ログファイルからエラー行を抽出する、設定ファイルの特定行を探す、複数ファイルを横断して調査するなど、システム管理・開発の現場で最も使用頻度が高いコマンドの一つです。
Linuxのgrepコマンドとは?できること
Linuxで grep は「指定した文字列・正規表現パターンにマッチする行だけを抜き出す」ためのコマンドです。次のような場面でよく使われます。
- ログファイルから
ERRORやWARNINGなどの特定行だけを抽出する - 設定ファイルから特定の項目(例: ポート番号)を素早く探す
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
単語単位で検索(部分一致を除外)
何も指定しないと cat は concatenate のような部分一致にもマッチしてしまいます。単語として完全一致させたい場合は -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オプションを使う:単純な文字列検索なら、正規表現ではなく固定文字列として扱う-F(fgrep相当)の方が高速です。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はシンプルな検索に向き、複雑な処理はawkやsedと組み合わせることが多いです。- GNU grep と BSD grep ではオプションの一部挙動が異なる場合があります(例:
-PによるPCRE対応はGNU grepのみ)。
参考
- manページ: man7.org grep(1)
- GNU grep: https://www.gnu.org/software/grep/

コメント