0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux・macOS検索コマンド入門 grep・find・rg・fdを使い分ける

0
Posted at

Linux・macOS検索コマンド入門 grep・find・rg・fdを使い分けるのアイキャッチ

はじめに

「ログのどこにERRORがあるか」「プロジェクト内のどのファイルに関数名が書かれているか」「設定ファイルをどこに保存したか」。ターミナルでの検索は、開発と障害調査の両方で頻繁に使います。

一方で、grepfindrgfdなど、似たコマンドが多く、最初は使い分けに迷います。

この記事では、次の順で初心者向けに説明します。

  1. 何を探すからコマンドを選ぶ
  2. 標準的なgrepfindを覚える
  3. 開発プロジェクトでrgfdを使う
  4. Ubuntu、Amazon Linux、macOSの違いを知る
  5. ログ調査と安全な検索方法を覚える

先に結論

まずは、「ファイルの中身」と「ファイル名」を分けて考えると整理しやすくなります。

探したいもの 最初の選択 主な用途
1つのファイル内の文字列 grep ログ、設定ファイル、コードの確認
ディレクトリ配下の文字列 rg、またはgrep -r プロジェクト全体の検索
ファイル名やディレクトリ名 find、またはfd 設定ファイルや生成物の場所確認
Git管理中のファイル内 git grep リポジトリ内のコード検索
大きなログを開いたまま検索 less ログ調査
macOS全体 mdfind Spotlightのインデックスを使った検索
コマンド本体の場所 command -v どの実行ファイルが使われるかの確認

最初に覚えるなら、次の4つで十分です。

ターミナル
# 1ファイル内で、記号を正規表現と解釈せずに検索する。
grep -nF 'ERROR' application.log

# ディレクトリ配下を再帰検索し、バイナリを除外する。
grep -r -I -n -F 'ERROR' .

# ripgrepがある場合は、プロジェクト全体を高速に検索する。
rg -nF 'ERROR' .

# ファイル名にconfigを含むファイルを探す。
find . -type f -iname '*config*'

この記事で使う構成例

以降は、次のような構成を例にします。tree sample-search の実行結果です。

ターミナル
sample-search
├── .gitignore
├── logs
│   ├── application.log
│   └── system.log
├── node_modules
│   └── example.js
└── src
    ├── config.ts
    └── user.ts

3 directories, 7 files

.は現在のディレクトリを表します。実行前にpwdlsで場所を確認すると、別のディレクトリを検索するミスを減らせます。

ターミナル
# 現在地とファイル一覧を確認する。
pwd
ls

1. grepでファイルの中身を探す

grepは、テキストから指定したパターンに一致する行を表示するコマンドです。Ubuntu、Amazon Linux、macOSで標準的に使えます。

1ファイルを行番号付きで検索する

ターミナル
# ERRORを固定文字列として検索し、行番号を表示する。
grep -nF 'ERROR' logs/application.log
出力例
15:ERROR Database connection failed
87:ERROR Request timeout

1587が行番号です。

オプション 意味 使う場面
-n 行番号を表示する 一致箇所をエディタで開きたいとき
-F 正規表現ではなく固定文字列として扱う URL、IPアドレス、設定値、コードをそのまま探すとき
-i 大文字と小文字を区別しない ERRORErrorerrorをまとめて探すとき
-w 単語単位で一致させる userを探し、usernameは除外したいとき
-H ファイル名を表示する 検索対象が複数ファイルあるとき

