Ubuntuでファイルを探したり、ファイル内のテキストを検索したりするとき、grepとfindの2つのコマンドが大活躍します。ログの調査、設定ファイルの検索、コードベース全体の一括検索…どれもこの2つさえ使えれば解決できます。
本記事では、Ubuntu 24.04 LTSのDockerコンテナで実際にコマンドを動かした結果をもとに、grepとfindの使い方を丁寧に解説します。バージョンはGNU grep 3.11 / GNU findutils 4.9.0(Ubuntu 24.04)で確認済みです。

この記事のポイント
grep パターン ファイルでファイル内のテキストを検索できるfind ディレクトリ -name "*.txt"でファイルを名前・種別・日時で検索できるgrep -rでディレクトリ内を再帰的に検索できる(ログ調査に便利)findとgrepを組み合わせると、複数ファイルを横断して特定のテキストを探せる- Ubuntu 24.04 LTSのDockerコンテナで実行した実出力を掲載しています
目次
- grepコマンドとは
- grepの基本的な使い方
- grepの便利なオプション
- findコマンドとは
- findの基本的な使い方
- findの便利なオプション
- grepとfindを組み合わせた活用術
- よくあるエラーと解決策
- まとめ
前提環境
本記事のコマンドはすべて ubuntu:24.04(Docker公式イメージ)のコンテナ内で動作確認しています。Vultr・ConoHaなどのVPSでUbuntu 24.04を使っている方も同じ操作で利用できます。Ubuntu 22.04でも基本的な使い方は同じですが、バージョンが異なります(後述)。
grepコマンドとは
grepは「ファイルの中身を検索する」コマンドです。名前は「Global Regular Expression Print(全体正規表現出力)」の略で、指定したパターンに一致する行だけを出力します。
Ubuntuには最初から入っています。バージョン確認コマンドは次のとおりです。
grep (GNU grep) 3.11
$ dpkg -l grep | grep ‘^ii’
ii grep 3.11-4build1 arm64 GNU grep, egrep and fgrep
Ubuntu 24.04 LTSにはGNU grep 3.11-4build1が標準インストールされています。Ubuntu 22.04ではGNU grep 3.7でした(バージョン比較は後の図で確認できます)。
grepの基本的な使い方
最もシンプルな書き方は次のとおりです。
手順1:テキストを検索する(基本)
ログファイルからERRORが含まれる行だけ抽出する例です。
2024-01-15 10:00:05 ERROR Failed to connect to database
2024-01-15 10:01:30 ERROR Timeout after 30 seconds
app.logの中からERRORを含む行だけが表示されました。ログ調査で一番使う基本操作です。
手順2:行番号を表示する(-n)
どの行にあるかを確認したいときは-nオプションをつけます。
1:2024-01-15 10:00:01 INFO Server started on port 8080
4:2024-01-15 10:01:00 INFO User login: alice
6:2024-01-15 10:02:00 INFO User login: bob
7:2024-01-15 10:02:45 INFO Cache cleared
行頭の1:や4:が行番号です。エディタでその行に飛ぶときに便利です。
手順3:マッチ件数を数える(-c)
「何回エラーが出たか」を数えるときは-cオプションが使えます。
4
INFOが含まれる行が4行あることがわかりました。行の内容ではなく件数だけを知りたいときに使います。
手順4:マッチしない行を表示する(-v)
INFO行以外の行だけを表示したいときは-v(invert match)オプションを使います。
2024-01-15 10:00:05 ERROR Failed to connect to database
2024-01-15 10:00:10 WARN Memory usage is high: 85%
2024-01-15 10:01:30 ERROR Timeout after 30 seconds
INFO行が除外され、ERRORとWARNだけが出力されました。-vは「特定のノイズを除いて残りだけを見たい」ときに重宝します。

