特定の文字列を含むファイルを検索する(特定のディレクトリを対象)|grep -rの使い方と実務Tips

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > 特定の文字列を含むファイルを検索する(特定のディレクトリを対象)|grep -rの使い方と実務Tips
「特定のディレクトリ内にあるファイルから、特定の文字列を含むファイルだけを検索したい」
「grep -rオプションの使い方がわからない」
Linuxの grep コマンドに -r(recursive)オプションを付けると、指定したディレクトリ以下を再帰的に検索して、特定の文字列を含むファイルとその行を表示できます。

この記事では、grepコマンドでディレクトリを再帰検索する方法と実務で役立つオプションを解説します。

【この記事でわかること】
・grep -rでディレクトリ内を再帰的に検索する基本手順
・-lオプションでファイル名のみ表示する方法
・--excludeオプションで特定ファイルを除外する方法
・大文字・小文字を区別しない検索(-i)との組み合わせ

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

grep -rでディレクトリを再帰的に検索する(基本)

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

# grep -r "検索文字列" 検索対象ディレクトリ

1. ディレクトリ内を再帰的に検索する

# workディレクトリ内から "japan" を含むファイルを検索(大文字小文字区別なし) $ grep -ri "japan" work work/country_list_cpm2.txt:Japan work/country_list.txt:Japan work/country_list_cpm1.txt:Japan work/country_list_column.txt:Japan

-r:サブディレクトリも含めて再帰的に検索
-i:大文字・小文字を区別しない

-R(大文字)でも同様に動作します。-R-r と同じですが、シンボリックリンクも追跡します。

応用・実務Tips

1. -lオプションでファイル名のみ表示する

マッチした行の内容ではなく、「マッチしたファイル名だけ」を知りたい場合は -l オプションを使います。

$ grep -rl "japan" work work/country_list_cpm2.txt work/country_list.txt work/country_list_cpm1.txt work/country_list_column.txt

2. -nオプションで行番号も表示する

$ grep -rn "japan" work work/country_list.txt:1:Japan work/country_list_cpm1.txt:1:Japan

3. --excludeで特定のファイルを除外する

バイナリファイルや特定の拡張子を除外して検索します。

# .gz(圧縮ファイル)を除外して検索 $ grep -r "ERROR" /var/log/ --exclude="*.gz" # バックアップファイルを除外 $ grep -r "password" /etc/ --exclude="*.bak"

4. --exclude-dirで特定のディレクトリを除外する

# .git ディレクトリを除外してソースコードを検索 $ grep -r "TODO" /project/ --exclude-dir=".git" # node_modules と dist を除外 $ grep -r "const" /webapp/ --exclude-dir=node_modules --exclude-dir=dist

5. -cオプションでマッチした行数をカウントする

$ grep -rc "japan" work work/country_list_cpm2.txt:1 work/country_list.txt:1 work/country_list_cpm1.txt:1 work/country_list_column.txt:1

実務での活用例

1. /etc配下から設定値を検索する

# SSH設定の確認 $ grep -r "PasswordAuthentication" /etc/ssh/ /etc/ssh/sshd_config:PasswordAuthentication no # PAM設定からpasswordを含む行を確認 $ grep -r "password" /etc/pam.d/ --exclude="*.bak"

2. ログから特定の期間のエラーを検索する

# /var/log以下のエラーログを検索(圧縮ファイル除外) $ grep -r "ERROR" /var/log/ --exclude="*.gz" --exclude="*.bz2"

本記事のまとめ

やりたいこと コマンド
ディレクトリ内を再帰検索 grep -r "文字列" ディレクトリ
大文字小文字を区別しない grep -ri "文字列" ディレクトリ
ファイル名のみ表示 grep -rl "文字列" ディレクトリ
行番号も表示 grep -rn "文字列" ディレクトリ
特定拡張子を除外 grep -r "文字列" ディレクトリ --exclude="*.gz"
特定ディレクトリを除外 grep -r "文字列" ディレクトリ --exclude-dir=.git

より複雑な検索パターン(find|xargs|grepの連携)はこちらを参照してください。

grepを使いこなして、ログ調査と設定確認を効率化しませんか?

grep -rは/etc配下の設定確認や/var/log以下のエラー調査で日常的に使う基本コマンドです。オプションを知っておくと作業時間が大きく変わります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

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

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

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

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

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。