Ubuntuのgrepとfindコマンドでファイル・テキストを検索する方法

コマンド

Ubuntuでファイルを探したり、ファイル内のテキストを検索したりするとき、grepfindの2つのコマンドが大活躍します。ログの調査、設定ファイルの検索、コードベース全体の一括検索…どれもこの2つさえ使えれば解決できます。

本記事では、Ubuntu 24.04 LTSのDockerコンテナで実際にコマンドを動かした結果をもとに、grepfindの使い方を丁寧に解説します。バージョンはGNU grep 3.11 / GNU findutils 4.9.0(Ubuntu 24.04)で確認済みです。

Ubuntu 24.04 で grep・find を実行したターミナルセッション(実測)
Ubuntu 24.04 で grep・find を実行したターミナルセッション(実測)

この記事のポイント

  • grep パターン ファイル でファイル内のテキストを検索できる
  • find ディレクトリ -name "*.txt" でファイルを名前・種別・日時で検索できる
  • grep -r でディレクトリ内を再帰的に検索できる(ログ調査に便利)
  • findgrep を組み合わせると、複数ファイルを横断して特定のテキストを探せる
  • Ubuntu 24.04 LTSのDockerコンテナで実行した実出力を掲載しています

目次

  1. grepコマンドとは
  2. grepの基本的な使い方
  3. grepの便利なオプション
  4. findコマンドとは
  5. findの基本的な使い方
  6. findの便利なオプション
  7. grepとfindを組み合わせた活用術
  8. よくあるエラーと解決策
  9. まとめ

前提環境

本記事のコマンドはすべて ubuntu:24.04(Docker公式イメージ)のコンテナ内で動作確認しています。Vultr・ConoHaなどのVPSでUbuntu 24.04を使っている方も同じ操作で利用できます。Ubuntu 22.04でも基本的な使い方は同じですが、バージョンが異なります(後述)。

grepコマンドとは

grepは「ファイルの中身を検索する」コマンドです。名前は「Global Regular Expression Print(全体正規表現出力)」の略で、指定したパターンに一致する行だけを出力します。

Ubuntuには最初から入っています。バージョン確認コマンドは次のとおりです。




ubuntu@linuxlab: ~
$ grep –version | head -1
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の基本的な使い方

最もシンプルな書き方は次のとおりです。




ubuntu@linuxlab: ~
$ grep 検索パターン ファイル名

手順1:テキストを検索する(基本)

ログファイルからERRORが含まれる行だけ抽出する例です。




ubuntu@linuxlab: ~
$ grep ERROR /tmp/app.log
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オプションをつけます。




ubuntu@linuxlab: ~
$ grep -n INFO /tmp/app.log
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オプションが使えます。




ubuntu@linuxlab: ~
$ grep -c INFO /tmp/app.log
4

INFOが含まれる行が4行あることがわかりました。行の内容ではなく件数だけを知りたいときに使います。

手順4:マッチしない行を表示する(-v)

INFO行以外の行だけを表示したいときは-v(invert match)オプションを使います。




ubuntu@linuxlab: ~
$ grep -v INFO /tmp/app.log
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基本オプション(-n/-c/-v)の実行結果(Ubuntu 24.04 実測)
grep基本オプション(-n/-c/-v)の実行結果(Ubuntu 24.04 実測)

grepの便利なオプション

①大文字小文字を無視する(-i)

ログにerrorと小文字で書かれている場合など、ケースを気にせず検索したいときは-iを使います。




ubuntu@linuxlab: ~
$ grep -i error /tmp/app.log
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オプションが便利です。ソースコード全体から特定の関数を探すときなどに使います。




ubuntu@linuxlab: ~
$ grep -r def /tmp/project/
/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)オプションを使います。




ubuntu@linuxlab: ~
$ grep -r -l import /tmp/project/
/tmp/project/src/main.py

importという文字列が含まれるファイルはmain.pyだけだということがわかりました。大量のファイルの中から対象を絞り込むのに便利です。

④前後の行も表示する(-B / -A)

マッチした行の文脈を確認したいときは-B(Before:前の行)や-A(After:後の行)を使います。




ubuntu@linuxlab: ~
$ grep -B1 -A1 password /tmp/config/settings.ini
port = 5432
password = secret123

passwordの前後1行ずつが表示されました。エラーが起きた前後の状況をまとめて確認するときなどに使います。

⑤拡張正規表現で複数パターンを検索する(-E)

-Eオプションを使うと、|(OR)などの拡張正規表現が使えます。




ubuntu@linuxlab: ~
$ grep -E ‘port|host’ /tmp/config/settings.ini
host = localhost
port = 5432
host = 0.0.0.0
port = 8080

portまたはhostを含む行がまとめて取れました。検索パターンを|で区切ることで複数条件を一度に指定できます。

findコマンドとは