grepの便利なオプション
①大文字小文字を無視する(-i)
ログにerrorと小文字で書かれている場合など、ケースを気にせず検索したいときは-iを使います。
2024-01-15 10:00:05 ERROR Failed to connect to database
2024-01-15 10:01:30 ERROR Timeout after 30 seconds
②再帰的にディレクトリを検索する(-r)
ディレクトリ内のすべてのファイルを対象に検索するには-rオプションが便利です。ソースコード全体から特定の関数を探すときなどに使います。
/tmp/project/src/utils.py:def format_date(date_str):
/tmp/project/src/utils.py:def validate_email(email):
/tmp/project/src/main.py:def main():
/tmp/project/以下の全ファイルからdefを含む行が検索されました。ファイル名もセットで表示されるので、どのファイルにあるかも一目でわかります。
③ファイル名だけを表示する(-l)
マッチした内容ではなくどのファイルが一致したかだけを知りたいときは-l(list)オプションを使います。
/tmp/project/src/main.py
importという文字列が含まれるファイルはmain.pyだけだということがわかりました。大量のファイルの中から対象を絞り込むのに便利です。
④前後の行も表示する(-B / -A)
マッチした行の文脈を確認したいときは-B(Before:前の行)や-A(After:後の行)を使います。
port = 5432
password = secret123
passwordの前後1行ずつが表示されました。エラーが起きた前後の状況をまとめて確認するときなどに使います。
⑤拡張正規表現で複数パターンを検索する(-E)
-Eオプションを使うと、|(OR)などの拡張正規表現が使えます。
host = localhost
port = 5432
host = 0.0.0.0
port = 8080
portまたはhostを含む行がまとめて取れました。検索パターンを|で区切ることで複数条件を一度に指定できます。
findコマンドとは
findは「ファイルやディレクトリを検索する」コマンドです。ファイル名・種別・更新日時・サイズ・パーミッションなど、さまざまな条件で絞り込めます。
find (GNU findutils) 4.9.0
$ dpkg -l findutils | grep ‘^ii’
ii findutils 4.9.0-5build1 arm64 utilities for finding files–find, xargs
Ubuntu 24.04 LTSにはGNU findutils 4.9.0-5build1が標準インストールされています。
基本の書き方は次のとおりです。
findの基本的な使い方
手順1:ファイル名で検索する(-name)
拡張子が.txtのファイルをすべて探す例です。
/tmp/files/docs/readme.txt
/tmp/files/docs/manual.txt
*(ワイルドカード)を使って拡張子でまとめて検索できます。*.log・*.sh・*.confなど、拡張子を変えて応用できます。
手順2:ファイル種別で絞り込む(-type)
-type fでファイルのみ、-type dでディレクトリのみを絞り込めます。
/tmp/files/docs/notes.md
/tmp/files/docs/readme.txt
/tmp/files/docs/manual.txt
/tmp/files/logs/error.log
/tmp/files/logs/app.log
/tmp/files/scripts/setup.sh
/tmp/files/scripts/backup.sh
$ find /tmp/files -type d
/tmp/files
/tmp/files/docs
/tmp/files/logs
/tmp/files/scripts

