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 を選ぶのが無難です。
動作の図解
-o を付けると、マッチした行ではなく「マッチ部分そのもの」だけが出力され、後段の集計が楽になります。
数字や IP の抽出
数字を含む行を抜き出す例です。
ターミナル
$ echo -e "abc\nuser42\nfoo\norder100" | grep -E '[0-9]+'
user42
order1004 つのオクテットで構成される 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 つができることを確認しましょう。
- grep 応用 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. grep 応用 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- echo でデータを作る
- grep -E を使う
- user42 と order100 を抽出