findは「ファイルやディレクトリを検索する」コマンドです。ファイル名・種別・更新日時・サイズ・パーミッションなど、さまざまな条件で絞り込めます。




ubuntu@linuxlab: ~
$ find –version | head -1
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が標準インストールされています。

基本の書き方は次のとおりです。




ubuntu@linuxlab: ~
$ find 検索開始ディレクトリ オプション

findの基本的な使い方

手順1:ファイル名で検索する(-name)

拡張子が.txtのファイルをすべて探す例です。




ubuntu@linuxlab: ~
$ find /tmp/files -name “*.txt”
/tmp/files/docs/readme.txt
/tmp/files/docs/manual.txt

*(ワイルドカード)を使って拡張子でまとめて検索できます。*.log*.sh*.confなど、拡張子を変えて応用できます。

手順2:ファイル種別で絞り込む(-type)

-type fでファイルのみ、-type dでディレクトリのみを絞り込めます。




ubuntu@linuxlab: ~
$ find /tmp/files -type f
/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
find基本オプション(-name/-type)の実行結果(Ubuntu 24.04 実測)
find基本オプション(-name/-type)の実行結果(Ubuntu 24.04 実測)

手順3:検索深さを制限する(-maxdepth)

広い範囲を検索しても深いサブディレクトリまで探すと時間がかかります。-maxdepth 1で直下だけに絞れます。




ubuntu@linuxlab: ~
$ find /tmp/files -maxdepth 1 -type d
/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が便利です。




ubuntu@linuxlab: ~
# 3日以内に更新されたファイルを検索
$ 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)




ubuntu@linuxlab: ~
# 100MB以上のファイルを検索
$ 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を使います。




ubuntu@linuxlab: ~
# 見つかった .sh ファイルに実行権限を付与
$ 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を使うとまとめて渡せるので高速です。




ubuntu@linuxlab: ~
$ find /tmp/demo -name “*.txt” | xargs wc -l
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(確実な方法)




ubuntu@linuxlab: ~
# Pythonファイル内のTODOコメントを行番号付きで検索
$ 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(大量ファイルに強い)




ubuntu@linuxlab: ~
$ find /tmp/search -name “*.py” | xargs grep -n “def “
/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だけでも同じことができます。




ubuntu@linuxlab: ~
$ grep -r –include=”*.md” “TODO” /tmp/search
/tmp/search/docs/README.md:TODO: Add more documentation.

--include="*.md"でファイル種別を絞れるため、findなしでも済む場面も多いです。

find + grep 組み合わせ実行結果(Ubuntu 24.04 実測)
find + grep 組み合わせ実行結果(Ubuntu 24.04 実測)

Ubuntu 22.04 と 24.04 のバージョン比較

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

Ubuntu 22.04 vs 24.04 の grep/find バージョン比較(実測)
Ubuntu 22.04 vs 24.04 の grep/find バージョン比較(実測)

Ubuntu 22.04(Jammy)はgrep 3.7findutils 4.8.0、Ubuntu 24.04(Noble)はgrep 3.11findutils 4.9.0が入っています。日常的な検索には差はありませんが、新しいオプションを使う場合はバージョンを確認してください。

よくあるエラーと解決策

「No such file or directory」が出る




ubuntu@linuxlab: ~
$ grep “ERROR” /tmp/notexist.log
grep: /tmp/notexist.log: No such file or directory

ファイルのパスが間違っています。lsでファイルの存在を確認してから実行してください。

grepでアクセス権エラーが大量に出る




ubuntu@linuxlab: ~
$ grep -r “error” /
grep: /root: Permission denied
grep: /proc/tty/driver: Permission denied
# エラーメッセージを非表示にする
$ grep -r “error” / 2>/dev/null

2>/dev/nullでエラー出力(標準エラー)を捨てれば、必要な結果だけを見られます。

findでスペースを含むファイル名を扱う




ubuntu@linuxlab: ~
# スペースを含むファイル名を安全に扱う
$ find /tmp -name “*.txt” -print0 | xargs -0 wc -l

-print0はファイル名の区切りをヌル文字にします。xargs -0と組み合わせることで、スペースを含むファイル名でも正しく処理できます。

注意

本記事のコマンドはすべて Ubuntu 24.04 LTS(ubuntu:24.04 Dockerイメージ)で確認しています。Ubuntu 22.04でも同じコマンドが使えますが、オプションの一部は動作が異なる場合があります。

まとめ

grepfindの使い方を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やサーバー上で実際に試してみることをおすすめします。

著者アイコン
著者アイコン

個人的に一番使う組み合わせは find . -name "*.log" | xargs grep -n "ERROR" です。デプロイ後のエラー確認でこのパターンをよく使います。

VPSでLinuxサーバーを本格的に運用したい方は、次の記事でVPS各社の速度・料金を実測比較しています。

VPS速度比較ベンチマーク(Vultr / DigitalOcean / Linode / ConoHa)

コメント

タイトルとURLをコピーしました