【Linux】grepコマンドで特定のパターンを効率的に検索・抽出する方法

目次

概要

grepコマンドは、ファイル内や標準入力から特定の文字列パターン(正規表現)を検索し、一致する行を抽出するための強力なツールです。システムログの調査、設定ファイルの特定箇所の確認、ソースコード内のキーワード検索など、Linux運用におけるテキスト処理の基盤となるコマンドです。

仕様(引数・オプション)

構文

grep [オプション] [パターン] [ファイル名...]

主要なオプション

オプション説明
-E拡張正規表現(ERE)を使用します。
-Fパターンを固定文字列として扱い、正規表現を無効にします。
-PPerl互換正規表現(PCRE)を使用します。
-A 行数一致した行の「後(After)」に続く指定行数も表示します。
-B 行数一致した行の「前(Before)」にある指定行数も表示します。
-C [行数]一致した行の「前後(Context)」の指定行数を表示します。
-e パターン検索パターンを明示的に指定します。複数指定で「いずれかに一致」を検索可能です。
-f ファイル検索パターンが記述されたファイルを読み込みます。
-c一致した「行数」のみをカウントして表示します。
–color一致した部分を色分けして表示します。
-H複数ファイル検索時、一致したファイル名を表示します。
-h一致したファイル名の表示を抑制します。
–label=文字列標準入力の検索結果に指定したラベル名を付与します。
-l一致した行を含むファイル名のみを表示します。
-L一致した行を含まないファイル名を表示します。
-i大文字と小文字の区別を無視します。
-wパターンが単語全体として一致する場合のみ抽出します。
-x行全体がパターンと完全に一致する場合のみ抽出します。
-n一致した行に行番号を付与して表示します。
-m 行数指定した一致数に達した時点で検索を終了します。
-o一致した部分の文字列のみを表示します。
-r, -Rディレクトリ内を再帰的に検索します。
-v一致しない行(不一致の行)のみを抽出します。
–exclude=パターン指定したパターンに一致するファイルを検索対象から除外します。
–exclude-dir=DIR指定したディレクトリを再帰検索の対象から除外します。

基本の使い方

サーバー上のユーザー名簿を模したファイルから、特定のユーザー「mori」が含まれる行を検索します。

BASH

# mori という文字列が含まれる行を検索して行番号付きで表示
grep -n "mori" /home/mori/documents/user_list.txt

TEXT

12:mori_administrator:active
45:backup_mori_agent:inactive
102:team_lead_mori:active

実践コマンド

システム環境設定ファイルから、有効な設定行(コメント行と空行以外)のみを抽出して確認するシナリオです。

BASH

# 「#」で始まるコメント行(^#)と空行(^$)を除外して最初の4行を表示
grep -v -e "^#" -e "^$" /etc/mori-app/server.conf | head -n 4

# 特定のディレクトリ内の全てのファイルを対象に「ERROR」を検索(大文字小文字無視、ファイル名表示)
grep -riH "error" /var/log/mori-services/

TEXT

LOG_LEVEL=DEBUG
LISTEN_PORT=8080
MAX_CONNECTIONS=100
RETRY_INTERVAL=30
/var/log/mori-services/app.log:2026-01-26 14:00:01 ERROR Connection failed
/var/log/mori-services/db.log:2026-01-26 14:05:10 [ERROR] SQL Timeout

カスタムポイント

  • 検索パターン: "^mori" のようにキャレット(^)を付けると行頭一致、"mori$" のようにドル記号($)を付けると行末一致になります。
  • 正規表現の切替: パイプ(|)による複数条件指定を行う場合は、-E オプションを使用するとバックスラッシュによるエスケープを省略でき、可読性が向上します。
  • コンテキスト表示: エラーログの前後を確認したい場合は -C 3 のように指定し、エラー発生時の状況を含めて抽出するように変更してください。

注意点

  1. メタ文字のエスケープ: 標準のgrepでは |+ などの記号はメタ文字として扱われないため、必要に応じて -E を使うか、バックスラッシュでエスケープしてください。
  2. パフォーマンス: 巨大なディレクトリに対して再帰検索を行う場合は、--exclude-dir を使用して不要なフォルダ(ログバックアップ用フォルダなど)を除外しないと、処理に時間がかかる場合があります。
  3. 引用符の使用: 検索パターンにスペースや特殊文字が含まれる場合は、シェルによる解釈を防ぐために必ずシングルクォートまたはダブルクォートで囲んでください。

応用

複数の検索候補のいずれかにマッチする行を抽出し、特定のファイルを除外しながら再帰的に検索する高度な例です。

BASH

# "mori" または "Mori" に一致する行を、拡張子 .bak を除外して検索
grep -ri "mori" --exclude="*.bak" /etc/config/projects/

# ログインシェルが /bin/bash で終わるユーザーの数を確認
grep -c "/bin/bash$" /etc/passwd

TEXT

/etc/config/projects/setup.conf:Owner=mori
/etc/config/projects/env.json:  "Author": "Mori Taro"
5

まとめ

grepコマンドは、単一のキーワード検索から複雑な正規表現を用いたフィルタリングまで、極めて幅広いテキスト操作に対応します。基本的な文字列抽出に加え、-v による除外設定や -E による拡張正規表現、さらに --exclude オプションを適切に使い分けることで、膨大なデータの中から必要な情報だけを迅速に見つけ出すことが可能です。目的とする検索条件に合わせてオプションを組み合わせ、コマンド履歴へのパスワード混入や不必要なディレクトリ走査に注意を払いながら活用することが推奨されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次