grep 応用:正規表現

grep 応用 とは

grepコマンドを使いこなし、正規表現でより高度な検索を行う方法を学びます。本レッスンでは、grep 応用 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

前のレッスンで正規表現の基本を学びました。ここでは grep の応用として、実務で頻出するパターン例を組み合わせていきます。ログから IP アドレスを抜き出す、メールアドレスを探す、特定のステータスコードだけ絞り込むといった現場の作業は、ほぼ正規表現の組み立てで解決できます。

grep / grep -E / grep -P

grep には 3 つのモードがあります。

モード特徴推奨用途
grep (BRE)基本正規表現。+?\+\?既存スクリプトの保守・移植性重視
grep -E (ERE)拡張正規表現。多くの言語と感覚が近い一般的な検索
grep -P (PCRE)Perl 互換。先読みなど高機能高度なパターン

PCRE は環境によって使えないこともあるため、可搬性が必要なスクリプトでは grep -E を選ぶのが無難です。

動作の図解

diagram (will load when visible)

-o を付けると、マッチした行ではなく「マッチ部分そのもの」だけが出力され、後段の集計が楽になります。

数字や IP の抽出

数字を含む行を抜き出す例です。

ターミナル

$ echo -e "abc\nuser42\nfoo\norder100" | grep -E '[0-9]+' user42 order100

4 つのオクテットで構成される IP アドレスは次のように書けます (簡易版)。

ターミナル

$ echo -e "192.168.1.10\nlocalhost" | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 192.168.1.10

-o を付ければ IP 部分だけが取り出せます。

ターミナル

$ echo "connect from 10.0.0.1 ok" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' 10.0.0.1

メールアドレスの抽出

ターミナル

$ echo "contact: foo@example.com or bar@test.jp" | grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' foo@example.com bar@test.jp

-o と組み合わせると、1 行から複数のマッチを取り出せる点がポイントです。

-o のあとに | sort | uniq -c | sort -nr を続けると、出現回数ランキングが作れます。アクセスログから多い IP を割り出すといった集計が、ワンライナーで完結します。

文脈付き表示

エラーログを調査するとき、エラー行の前後の状況も見たいことがあります。

オプション効果
-A N一致行の後 N 行を表示
-B N一致行の前 N 行を表示
-C N一致行の前後 N 行を表示

ターミナル

$ grep -B1 -A2 ERROR /tmp/app.log INFO request received ERROR connect failed INFO retry in 5s INFO ok

否定と組み合わせ

複数条件を組み合わせるには、パイプを重ねるか拡張正規表現の | を使います。

ターミナル

$ grep -E 'ERROR|WARNING' /tmp/app.log

ターミナル

$ grep ERROR /tmp/app.log | grep -v timeout

後者は「ERROR の行から、timeout を含むものを除く」流れです。

複雑なパターンは正規表現で書くより、段階的に grep をパイプで重ねる方が読みやすくなることがあります。「まず ERROR を取って、そこから timeout を除く」のように分けると、後から見直したときに意図が伝わります。

やってみよう

演習では echo で複数行のデータを作り、拡張正規表現で「数字を含む行」だけを抽出します。-E の付け方や [0-9]+ の感覚をつかんでください。

数値の範囲指定

ERE では {n} {n,m} で繰り返し回数を指定できます。

ターミナル

$ echo -e "12\n123\n1234" | grep -E '^[0-9]{3}$' 123

上の例は「ちょうど 3 桁の数字だけの行」にマッチします。郵便番号や電話番号の簡易バリデーションに使えます。

アンカーの組み合わせ

行頭と行末を組み合わせると完全一致になります。空行を探したり、特定キーワード単独の行を抽出したりするのに便利です。

ターミナル

$ grep -E '^OK$' /tmp/status.txt OK

単語境界 (PCRE)

GNU grep の -P (PCRE) では \b が単語境界として使えます。-w と似ていますが、より柔軟です。

ターミナル

$ echo -e "main\ndomain\nmainboard" | grep -P '\bmain\b' main

環境によっては -P が無効なため、可搬性が必要なときは grep -w を選ぶのが安全です。

まとめ

  • grep -E (ERE) は現代的なスクリプトに最適
  • -o を付けるとマッチ部分だけ取り出せて集計に向く
  • -A -B -C で前後の文脈を確認できる
  • {n} {n,m} で繰り返し回数を指定できる
  • 複雑なパターンはパイプで段階的に絞ると読みやすい

次のレッスン

次は テキスト加工 sed で、sed を使ったテキストの置換・抽出・加工を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. grep 応用 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. grep 応用 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. echo でデータを作る
  2. grep -E を使う
  3. user42 と order100 を抽出

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力