grep は「ファイルやパイプ入力の中から特定のパターンに一致する行を探す」コマンドです。
ログ解析・設定ファイルの確認・コードの検索など、あらゆる場面で使うLinuxの必須コマンドの一つです。
基本構文
grep [オプション] パターン [ファイル...]
- パターン: 検索する文字列または正規表現
- ファイル: 省略するとは標準入力を読む(パイプと組み合わせやすい)
ステップ1:シンプルな文字列検索
まずはファイルの中から特定の単語を探してみましょう。
# /etc/os-release からID行を探す
grep "ID" /etc/os-release
ID=ubuntu
VERSION_ID="22.04"
複数のファイルを同時に検索することもできます。
grep "error" /var/log/syslog /var/log/auth.log
ファイル名が先頭に付いて、どのファイルにマッチしたかわかります。
ステップ2:よく使うオプション
| オプション | 説明 |
|---|---|
-i | 大文字・小文字を区別しない |
-n | マッチした行の行番号を表示 |
-v | パターンに一致しない行を表示(反転) |
-c | マッチした行数だけ表示 |
-l | マッチしたファイル名だけ表示 |
-r | ディレクトリを再帰的に検索 |
-w | 単語単位でマッチ(前後が単語区切り) |
-A N | マッチ行の後N行も表示 |
-B N | マッチ行の前N行も表示 |
-C N | マッチ行の前後N行を表示 |
例:大文字・小文字を無視して検索
grep -i "warning" /var/log/syslog
例:行番号付きで検索
grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
例:一致しない行を表示(コメント行を除外)
grep -v "^#" /etc/ssh/sshd_config
^# は「行頭が #」を意味します。コメント行を除いた設定のみを確認するときに便利です。
ステップ3:パイプと組み合わせる
grep はパイプとの相性が抜群です。コマンドの出力を絞り込むのに多用します。
# 実行中のプロセスからnginxだけ表示
ps aux | grep nginx
# エラーログの件数を数える
cat /var/log/syslog | grep -i "error" | wc -l
# ポート80のTCP接続を確認
ss -tn | grep ":80"
ステップ4:正規表現を使った検索
grep はデフォルトで基本正規表現(BRE)を使えます。
-E オプションで拡張正規表現(ERE)が使えるようになります(egrep と同等)。
| 記号 | 意味 |
|---|---|
. | 任意の1文字 |
^ | 行頭 |
$ | 行末 |
* | 直前の要素の0回以上の繰り返し |
[] | 文字クラス(例: [0-9]) |
+ | 直前の要素の1回以上(-E 必要) |
? | 直前の要素の0回か1回(-E 必要) |
| | OR(-E では ` |
# IPアドレスのような形式を含む行を検索
grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /var/log/auth.log
# 行末が .conf で終わるファイルを一覧
ls /etc/ | grep -E "\.conf$"
# "start" または "stop" を含む行
grep -E "start|stop" /var/log/syslog
ステップ5:ディレクトリを再帰検索する
-r オプションでディレクトリ以下のすべてのファイルを検索できます。
# /etc 配下の全ファイルから "sshd" を検索
grep -r "sshd" /etc/
# ファイル名だけ表示する(-l と組み合わせ)
grep -rl "sshd" /etc/
# 拡張子を絞り込む(--include)
grep -r --include="*.conf" "timeout" /etc/
実践例:ログ解析
実際のシーンでよく使うコマンドのパターンです。
# 直近のSSHログイン失敗を10件確認
grep "Failed password" /var/log/auth.log | tail -10
# 特定のIPからのアクセスをカウント
grep "192.168.1.100" /var/log/nginx/access.log | wc -l
# 500番台エラーのURLを抽出
grep ' 5[0-9][0-9] ' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn
練習問題
以下のコマンドを実際に試してみてください。
問題1
/etc/passwd から、ログインシェルが /bin/bash であるユーザーをすべて表示してください。
問題2
/etc/passwd を検索し、行番号付きで root という単語を含む行を表示してください。
問題3
ps aux の出力から、自分自身の grep プロセスを除いた bash のプロセスのみを表示してください。(ヒント: grep -v grep を組み合わせる)
問題4
/etc/ 以下の .conf ファイルすべてから timeout という文字列(大文字・小文字問わず)を含むファイル名だけを表示してください。
答え
問題1の答え
grep "/bin/bash" /etc/passwd
問題2の答え
grep -n -w "root" /etc/passwd
-w を使うことで root を単語として厳密にマッチさせ、rootless などが混入しません。
問題3の答え
ps aux | grep bash | grep -v grep
grep -v grep を追加することで、検索自身のプロセスを結果から除外できます。
問題4の答え
grep -ril --include="*.conf" "timeout" /etc/
-r: 再帰検索-i: 大文字・小文字を無視-l: ファイル名のみ表示--include="*.conf":.confファイルだけを対象にする
まとめ
| やりたいこと | コマンド例 |
|---|---|
| ファイルからキーワードを探す | grep "word" file.txt |
| 大文字・小文字を無視 | grep -i "word" file.txt |
| 行番号も表示 | grep -n "word" file.txt |
| 一致しない行を表示 | grep -v "word" file.txt |
| 件数を数える | grep -c "word" file.txt |
| ディレクトリを再帰検索 | grep -r "word" /path/ |
| パイプで絞り込む | command | grep "word" |
| 正規表現を使う | grep -E "pattern" file.txt |
grep はLinuxを使う上で欠かせないコマンドです。オプションを組み合わせると、膨大なログやテキストファイルからも必要な情報を素早く取り出せます。