「grepで検索したけど、不要なアクセスログまで引っかかって画面が埋め尽くされてしまう」
運用保守の現場で、毎日必ずと言っていいほど実行するのが
grep コマンドです。grep(Global Regular Expression Print)は、ファイルの中から「指定した文字列が含まれる行」を瞬時に取り出せる、Linux必須のコマンドです。Windowsの「Ctrl+F(検索)」をイメージするとわかりやすいですが、grepはコマンドラインから複数ファイルを一括検索したり、パイプで他コマンドの出力を絞り込んだりと、さらに強力な使い方ができます。この記事では、
grep コマンドを使ってファイルの中身から特定の文字列を検索する実践的な手順を解説します。単一ファイルの検索だけでなく、ディレクトリ以下の複数ファイルを一括検索する(-r)方法や、不要な結果を除外する(-v)、前後の行も表示する(-C)など、実務で必須となるオプションとテクニックをまとめました。この記事のポイント
・grep は運用保守の現場で毎日使う、文字列検索の必須コマンド
・-r で再帰検索、-v で除外、-C で前後行表示が実務の3大テクニック
・--exclude / --exclude-dir で不要ファイルを除いて検索精度を上げられる
・パイプ(|)と組み合わせると ps や tail -f の出力も絞り込める
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
1. 単一のファイルから文字列を検索する(基本)
まずは基本となる、1つのファイルから特定の文字列を探し出す方法です。# 基本書式: grep "検索文字列" 対象ファイル名 # grep "ERROR" /var/log/messages
/var/log/messages の中から「ERROR」という文字が含まれる行だけが画面に表示されます。実務でよく使う例として、SSH設定ファイルのポート番号を確認したい場合はこうなります。
# /etc/ssh/sshd_config から「Port」の設定行を確認する # grep "Port" /etc/ssh/sshd_config #Port 22 Port 22
-v オプションで紹介します。大文字・小文字を無視して検索する(-i)
デフォルトでは「Error」と「error」は区別されますが、-i(ignore-case)オプションを付けると大文字小文字を区別せずに検索できます。ログに「Error」「ERROR」「error」が混在している環境で特に便利です。# grep -i "error" /var/log/messages
複数のファイルをまとめて検索する(ワイルドカード)
ワイルドカード(*)を使えば、特定パターンのファイルを一括検索できます。# /etc/ 配下の .conf ファイル全てから「timeout」を検索する # grep "timeout" /etc/*.conf /etc/httpd/conf/httpd.conf:Timeout 300 /etc/vsftpd/vsftpd.conf:idle_session_timeout=300
2. ディレクトリ内の複数ファイルを一括検索する(-r)
現場のログ調査で最もよく使うのが、この-r(recursive:再帰的)オプションです。指定したディレクトリ以下にある全てのファイルを対象に、一気に検索をかけます。# /var/log ディレクトリ以下の全ファイルから "Failed password" を検索する # grep -r "Failed password" /var/log/ /var/log/secure:May 22 10:05:00 server1 sshd[1234]: Failed password for root from 192.0.2.1 port 54321 ssh2
検索結果に「行番号」を表示する(-n)
複数ファイルを検索すると、「どのファイルの、何行目にエラーがあるのか」が分からなくなります。-n(number)オプションを組み合わせるのが現場の鉄則です。# grep -rn "ERROR" /var/log/ /var/log/messages:125:Feb 24 10:00:01 server ERROR: connection failed /var/log/secure:89:Feb 24 10:05:00 server ERROR: authentication failure
マッチしたファイル名だけ一覧表示する(-l)
一括検索で「どのファイルにヒットしたか、ファイル名だけをリストアップしたい」という場合は-l(files-with-matches)オプションを使います。ファイル数が多い環境で特定のログファイルを素早く特定するのに便利です。# grep -rl "ERROR" /var/log/ /var/log/messages /var/log/secure
3. 検索結果から「不要な行」を除外する(-v)
grepで検索したものの、「この正常な通信ログは検索結果から消して、画面をスッキリさせたい」という場面で活躍するのが-v(invert-match)オプションです。パイプ(
|)を使って、grepを2段階にかけるのが実務での定番テクニックです。# "ERROR" を検索し、その中から "Timeout" という文字列を含む行を「除外」する # grep "ERROR" /var/log/messages | grep -v "Timeout"
設定ファイルのコメント行を除外して有効な設定だけ確認する
Linuxの設定ファイルには「#」で始まるコメント行が多く含まれています。実際に有効な設定だけ確認したいときに-v が活躍します。^# は「行頭が # である」を意味する正規表現です。# 「#」で始まる行(コメント行)を除いて表示する # grep -v "^#" /etc/ssh/sshd_config # さらに空行も除いてスッキリ表示させる(-E で複数パターン指定) # grep -v -E "^#|^$" /etc/ssh/sshd_config
^$ は「空行(何もない行)」を意味します。設定ファイルの確認がグッと楽になる組み合わせです。マッチした行数だけをカウントする(-c)
「今日のSSHログイン失敗が何件あったか」など、ヒットした件数だけを知りたい場合は-c(count)オプションが便利です。# /var/log/secure から "Failed password" にマッチした行数をカウントする # grep -c "Failed password" /var/log/secure 47
4. 特定のディレクトリやファイルを除外して検索する
「一括検索したいけど、圧縮された古いログ(.gz)や、関係ない別システムのログフォルダは検索対象から外したい」というケースでは、以下のオプションを使います。特定の拡張子(ファイル)を除外する(--exclude)
# 拡張子が .gz のファイルを除外して一括検索する # grep -r "ERROR" /var/log/ --exclude="*.gz"
特定のディレクトリを除外する(--exclude-dir)
# audit ディレクトリを除外して一括検索する # grep -r "ERROR" /var/log/ --exclude-dir="audit"
5. エラーの「前後」の行も表示する(-A / -B / -C)
「エラーが出ている行は見つかったけど、その直前に何が起きていたのか前後の文脈(コンテキスト)を知りたい」そんな時は、前後の行も合わせて表示してくれる非常に便利なオプションを使います。
・
-A(After): 検索ヒットした行の後ろN行を表示・
-B(Before): 検索ヒットした行の前N行を表示・
-C(Context): 検索ヒットした行の前後N行を表示# "ERROR" の行と、その「前後3行」を表示する # grep -C 3 "ERROR" /var/log/messages
6. パイプと組み合わせた使い方
grep の真骨頂はパイプ(|)と組み合わせることです。パイプは「前のコマンドの結果を次のコマンドに渡す」仕組みで、grep と組み合わせると検索の幅が大きく広がります。実行中のプロセスから特定のプロセスを探す
# 実行中のプロセス一覧から「apache」を含む行だけ表示する # ps aux | grep apache root 1234 0.0 0.5 12345 5678 ? Ss 10:00 0:00 /usr/sbin/httpd apache 1235 0.0 0.4 11111 4567 ? S 10:00 0:00 /usr/sbin/httpd # ポート一覧からSSH(22番)の待ち受け状態を確認する # ss -tln | grep :22 LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
ログファイルをリアルタイム監視しながらエラーだけ見る
# tail -f でログをリアルタイム表示しながら「error」のみ絞り込む # tail -f /var/log/messages | grep -i "error"
Ctrl+C で監視を止められます。7. 初心者がよくハマるエラーと対処法
スペースを含む文字列はクォートで囲む
検索したい文字列にスペースが含まれる場合、クォート(「"」または「'」)で囲まないとエラーになります。スペースの後ろがファイル名と解釈されてしまうためです。# NG例(スペースがあると2つ目以降がファイル名と解釈される) # grep Permission denied /var/log/secure grep: denied: No such file or directory # OK例(ダブルクォートで囲む) # grep "Permission denied" /var/log/secure
ps + grep で grep 自身のプロセスが混ざる問題
ps aux | grep プロセス名 を実行すると、grep コマンド自身のプロセスも結果に混ざることがあります。grep がそのプロセス名を引数に持っているためです。# よく見る現象(grep自身が混ざる) # ps aux | grep apache root 1234 ... /usr/sbin/httpd root 5678 ... grep apache ← これがgrep自身 # 解決策1: grep -v grep で除外する # ps aux | grep apache | grep -v grep # 解決策2: pgrep コマンドを使うとすっきり表示できる # pgrep -l apache 1234 httpd
バイナリファイルへのgrep結果に注意
デフォルトの grep はバイナリファイルを検索すると「Binary file matches」とだけ表示します。テキストとして強制的に検索したい場合は-a(--text)オプションを使います。ただし通常の運用では、バイナリファイルを grep する機会はほとんどありません。本記事のまとめ(grepオプション早見表)
| やりたいこと | コマンド・オプション |
|---|---|
| 文字列を検索する(基本) | grep "文字列" ファイル名 |
| 大文字・小文字を区別しない | grep -i "文字列" ファイル名 |
| ディレクトリ以下を一括検索する | grep -r "文字列" ディレクトリ/ |
| 行番号を表示する | grep -n "文字列" ファイル名 |
| マッチしたファイル名だけ一覧表示する | grep -rl "文字列" ディレクトリ/ |
| 特定の文字列を含む行を「除外」する | grep -v "除外したい文字列" ファイル名 |
| コメント行を除いた設定を確認する | grep -v "^#" 設定ファイル名 |
| マッチした行数をカウントする | grep -c "文字列" ファイル名 |
| 特定のファイル(拡張子)を除外する | grep -r "文字列" /var/log/ --exclude="*.gz" |
| 特定のディレクトリを除外する | grep -r "文字列" /var/log/ --exclude-dir="ディレクトリ名" |
| 前後の行も合わせて表示する | grep -C 3 "文字列" ファイル名 |
| コマンド出力を絞り込む | ps aux | grep "プロセス名" |
関連記事:grep の応用として「不可視Unicode文字をバイト単位で検出する」使い方が、2025年10月以降のサプライチェーン攻撃対策で必須になりました。GitHubに潜む「不可視文字攻撃」GlassWormとは|Linuxエンジニアが知るべきOSSサプライチェーンの脅威 で具体的なコマンド例を解説しています。
現場で通用するログ調査スキルを身につけたい方へ
grep を自在に使いこなせるかどうかで、障害対応の速度は大きく変わります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:historyコマンドでコマンド履歴を表示・検索する方法|日時表示や削除も
- 前のページへ:lnコマンドでシンボリックリンクを作成する方法|ハードリンクとの違いも
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます