テキスト処理 初級

grepコマンド入門 ― テキスト検索の基本から応用まで

Linuxのテキスト検索コマンド grep の使い方を、基本オプションから正規表現の活用まで段階的に学ぶ。ログ解析や設定ファイル調査などの実践例も紹介。

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を使う上で欠かせないコマンドです。オプションを組み合わせると、膨大なログやテキストファイルからも必要な情報を素早く取り出せます。