grep -E コマンド情報まとめ
ターミナルの grep -E コマンドについて、オプション情報、grep、egrep、grep -P との違いや、AIエージェントが実行しようとした場合に危険はあるのかどうかを紹介しています。
目次
grep -E とは
grep -E(extended regular expression grep)は、拡張正規表現(ERE)を使ってファイルや標準入力からパターンにマッチする行を検索するコマンドです。通常の grep が基本正規表現(BRE)を使うのに対し、-E オプションを付けると +、?、|、() などの記号をバックスラッシュなしで使えるようになり、より直感的で読みやすい正規表現が書けます。
オプション「-E」とよく併用するオプション
| オプション | 意味 |
|---|---|
-E | 拡張正規表現(ERE)を有効にする。+ ? | () {} をエスケープなしで使える |
-i | 大文字・小文字を区別せずにマッチする |
-v | パターンに一致しない行を出力する(逆マッチ) |
-n | マッチした行の行番号を先頭に表示する |
-c | マッチした行数のみを表示する |
-o | マッチした部分文字列のみを1件ずつ表示する |
-r | ディレクトリを再帰的に検索する |
--color | マッチ箇所をカラーハイライトする |
-E は正規表現エンジンの切り替えオプションであり、他のオプションと自由に組み合わせて使います。たとえば grep -Eni "pattern" file のようにまとめて指定できます。
拡張正規表現の主な記号
| 記号 | 意味 | 例 |
|---|---|---|
+ | 直前の要素が1回以上繰り返す | go+gle → google, gooogle |
? | 直前の要素が0回または1回現れる | colou?r → color, colour |
| | 左右どちらかにマッチする(OR) | cat|dog → cat または dog |
() | グループ化。| や量指定子と組み合わせる | (error|warn): |
{n,m} | 直前の要素がn回以上m回以下繰り返す | [0-9]{3,5} → 3〜5桁の数字 |
よく使う組み合わせ
複数キーワードのどれかにマッチする行を検索する
grep -E "error|warn|fatal" /var/log/app.log
|(OR)を使って複数パターンを一度に検索します。
ログファイルからエラーレベルの行をまとめて抽出したいときに便利です。
IPアドレス形式の行を抽出する
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
グループ化と量指定子を組み合わせてIPアドレスのパターンを表現しています。
アクセスログから接続元IPを一覧化するときなどに使えます。
マッチ部分だけを取り出してパイプで加工する
grep -Eo "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt | sort -u
-o を加えるとマッチした部分文字列のみが1行ずつ出力されます。sort -u と組み合わせてメールアドレスを重複なく一覧化するといった使い方ができます。
特定パターンを含まない行を除外する
grep -Ev "^#|^$" /etc/ssh/sshd_config
-v と組み合わせてコメント行(# で始まる行)と空行を除外し、有効な設定だけを表示します。
設定ファイルの確認時に重宝します。
ディレクトリを再帰的に検索する
grep -rEn "TODO|FIXME" ./src/
-r(再帰)と -n(行番号)を併用してソースコード全体からTODOコメントを検索します。
ファイル名と行番号が付くのでエディタでの確認もスムーズです。
grep、egrep、grep -P との違い
どれもパターンマッチで行を抽出するコマンドですが、使える正規表現の種類が異なります。
| 項目 | grep(BRE) | grep -E(ERE) | egrep | grep -P(PCRE) |
|---|---|---|---|---|
| 正規表現の種類 | 基本正規表現 | 拡張正規表現 | 拡張正規表現 | Perl互換正規表現 |
+ ? | () | 要エスケープ(\+ など) | エスケープ不要 | エスケープ不要 | エスケープ不要 |
| 後読み・先読み | 非対応 | 非対応 | 非対応 | 対応((?=...) など) |
| 推奨度 | シンプルな検索に | 通常用途に推奨 | 非推奨(将来廃止の可能性) | 複雑なパターンに |
egrep は grep -E と同等ですが、POSIXで非推奨とされており、スクリプトでは grep -E を使うのが安全です。後読み・先読みなど高度なパターンが必要な場合のみ grep -P を検討してください。
ユースケース
Apacheアクセスログから4xx・5xxエラーだけを抽出する
grep -E '" (4[0-9]{2}|5[0-9]{2}) ' /var/log/apache2/access.log
ステータスコードの先頭桁が4または5の行だけを抽出します。
障害調査やアクセス解析の第一歩として利用できます。
シェルスクリプトで入力値のバリデーションを行う
#!/bin/bash
read -p "郵便番号を入力してください(例: 123-4567): " zip
if echo "$zip" | grep -qE "^[0-9]{3}-[0-9]{4}$"; then
echo "正しい形式です"
else
echo "形式が正しくありません"
fi
-q(quiet)と組み合わせると出力を抑制して終了コードだけを返すため、シェルスクリプトの条件分岐に活用できます。郵便番号・電話番号・日付など書式チェックに広く使えるパターンです。
複数の拡張子のファイル名だけを一覧表示する
ls -1 | grep -E "\.(jpg|jpeg|png|gif|webp)$"
カレントディレクトリから画像ファイルだけを抽出する例です。find と組み合わせればサブディレクトリも対象にできます。
AIエージェントが実行しようとした場合
AIエージェントは主に次のような目的で grep -E を実行しようとすることがあります。
- ログファイルから複数のエラーパターンを一括で検索し、障害箇所を特定するために実行することがあります。
- 設定ファイルやソースコードから特定フォーマット(IPアドレス、メールアドレス、URLなど)にマッチする行を抽出するために実行することがあります。
- シェルスクリプト内で入力値が期待する形式かどうかをバリデーションするために実行することがあります。
grep -E コマンドは、ファイルの読み取りのみを行う安全なコマンドです。
システムへの変更を一切加えないため、AI Agentが実行しても問題ありません。