Linuxで作業していると 「この文字列がどのファイルに書いてあるんだっけ?」 「設定ファイルの中から特定のキーワードを見つけたい!」 という場面がよくあります。
そんなとき強力なのが grep
コマンドです。
この記事では、Linuxでファイルの中身をgrepで検索する方法を中心に、便利なオプションや実例も交えて分かりやすく紹介します。
grepとは?基本的な概念

grepの役割と特徴
grep とは: grep
は 指定した文字列やパターンをファイルの中から探し出すコマンド です。 ファイル名だけではなく、中身のテキストを検索できる のが最大の特徴です。
名前の由来: 「Global Regular Expression Print」の略で、元々はエディタでの検索機能から生まれました。
できること:
- ファイル内の特定の文字列を検索
- 複数ファイルの一括検索
- 正規表現による柔軟なパターン検索
- 検索結果の詳細な出力制御
基本的な構文
基本の書式:
grep [オプション] "探したい文字列" ファイル名
シンプルな例:
grep "Listen" /etc/httpd/conf/httpd.conf
この例では、httpd.conf
内で「Listen」を含む行が表示されます。
複数ファイルを同時検索:
grep "error" /var/log/*.log
検索対象の指定方法
単一ファイル:
grep "keyword" filename.txt
複数ファイル:
grep "keyword" file1.txt file2.txt file3.txt
ワイルドカード使用:
grep "keyword" *.txt
grep "keyword" /etc/*.conf
標準入力から検索:
cat file.txt | grep "keyword"
ps aux | grep "apache"
ディレクトリ全体をgrepで検索する方法

再帰検索の基本
-r オプション(再帰検索):
grep -r "キーワード" ディレクトリ名
-r
オプションを使うことで、指定したディレクトリ以下のすべてのファイルを再帰的に検索できます。
実際の例:
grep -r "server_name" /etc/nginx
この命令で /etc/nginx
配下のすべてのファイルを検索し、server_name
を含む行を一覧表示します。
大文字小文字の扱い
-i オプション(大文字小文字を無視):
grep -ri "server_name" /etc/nginx
これで以下のような文字列もすべてヒットします:
server_name
Server_Name
SERVER_NAME
Server_name
検索範囲の制御
特定の深さまで検索:
find /etc -maxdepth 2 -name "*.conf" -exec grep "listen" {} \;
シンボリックリンクの扱い:
# シンボリックリンクを追跡しない(デフォルト)
grep -r "keyword" /path
# シンボリックリンクも追跡
grep -R "keyword" /path
見つけた場所を分かりやすくするオプション
行番号と ファイル名の表示
-n オプション(行番号表示):
grep -rn "キーワード" /path
出力例:
/etc/nginx/nginx.conf:12: server_name example.com;
/etc/nginx/sites-enabled/default:25: server_name _;
-H オプション(ファイル名を強制表示):
grep -H "keyword" *.txt
複数ファイルを検索する場合、通常は自動でファイル名が表示されますが、単一ファイルでもファイル名を表示したい場合に使用します。
カラー表示と見やすさ
–color オプション(色付け表示):
grep --color=auto "キーワード" ファイル
多くの環境ではデフォルトで色がつきますが、明示的に指定することも可能です。
色の設定:
auto
:ターミナル出力時のみ色付けalways
:常に色付け(パイプ時も)never
:色付けしない
コンテキスト表示
-A オプション(後の行も表示):
grep -A 3 "error" /var/log/app.log
マッチした行の後3行も表示します。
-B オプション(前の行も表示):
grep -B 2 "error" /var/log/app.log
マッチした行の前2行も表示します。
-C オプション(前後の行を表示):
grep -C 2 "error" /var/log/app.log
マッチした行の前後2行ずつ表示します。
高度なgrep検索テクニック

正規表現の活用
基本的な正規表現:
# 行の始まりにある文字列
grep "^Listen" /etc/httpd/conf/httpd.conf
# 行の終わりにある文字列
grep "html$" /etc/nginx/nginx.conf
# 任意の1文字
grep "h.ml" *.txt
# 文字クラス
grep "[0-9]" file.txt
grep "[A-Z]" file.txt
拡張正規表現(-E オプション):
# 複数パターンのいずれか
grep -E "(http|https|ftp)" /etc/hosts
# 1回以上の繰り返し
grep -E "colou?r" file.txt
# グループ化
grep -E "(test|prod)_server" config.txt
複数キーワードの検索
OR検索(複数パターンのいずれか):
grep -E "error|warning|critical" /var/log/syslog
AND検索(すべてのパターンを含む):
grep "error" /var/log/app.log | grep "database"
NOT検索(特定パターンを除外):
grep -v "debug" /var/log/app.log
ファイルタイプの指定
–include オプション(特定ファイルのみ):
grep -r --include="*.php" "function_name" /var/www
grep -r --include="*.conf" "listen" /etc
–exclude オプション(特定ファイルを除外):
grep -r --exclude="*.log" "keyword" /path
–exclude-dir オプション(ディレクトリを除外):
grep -r --exclude-dir=".git" "keyword" /project
grep -r --exclude-dir="node_modules" "function" /webapp
findとgrepの組み合わせテクニック
基本的な組み合わせ
find + grep(-exec使用):
find /var/www -name "*.php" -exec grep -H "mysqli" {} \;
パラメータの説明:
-H
:ファイル名を必ず表示{}
:findが見つけたファイル名を代入\;
:-execの終了を示す
find + grep(xargs使用):
find /var/www -name "*.php" | xargs grep "mysqli"
ファイル数が多い場合、xargsを使った方が高速です。
より高度な組み合わせ
特定の日付以降に更新されたファイルのみ検索:
find /project -name "*.py" -mtime -7 | xargs grep "def main"
サイズが大きいファイルを除外:
find /logs -name "*.log" -size -10M | xargs grep "error"
権限で絞り込み:
find /etc -name "*.conf" -perm -644 | xargs grep "port"
実践的な検索例
システム管理でよく使う検索
設定ファイルでのポート番号検索:
grep -r "80\|443\|8080" /etc/
エラーログの調査:
grep -i "error\|fail\|exception" /var/log/*.log
プロセス検索:
ps aux | grep -v grep | grep apache
ネットワーク設定の確認:
grep -r "192.168" /etc/
開発作業での検索
関数・メソッドの使用箇所検索:
grep -r "function_name" /project/src/
TODOコメントの検索:
grep -r "TODO\|FIXME\|HACK" /project/ --include="*.py"
環境変数の検索:
grep -r "\$[A-Z_]*" /project/ --include="*.sh"
SQLクエリの検索:
grep -ri "select.*from" /project/ --include="*.php"
ログ分析での活用
特定時間帯のログ検索:
grep "2024-01-15 14:" /var/log/apache2/access.log
IPアドレスでのフィルタリング:
grep "192.168.1.100" /var/log/auth.log
HTTPステータスコードの検索:
grep " 404 \| 500 \| 503 " /var/log/apache2/access.log
特殊なファイル形式の検索

圧縮ファイルの検索
zgrep(gzip圧縮ファイル):
zgrep "error" /var/log/syslog.gz
zgrep "keyword" *.gz
bzgrep(bzip2圧縮ファイル):
bzgrep "pattern" file.bz2
xzgrep(xz圧縮ファイル):
xzgrep "pattern" file.xz
バイナリファイルの扱い
バイナリファイルを除外:
grep -I "keyword" *
バイナリファイルの文字列検索:
grep -a "string" binary_file
バイナリファイルかどうかの判定のみ:
grep -L "." * | head -5
パフォーマンス最適化
検索速度の向上
固定文字列検索(-F オプション):
grep -F "literal_string" large_file.txt
正規表現を使わない場合、-Fオプションで高速化できます。
並列検索:
find /large/directory -name "*.txt" | xargs -P 4 grep "pattern"
-P オプションで並列度を指定できます。
メモリ効率の改善:
grep --mmap "pattern" very_large_file.txt
検索結果の制限
最初のN件のみ表示:
grep "pattern" file.txt | head -10
マッチ数のカウント:
grep -c "pattern" file.txt
マッチするファイル名のみ表示:
grep -l "pattern" *.txt
マッチしないファイル名のみ表示:
grep -L "pattern" *.txt
トラブルシューティング

よくあるエラーと対処法
「Permission denied」エラー:
# 権限エラーを無視
grep -r "pattern" /path 2>/dev/null
# sudoで実行
sudo grep -r "pattern" /protected/path
「Argument list too long」エラー:
# xargsを使用
find /path -name "*.txt" | xargs grep "pattern"
文字化けの対処:
# 文字コードを指定
LANG=C grep "pattern" file.txt
# UTF-8で強制
LANG=ja_JP.UTF-8 grep "pattern" file.txt
検索結果が見つからない場合
チェックポイント:
- ファイルパスの確認
- 権限の確認
- 大文字小文字の違い
- 隠しファイルの存在
- バイナリファイルの可能性
デバッグ用のコマンド:
# ファイルの存在確認
ls -la /path/to/file
# ファイルタイプの確認
file /path/to/file
# 権限の確認
ls -ld /path/to/directory
便利なgrepエイリアスとスクリプト
便利なエイリアス設定
~/.bashrc に追加すると便利:
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
# よく使う組み合わせ
alias grepr='grep -r --color=auto'
alias greph='grep -rn --color=auto'
alias grepx='grep -r --exclude-dir=.git --exclude-dir=node_modules'
自作スクリプトの例
search.sh(包括的検索スクリプト):
#!/bin/bash
# 使用法: ./search.sh "pattern" "directory"
pattern="$1"
directory="${2:-.}"
echo "=== ファイル名検索 ==="
find "$directory" -name "*$pattern*" -type f
echo -e "\n=== ファイル内容検索 ==="
grep -rn --color=always "$pattern" "$directory" 2>/dev/null
echo -e "\n=== 圧縮ファイル内検索 ==="
find "$directory" -name "*.gz" -exec zgrep -l "$pattern" {} \; 2>/dev/null
まとめ
重要なポイント
基本的な使い方:
- 単一ファイル検索:
grep "keyword" filename
- ディレクトリ全体検索:
grep -r "keyword" directory
- 大文字小文字無視:
grep -i "keyword" file
- 行番号表示:
grep -n "keyword" file
実用的なオプション組み合わせ:
grep -rn
:ディレクトリ検索+行番号表示grep -ri
:大文字小文字無視+ディレクトリ検索grep -v
:除外検索(NOT検索)grep -c
:マッチ数のカウント
find との組み合わせ:
- 特定ファイルタイプ:
find /path -name "*.ext" | xargs grep "pattern"
- 日付条件付き:
find /path -mtime -7 | xargs grep "pattern"
- サイズ条件付き:
find /path -size -10M | xargs grep "pattern"
実際の活用場面
システム管理:
- 設定ファイルの確認:
grep -r "port" /etc/
- ログ分析:
grep "error" /var/log/*.log
- プロセス確認:
ps aux | grep apache
開発作業:
- 関数検索:
grep -r "function_name" /project/
- TODO検索:
grep -r "TODO" /project/ --include="*.py"
- 変数使用箇所:
grep -r "variable_name" /src/
日常のファイル管理:
- 文書内検索:
grep -r "keyword" ~/Documents/
- 設定確認:
grep "setting" ~/.config/*
これらのテクニックを覚えておくと:
- 「設定ファイルの中にどこでポート80を指定してる?」
- 「どのPHPファイルでこの変数使ってる?」
- 「エラーログで特定の時間帯に何が起きた?」
といった疑問を即座に解決できるようになります。
ぜひ今日から実際のコマンドを試して、grepを使いこなしてみてください!
コメント