手順3:検索深さを制限する(-maxdepth)
広い範囲を検索しても深いサブディレクトリまで探すと時間がかかります。-maxdepth 1で直下だけに絞れます。
/tmp/files
$ find /tmp/files -maxdepth 2 -type d
/tmp/files
/tmp/files/docs
/tmp/files/logs
/tmp/files/scripts
-maxdepth 1だと自分自身しか出ません。-maxdepth 2にすると1段下のサブディレクトリも含まれます。
findの便利なオプション
①更新日時で検索する(-mtime)
「直近3日以内に変更されたファイルを探したい」という場合は-mtimeが便利です。
$ find /var/log -mtime -3 -type f
/var/log/apt/history.log
/var/log/dpkg.log
# 7日以上更新されていないファイルを検索
$ find /tmp -mtime +7 -type f
-mtime -3は「3日以内」、-mtime +7は「7日以上前」を意味します。マイナスが「それ以内」、プラスが「それ以上前」です。
②ファイルサイズで検索する(-size)
$ find / -type f -size +100M 2>/dev/null
/var/lib/docker/overlay2/abc123/root
# 1KB以上のファイル(ホームディレクトリ以下)
$ find ~ -type f -size +1k
単位はk(キロバイト)・M(メガバイト)・G(ギガバイト)が使えます。ディスクを圧迫している大きなファイルを探すときに便利です。
③検索結果にコマンドを実行する(-exec)
findで見つけたファイルに対してコマンドを実行するには-execを使います。
$ find /tmp/demo -name “*.sh” -exec chmod +x {} \;
# 確認:見つかったファイルのパスを表示
$ find /tmp/demo -name “*.sh” -exec echo “Found: {}” \;
Found: /tmp/demo/script2.sh
Found: /tmp/demo/script1.sh
{}は「findで見つかったファイル名」に置き換わります。末尾の\;(バックスラッシュ+セミコロン)はコマンドの終わりを示します。
④xargsと組み合わせてまとめて処理する
-execはファイルごとにコマンドを起動しますが、xargsを使うとまとめて渡せるので高速です。
1 /tmp/demo/medium.txt
1 /tmp/demo/small.txt
1 /tmp/demo/large.txt
3 total
findの結果をパイプでxargs wc -lに渡して、各ファイルの行数を一度に数えました。
grepとfindを組み合わせた活用術
「複数のファイルの中から特定の文字列を探したい」というのが現場で一番使う場面です。find + grep の組み合わせでこれを実現できます。
パターン1:find -exec grep(確実な方法)
$ find /tmp/search -name “*.py” -exec grep -n “TODO” {} +
/tmp/search/tests/test_app.py:2: # TODO: write tests
/tmp/search/src/app.py:5: # TODO: implement this
末尾を{} +にするとファイルをまとめて渡せるため{} \;より高速です。
パターン2:find | xargs grep(大量ファイルに強い)
/tmp/search/tests/test_app.py:1:def test_process_data():
/tmp/search/src/app.py:4:def process_data(data):
/tmp/search/src/app.py:8:def main():
パターン3:grep -r –include(シンプルで便利)
実はgrep -r --includeだけでも同じことができます。
/tmp/search/docs/README.md:TODO: Add more documentation.
--include="*.md"でファイル種別を絞れるため、findなしでも済む場面も多いです。

Ubuntu 22.04 と 24.04 のバージョン比較
UbuntuのLTSバージョンによってgrep/findのバージョンが異なります。実際にDockerコンテナで確認した結果が下図です。

Ubuntu 22.04(Jammy)はgrep 3.7・findutils 4.8.0、Ubuntu 24.04(Noble)はgrep 3.11・findutils 4.9.0が入っています。日常的な検索には差はありませんが、新しいオプションを使う場合はバージョンを確認してください。
よくあるエラーと解決策
「No such file or directory」が出る
grep: /tmp/notexist.log: No such file or directory
ファイルのパスが間違っています。lsでファイルの存在を確認してから実行してください。
grepでアクセス権エラーが大量に出る
grep: /root: Permission denied
grep: /proc/tty/driver: Permission denied
# エラーメッセージを非表示にする
$ grep -r “error” / 2>/dev/null
2>/dev/nullでエラー出力(標準エラー)を捨てれば、必要な結果だけを見られます。
findでスペースを含むファイル名を扱う
$ find /tmp -name “*.txt” -print0 | xargs -0 wc -l
-print0はファイル名の区切りをヌル文字にします。xargs -0と組み合わせることで、スペースを含むファイル名でも正しく処理できます。
注意
本記事のコマンドはすべて Ubuntu 24.04 LTS(ubuntu:24.04 Dockerイメージ)で確認しています。Ubuntu 22.04でも同じコマンドが使えますが、オプションの一部は動作が異なる場合があります。
まとめ
grepとfindの使い方をUbuntu 24.04で実際に動かしながら解説しました。
まとめ:覚えておきたいコマンド
grep パターン ファイル— ファイル内のテキスト検索(基本)grep -n— 行番号付き表示grep -r— ディレクトリ内を再帰検索grep -v— 一致しない行を表示(除外フィルタ)grep -E 'a|b'— 拡張正規表現でOR検索find ディレクトリ -name "*.txt"— ファイル名で検索find ... -type f/-type d— ファイル/ディレクトリで絞り込みfind ... -mtime -7— 7日以内に更新されたファイルを検索find ... -exec grep -n "TODO" {} +— findとgrepの組み合わせ
この2つのコマンドを使いこなすと、ログ調査・設定変更・コードレビューの効率が大きく上がります。次のステップとして、自分のVPSやサーバー上で実際に試してみることをおすすめします。
VPSでLinuxサーバーを本格的に運用したい方は、次の記事でVPS各社の速度・料金を実測比較しています。
VPS速度比較ベンチマーク(Vultr / DigitalOcean / Linode / ConoHa)



コメント