URLやIPアドレスには.[など、正規表現で特別な意味を持つ記号が含まれることがあります。正規表現が必要でなければ、-Fを付けると意図しない一致を減らせます。

大文字と小文字を区別せず探す

ターミナル
# ERRORの大文字・小文字を区別せず検索する。
grep -n -i -F 'error' logs/application.log

一致行の前後も表示する

エラーの直前に何が起き、直後にどのような処理が続いたかを見るときは、-A-B-Cを使います。

ターミナル
# 一致行の前後3行も表示する。
grep -n -C 3 -F 'ERROR' logs/application.log
オプション 意味
-A 3 一致行の後ろを3行表示する
-B 3 一致行の前を3行表示する
-C 3 一致行の前後を3行ずつ表示する

ディレクトリ配下を検索する

ターミナル
# 現在のディレクトリ配下を再帰的に検索する。
grep -r -I -n -F 'getUserData' .
オプション 意味
-r サブディレクトリを含めて再帰的に検索する
-I バイナリファイルを検索対象から除外する
-n 行番号を表示する
-F 固定文字列として検索する

grep -rInに含まれるのは、-r、大文字の-I-nです。小文字の-iは含まれません。初めのうちはgrep -r -I -nのように分けて書くと、オプションを読み違えにくくなります。

拡張子を限定し、不要なディレクトリを除外する

ターミナル
# TypeScriptだけを対象にし、.gitとnode_modulesを除外する。
grep -r -I -n -F \
  --include='*.ts' \
  --exclude-dir='.git' \
  --exclude-dir='node_modules' \
  'getUserData' .

一致したファイル名だけ表示する

ターミナル
# 一致行は表示せず、対象ファイルを1ファイル1回だけ表示する。
grep -r -I -l -F 'ERROR' .

-lは小文字のLです。大文字の-Lは、一致しなかったファイル名を表示する別のオプションです。

2. rgで開発プロジェクトを高速に探す

rgripgrepという検索ツールのコマンド名です。最初からディレクトリを再帰検索し、通常は.gitignore、隠しファイル、バイナリを考慮して不要な対象を除外します。ソースコードの検索では、grep -rより短く書けます。

ターミナル
# プロジェクト全体から固定文字列を検索する。
rg -nF 'getUserData' .

# 一致したファイル名だけ表示する。
rg -lF 'getUserData' .

# TypeScriptとTSXだけを対象にする。
rg -nF \
  -g '*.ts' \
  -g '*.tsx' \
  'getUserData' .

rgでファイル名を絞り込む

ターミナル
# rgの検索対象ファイルを一覧にする。
rg --files

# ファイル名にconfigを含むものを絞り込む。
rg --files | rg -i 'config'

.gitignoreの対象も検索したいときは--no-ignore、隠しファイルも含めたいときは--hiddenを明示します。ただし、検索量が増えるため、必要な場合だけ使います。

ターミナル
# 隠しファイルを含めるが、ignore設定は引き続き尊重する。
rg --hidden -nF 'API_URL' .

# ignore設定の対象も意図的に検索する。
rg --no-ignore -nF 'API_URL' .

3. findでファイル名や更新時刻を探す

findは、ファイル名、種類、更新時刻などの条件でパスを探すコマンドです。ファイルの中身ではなく、「どこにあるか」を探すときに使います。

ターミナル
# ファイル名にconfigを含むファイルを探す。
find . -type f -iname '*config*'

# ファイル名がapplication.ymlのものを探す。
find . -type f -name 'application.yml'

# ディレクトリ名にconfigを含むものを探す。
find . -type d -iname '*config*'
条件 意味
-type f ファイルだけを対象にする
-type d ディレクトリだけを対象にする
-name 大文字と小文字を区別して名前を比較する
-iname 大文字と小文字を区別せず名前を比較する

*config*のようなワイルドカードは、シェルではなくfindに渡す必要があります。必ずシングルクォートで囲みます。

複数の拡張子を探す

ターミナル
# JavaScript、TypeScript、TSXを検索対象にする。
find . -type f \( \
  -name '*.js' \
  -o -name '*.ts' \
  -o -name '*.tsx' \
\)

\(\)で複数条件をひとまとまりにし、-oで「または」を表します。

最近更新されたファイルを探す

ターミナル
# 直近7日以内に更新されたファイルを探す。
find . -type f -mtime -7

# 直近60分以内に更新されたファイルを探す。
find . -type f -mmin -60

findgrepを安全に組み合わせる

ターミナル
# .confファイルのみをgrepへ渡し、timeoutを検索する。
find . -type f -name '*.conf' \
  -exec grep -nH -F 'timeout' {} +

{}に見つかったパスが入り、+によって複数パスをまとめてgrepへ渡します。単純なfind ... | xargs grep ...より、空白や改行を含むファイル名を扱いやすい書き方です。

4. fdでファイル名を簡潔に探す

fdfindよりも短いコマンドでファイル名を探せるツールです。通常は.gitignoreや隠しファイルも考慮するため、開発プロジェクトで使いやすくなっています。検索パターンは標準で正規表現として扱われ、-gを付けるとシェルのワイルドカードに近いグロブとして指定できます。

ターミナル
# ファイルだけを対象にし、名前にconfigを含むものを探す。
fd -t f 'config'

# log拡張子のファイルを探す。
fd -t f -e log

# グロブとしてファイル名を指定する。
fd -t f -g '*config*'

UbuntuでAPT版をインストールした場合は、コマンド名がfdではなくfdfindになります。

5. Gitリポジトリでgit grepを使う

git grepは、基本的にGitが追跡しているファイルを検索します。node_modulesや一時ファイルを避け、リポジトリのコードだけを探したいときに便利です。

ターミナル
# Gitの追跡対象から固定文字列を検索する。
git grep -nF 'getUserData'

# TypeScriptとTSXに対象を限定する。
git grep -nF 'getUserData' -- '*.ts' '*.tsx'

# 一致したファイル名だけ表示する。
git grep -lF 'getUserData'

Gitにまだ追加していない新規ファイルも探したい場合は、rgまたはgrep -rを使います。

6. Ubuntu、Amazon Linux、macOSの違い

基本的なgrepfindは同じ考え方で使えます。ただし、UbuntuやAmazon LinuxではGNU版、macOSではBSD系の実装が標準です。そのため、すべてのオプションが完全に同じとは限りません。

OS 標準のgrepfind パッケージ管理 rg fd OS全体の検索
Ubuntu 24.04 GNU版 apt ripgrepパッケージ fd-findパッケージ、コマンド名はfdfind find、必要に応じてlocate
Amazon Linux 2023 GNU版 dnf 標準リポジトリの有無を都度確認 標準リポジトリの有無を都度確認 find
Amazon Linux 2 GNU版 yum パッケージとサポート元を確認 パッケージとサポート元を確認 find
macOS BSD系 Homebrewはbrew brew install ripgrep brew install fd、コマンド名はfd mdfind

Amazon Linux 2は2026年6月30日にサポートが終了しています。表のAmazon Linux 2は既存環境を調査するための参考です。新規構築ではAmazon Linux 2023を選び、既存のAmazon Linux 2は移行を計画します。

Ubuntuでrgfdを入れる

Ubuntu 24.04では、APTの標準リポジトリからインストールできます。

ターミナル
# パッケージ情報を更新し、ripgrepとfd-findを入れる。
sudo apt update
sudo apt install -y ripgrep fd-find

# Ubuntuのfd-findパッケージはfdfindという名前で実行する。
rg --version
fdfind --version

Amazon Linuxでは先に標準コマンドを確認する

Amazon Linux 2023ではgrepfindutilsのRPMを確認します。ripgrepfd-findは、リリースとアーキテクチャーによって利用できるパッケージが異なる可能性があるため、インストールコマンドを固定して覚えません。

ターミナル
# Amazon Linux 2023で標準の検索コマンドのRPMを確認する。
rpm -q grep findutils

# 現在有効なリポジトリで提供されているか検索する。
dnf search ripgrep
dnf search fd-find

2026年8月27日にAWS公式のAmazon Linux 2023全パッケージ一覧を確認した範囲では、ripgrepfd-findを確認できませんでした。見つからない場合は、まずgrepfindを使います。外部バイナリやRustのcargo installを使う場合は、組織のソフトウェア導入ルールとサポート方針を先に確認してください。

Amazon Linux 2ではdnfではなくyumを使います。古い手順にあるEPELの有効化をそのまま適用せず、現在のサポート状況を確認します。

macOSでrgfdを入れる

ターミナル
# Homebrewからripgrepとfdを入れる。
brew install ripgrep fd

# 実行できるコマンドとバージョンを確認する。
command -v rg
command -v fd
rg --version
fd --version

GNU版とBSD版で異なる例

この記事のgrep -nFgrep -r -I -nfind -namefind -inamefind -mminfind -exec ... {} +は、Ubuntu、Amazon Linux、macOSの実装で使える範囲に絞っています。

一方で、次の例はmacOS標準コマンドではそのまま使えません。

Linuxで見かける例 macOS標準での状態 対処
grep -P BSD grepでは-Pを使えない 基本正規表現や拡張正規表現で表現するか、GNU grepを入れる
find ... -printf BSD findでは-printfを使えない -print-execを使うか、GNU findutilsを入れる

GNU版が必要な場合は、Homebrewで導入できます。標準コマンドと区別するため、通常はggrepgfindという名前で実行します。

ターミナル
# GNU版が本当に必要な場合だけ導入する。
brew install grep findutils

# macOS標準版とGNU版を混同しないよう、実行名を確認する。
ggrep --version
gfind --version

7. ログを検索する

ログファイルをlessで開く

大きなログを開いたまま前後を確認するなら、lessが便利です。

ターミナル
# ログを必要な範囲だけ読み込みながら表示する。
less logs/application.log

lessを開いた後は、次のキーを使います。

操作 動作
/ERROR 前方向にERRORを検索する
?ERROR 後方向にERRORを検索する
n 同じ方向の次の一致箇所へ移動する
N 反対方向の一致箇所へ移動する
q lessを終了する

ログを追跡しながら見る場合はless +Fを使います。Ctrl+Cで追跡を止めると、そのまま/ERRORで検索できます。

ターミナル
# 追記されるログを追跡する。
less +F logs/application.log

UbuntuとAmazon Linuxのsystemdログを探す

UbuntuとAmazon Linux 2023はsystemdを使うため、サービスログがファイルではなくJournalにある場合があります。journalctlで対象サービスと期間を絞ります。

ターミナル
# nginxサービスの直近1時間を取得し、errorを大文字・小文字を区別せず探す。
sudo journalctl \
  -u nginx \
  --since '1 hour ago' \
  --no-pager \
  | grep -iF 'error'

nginxの部分は実際のsystemdユニット名に置き換えます。

macOSの統合ログを探す

macOSの統合ログはlog showで検索できます。CONTAINS[c][c]は、大文字と小文字を区別しない指定です。

ターミナル
# 直近1時間の統合ログからerrorを含むメッセージを探す。
log show \
  --last 1h \
  --style compact \
  --predicate 'eventMessage CONTAINS[c] "error"'

8. macOS全体をmdfindで探す

mdfindはSpotlightのメタデータストアを検索するmacOS専用コマンドです。find /でストレージ全体を順にたどるより速い場合があります。

ターミナル
# ファイル名がnginx.confに一致するものをSpotlightで探す。
mdfind -name 'nginx.conf'

# Documents配下に検索範囲を限定する。
mdfind -onlyin "$HOME/Documents" 'invoice'

# 一致件数だけ表示する。
mdfind -count 'invoice'

mdfindはインデックスを使うため、Spotlightの検索対象外にした場所や、まだインデックスが更新されていないファイルは見つからない可能性があります。結果が出ないときは、対象ディレクトリからfindも試します。

9. Vimで開いたファイルを探す

Vimのノーマルモードで/を入力すると、ファイル内を前方向に検索できます。

Vim
/ERROR
キー 動作
/ERROR 前方向にERRORを検索する
?ERROR 後方向にERRORを検索する
n 同じ方向の次の一致箇所へ移動する
N 反対方向の一致箇所へ移動する
* カーソル位置の単語を前方向に検索する
# カーソル位置の単語を後方向に検索する

Vimのwは検索ではなく、次の単語の先頭へ移動するコマンドです。カーソル位置の単語を探すときは*を使います。

10. コマンド本体の場所を探す

同じ名前のPythonやNode.jsが複数入っているときは、コマンドがどこから実行されるかを確認します。

ターミナル
# PATH上で最初に見つかるpython3を表示する。
command -v python3

# エイリアス、シェル関数、実行ファイルを含め、同名候補を表示する。
type -a python3

whichもよく見かけますが、シェルのエイリアスや関数まで確認するなら、command -vtype -aを先に使うと判断しやすくなります。

よくある失敗と安全な使い方

1. 検索文字列とワイルドカードを引用符で囲む

ターミナル
# シェルの展開を避けるため、パターンをシングルクォートで囲む。
grep -nF 'https://example.com?a=1&b=2' config.txt
find . -type f -name '*.log'

検索したい値自体にシングルクォートが含まれる場合は、引用符の組み立て方が変わります。

2. 最初から権限エラーを隠さない

2>/dev/nullを付けると標準エラー出力を捨てられますが、アクセス権限の問題まで見えなくなります。まずエラーを読み、検索開始ディレクトリや権限が正しいか確認します。

3. 検索と削除を一度に行わない

findには-delete-exec rmと組み合わせる方法もありますが、条件を間違えると予期しないファイルを失います。この記事では検索だけを扱います。削除する場合は、先に対象一覧を確認し、バックアップやGitの状態を確認します。

4. rgの結果がないときはignore設定を確認する

rgは高速で便利ですが、.gitignore.ignoreに入っているパスを通常は除外します。rg --filesで検索対象を確認し、必要な場合だけ--hidden--no-ignoreを付けます。

実務用チートシート

やりたいこと コマンド
1ファイル内の固定文字列を行番号付きで探す grep -nF '文字列' file.txt
ディレクトリ配下を標準コマンドで探す grep -r -I -n -F '文字列' .
開発プロジェクトを高速に探す rg -nF '文字列' .
一致したファイル名だけ表示する rg -lF '文字列' .
ファイル名で探す find . -type f -iname '*ファイル名*'
Gitの追跡対象を探す git grep -nF '文字列'
Ubuntuのfd-findで探す fdfind -t f 'ファイル名'
macOS全体から名前で探す mdfind -name 'ファイル名'
コマンドの場所を確認する command -v コマンド名

参考・確認先

仕様確認日: 2026年8月27日

まとめ

  • ファイルの中身はgrepまたはrgで探す
  • ファイル名はfindまたはfdで探す
  • Gitの追跡対象だけ探すならgit grepを使う
  • UbuntuとAmazon LinuxはGNU版、macOSはBSD系のgrepfindが標準のため、OS間で一部オプションが異なる
  • Linuxのsystemdログはjournalctl、macOSの統合ログはlog showで絞り込む
  • findと削除コマンドを組み合わせる前に、必ず検索結果を確認する

おわりに

検索コマンドは、オプションをすべて暗記するより、「中身を探すのか、名前を探すのか」を切り分けることが大切です。まずgrep -nFfind -inameから始め、開発プロジェクトではrgfdを追加すると、無理なく使い分けられます。

Wealthy Designでは、AWS・Google Cloud・Microsoft Azureのクラウド設計やWeb開発と合わせて、Linuxの基本操作や障害調査を再現できる形で学ぶことを大切にしています。技術発信やエンジニア育成の取り組みは、会社サイトにまとめています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?