grepコマンドで文字列を検索する方法|複数ファイルやディレクトリ除外もコマンド


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドF-J, テキスト処理コマンド > grepコマンドで文字列を検索する方法|複数ファイルやディレクトリ除外もコマンド
「grepコマンドを使って大量のログファイルから、特定のエラーが出ている行だけを抜き出したい」
「grepで検索したけど、不要なアクセスログまで引っかかって画面が埋め尽くされてしまう」
運用保守の現場で、毎日必ずと言っていいほど実行するのが grep コマンドです。

この記事では、Linuxの grep コマンドを使ってファイルの中身から特定の文字列を検索する実践的な手順を解説します。
単一ファイルの検索だけでなく、ディレクトリ以下の複数ファイルを一括検索する(-r)方法や、不要な結果を除外する(-v)、前後の行も表示する(-C)など、実務で必須となるオプションとテクニックをまとめました。

1. 単一のファイルから文字列を検索する(基本)

まずは基本となる、1つのファイルから特定の文字列を探し出す方法です。

# 基本書式: grep "検索文字列" 対象ファイル名 # grep "ERROR" /var/log/messages

これで、/var/log/messages の中から「ERROR」という文字が含まれる行だけが画面に表示されます。

大文字・小文字を無視して検索する(-i)

デフォルトでは「Error」と「error」は区別されますが、-i(ignore-case)オプションを付けると大文字小文字を区別せずに検索できます。

# grep -i "error" /var/log/messages


2. ディレクトリ内の複数ファイルを一括検索する(-r)

現場のログ調査で最もよく使うのが、この -r(recursive:再帰的)オプションです。指定したディレクトリ以下にある全てのファイルを対象に、一気に検索をかけます。

# /var/log ディレクトリ以下の全ファイルから "Failed password" を検索する # grep -r "Failed password" /var/log/

検索結果に「行番号」を表示する(-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"

マッチした行数だけをカウントする(-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

これを知っているだけで、トラブルシューティングのスピードが劇的に上がります。

本記事のまとめ(grepオプション早見表)

やりたいこと コマンド・オプション
文字列を検索する(基本) grep "文字列" ファイル名
大文字・小文字を区別しない grep -i "文字列" ファイル名
ディレクトリ以下を一括検索する grep -r "文字列" ディレクトリ/
行番号を表示する grep -n "文字列" ファイル名
マッチしたファイル名だけ一覧表示する grep -l "文字列" ディレクトリ/
特定の文字列を含む行を「除外」する grep -v "除外したい文字列"
マッチした行数をカウントする grep -c "文字列" ファイル名
特定のファイル(拡張子)を除外する grep -r "文字列" /var/log/ --exclude="*.gz"
特定のディレクトリを除外する grep -r "文字列" /var/log/ --exclude-dir="ディレクトリ名"
前後の行も合わせて表示する grep -C 3 "文字列" ファイル名

ログ調査やトラブル対応で、画面を埋め尽くす文字に消耗していませんか?

grepの便利なオプションを知らないまま運用していると、本来1分で終わるはずのエラー特定に何時間もかかってしまい、障害対応に致命的な遅れをとってしまいます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る