この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
セミナーや受講生からの質問フォームで、こういった声を毎月のようにいただきます。正規表現は、Linuxを学ぶ上で多くの方が「難しい」「覚えられない」と一度は壁にぶつかる分野です。記号の意味を知らないまま使おうとするから、呪文に見える。その気持ちは痛いほど分かります。
私自身も、SEとして働き始めた頃に正規表現を「記号の羅列」として見ていた時期がありました。grepコマンドをなんとなく使えてはいたものの、-Eオプションがなぜ必要なのかも分からず、パターンを書くたびにエラーと格闘していた経験があります。転機になったのは、実務の中で「この問題を解くには正規表現しかない」という場面に出会った日のことです。
この記事では、20年以上Linuxサーバーを運用し、3,100名以上を指導してきた経験から、正規表現を「呪文」から「武器」に変えた転換点の話と、セミナー受講生に伝えている習得の3段階を解説します。コマンドリファレンスとしてではなく、「どう考えれば使えるようになるか」という視点でお読みください。
この記事のポイント
・正規表現は「暗記する」ものではなく「使いながら体に覚えさせる」もの
・grepの -E オプション(拡張正規表現)から習得を始めると挫折しにくい
・「動かない」時の原因はパターンより「シングルクォート漏れ」か「-Eなし」が多い
・習得の3段階(文字クラス習得→実務活用→自分で設計)を意識して進める
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
正規表現を「呪文」と感じていたSE時代のこと
私がシステムエンジニアとして働き始めたのは2001年です。当時はRed Hat Linux 8やCentOS 3が現場に入り始めていた頃で、コマンド操作はほぼ手探りで覚えていました。grepについては、「ファイルの中から文字列を検索するコマンド」という認識でなんとなく使えてはいたのですが、正規表現のオプション(-E や -P)の存在は知らず、エラーが出るたびに先輩に「なんか動かないんですよ」と聞いていました。
そのときの先輩の回答が「-E 付けてみ」という一言でした。付けたら動いた。でも「なぜ動いたのか」が分からないまま次の作業に進んでしまいました。今思えば、これが正規表現の習得を遠ざけた最初の体験です。「とりあえず動いた」で終わらせてしまったことが、後の混乱の原因になりました。
1. grepの「.」がワイルドカードだと知らなかった頃
数ヶ月後、Apacheのアクセスログを調査する作業で似たような状況に遭遇しました。特定のパターンにマッチするIPアドレスをリストアップしたいのですが、grepの基本検索では思うようにいかない。`grep "192.168"` と書いたら確かにヒットする。でも「192と168の間の任意の文字1個」も一緒にヒットしてしまう。たとえば「192X168」のような文字列もマッチしてしまいました。それが「.」(ドット)がワイルドカードとして機能するせいだと、そのとき初めて気づきました。
正規表現の「.」は「任意の1文字」を意味します。これを知らずにIPアドレスを含む文字列を検索していると、意図しない行がヒットし続ける。当時の私は「grepは精度が低いコマンド」だと誤解していましたが、正しくは「正規表現の仕様を理解していなかった」のです。
ピリオドをリテラル(文字そのもの)として検索するには、バックスラッシュでエスケープして `\.` と書く必要があります。この一点を知るだけで、IPアドレスの検索精度が劇的に上がりました。
2. 「なんとなく動いた」で終わらせると次で詰まる
この経験で学んだのは、「記号の意味」を知らないまま使い続けることの危うさです。grepが「なんとなく動いた」場合でも、正規表現の記号が何を意味しているのかを理解していなければ、少し条件が変わっただけで対応できなくなります。私がセミナーで3,100名以上を指導してきた中でよく見かけるのが、この「なんとなく動いた体験」の積み重ねで学習が止まってしまうパターンです。動いた理由を理解せずに進むと、次に動かなかったとき原因が分からない。正規表現に限らず、Linuxコマンド全般に言えることです。
転換点になった「実務での一発解決」体験
SE時代で最も印象に残っている正規表現の活用体験は、Webサーバーへの不審なアクセスを調査した日のことです。1. Apacheログから不審なリクエストを秒で絞り込んだ経験
あるWebサーバーで「/etc/passwdへのアクセス試行」がログに記録されていることが分かりました。攻撃者が `/etc/passwd` や `/etc/shadow` をURLに含めてリクエストを投げてくる、典型的なスキャンです。ファイルサイズが数十MBあるアクセスログから、該当のリクエストだけを抽出する必要がありました。このとき初めて `-E` オプションを使った正規表現で複数パターンを一発で検索しました。
# アクセスログから /etc 配下へのアクセス試行を一括抽出する # grep -E "/etc/(passwd|shadow|hosts|crontab)" /var/log/httpd/access_log # 結果例(実際のサーバーログ形式) 210.130.xx.xx - - [04/Sep/2026:03:12:44 +0900] "GET /cgi-bin/../../etc/passwd HTTP/1.1" 404 196 210.130.xx.xx - - [04/Sep/2026:03:12:51 +0900] "GET /?../../etc/shadow HTTP/1.1" 400 226 # 攻撃元のIPアドレスだけを抽出する(-oEで「マッチした部分のみ」を出力) # grep -E "/etc/(passwd|shadow|hosts|crontab)" /var/log/httpd/access_log | grep -oE "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" 210.130.xx.xx
「正規表現を使える人は作業が速い」と先輩から聞いたことがありましたが、この瞬間、その意味が実感として分かりました。30分かかっていた調査が5分に縮まる。ログ調査の現場では、正規表現が使えるかどうかで生産性に明確な差が出ます。
2. この体験で気づいた正規表現の本質
この体験で気づいたことが2つあります。1つ目は、正規表現は「暗記するもの」ではなく「意味を理解してから使うもの」だということです。`|` は OR、`+` は「1回以上の繰り返し」、`[0-9]` は「0から9の任意の1文字」——それぞれの記号に明確な意味があり、組み合わせることで強力なフィルタリングが実現できます。「記号の意味」を分かった上で書くのか、コピペで試行錯誤するのかでは、習得の速さが全く違います。
2つ目は、「実務の文脈」があると格段に覚えやすいということです。抽象的な正規表現の解説書より、「Apacheログからこのパターンを抽出したい」という具体的な目的があったほうが、記号の意味が頭に入りやすい。セミナーでもそう伝えています。学習に詰まったら、「本で覚えよう」より「今目の前の問題を正規表現で解こう」という姿勢に切り替えることを薦めます。
現役講師が伝える正規表現習得の3段階
私が3,100名以上の受講生を指導してきた経験から言うと、正規表現の習得には明確な3段階があります。この3段階を意識せずに「正規表現を全部一気に覚えよう」とすると、ほぼ確実に挫折します。覚えるべき量が多すぎると感じて諦めるか、コピペが増えて理解が進まないか、どちらかになりがちです。1段階目: 文字クラスと量指定子の6種類だけ先に覚える
まず習得すべきは以下の6種類の記号です。この6つを覚えるだけで、日常的なgrepの作業の8割はカバーできます。・.(ドット): 任意の1文字(改行を除く)
・[](文字クラス): 括弧内のいずれか1文字(例: [0-9], [a-zA-Z])
・*(アスタリスク): 直前の文字が0回以上の繰り返し
・+(プラス): 直前の文字が1回以上の繰り返し(grep -E または \+ が必要)
・^(カレット): 行頭
・$(ドル記号): 行末
最初から `{m,n}` や `(?:...)` の非キャプチャグループを覚える必要はありません。難しい構文は「必要になったとき」に覚えれば十分です。
受講生からよく聞かれる質問が「全部一気に覚えなくていいんですか?」というものです。覚えなくていいです。現場のエンジニアでも、自分がよく使うパターンは10種類もないことが多い。「覚えている正規表現」より「必要なときにすぐ引けるかどうか」のほうが実務では重要です。
2段階目: grepで実際に使いながら体に覚えさせる
記号の意味を頭で理解したら、次は実際に使いながら「体で覚える」フェーズです。私が受講生に薦めているのは「手元のログファイルで毎日1回 grep -E を使う」という習慣です。/var/log/messages や /var/log/secure、Apacheのアクセスログなど、実際に存在するログに対して「今日は何があったか」を grep -E で調べる。
最初は簡単なパターン(特定のIPアドレス、特定のエラー文字列)から始めて、慣れてきたら「192.168.で始まるアクセス」「ERRORかWARNが含まれる行」のように条件を組み合わせていく。繰り返すことで、記号の意味が手と頭に同時に刻まれます。
この習慣を1ヶ月続けると、パターンを「見て分かる」だけでなく「書ける」状態に近づきます。学習の実感が薄い方は、教材を読む時間の一部を「実際に手を動かす時間」に置き換えてみてください。
3段階目: 自分でパターンを設計して説明できるようにする
3段階目は「人に説明できるレベル」を目指す段階です。この段階になると、正規表現は「呪文」ではなく「設計言語」として機能し始めます。「このパターンはなぜこの記号を使ったのか」を説明できる人は、たとえマッチしない状況に直面しても、どこを直せばいいかが見えています。逆に、コピペで動かしているだけでは、1文字変わっただけで原因が分からなくなる。
セミナーでは、受講生に「この正規表現を日本語で説明してください」という問いを出すことがあります。説明できれば理解できている証拠です。「なんとなく動いた」は習得ではありません。自分で設計して自分の言葉で説明できてはじめて、次の現場でも使える実力になります。
「マッチしない」「動かない」エラーが出たときの対処手順
grepで正規表現を使っていると、「確かにこのパターンのはずなのに、何もヒットしない」という状況に遭遇します。セミナーでも受講生から「動かない」という相談を受けることが最も多い箇所がここです。こういうときに私が実践している対処手順を紹介します。
1. echoパイプでパターン自体が正しいか先に確認する
ファイルに対して直接 grep を実行しても「ヒットしない」場合、最初に確認すべきは「パターン自体が正しいか」です。ファイルの内容ではなく正規表現パターンの問題なのかを切り分けるために、echo でテスト文字列を渡して grep -E で確認する方法が最も手軽です。# 正規表現パターンのテスト(echoパイプで切り分ける) # echo "192.168.1.10" | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" 192.168.1.10 # マッチすれば正規表現パターンは正しい。次にファイルの中身を確認する # マッチしなければパターンの記号を見直す # systemctl status の出力から「Active:」行を確認する応用例 # systemctl status sshd | grep -E "^[[:space:]]*Active:" Active: active (running) since Fri 2026-09-04 07:00:01 JST; 1 day 0h ago
2. 「動かない」原因の9割を占める3つのミス
「マッチしない」と感じたとき、原因の9割は以下の3つのどれかです。特に本番サーバーのログを対象にする場合、シェル展開の挙動に注意してください。これを順番に確認するだけで、大半の問題は解決します。・-E オプションの付け忘れ: `+`, `|`, `{m,n}`, `()` などの拡張正規表現の記号は grep -E が必要です。-E なしで使うと記号がリテラル(文字そのもの)として扱われ、意図したマッチが起きません。たとえば `grep "ERROR|WARN"` と書いてもOR検索にはならず、「ERROR|WARN」という文字列そのものを検索します
・ダブルクォートでのシェル展開: 正規表現の中に `*`, `?`, `$` などシェルが解釈する特殊文字が含まれる場合、ダブルクォートではシェルが先に変数展開・グロブ展開をしてしまうことがあります。`grep -E '^$USER'` のように書いた場合、`$USER` がシェルにユーザー名として展開される可能性があります。正規表現を書くときはシングルクォートを使う習慣が安全です
・ドット(.)のエスケープ漏れ: `192.168.1.1` をそのまま正規表現として書くと、ドットが「任意の1文字」として機能してしまいます。ピリオドをリテラルとして扱うには `\.` とエスケープが必要です。`grep -E "192\.168\.1\.1"` と書けば、ピリオドの位置に他の文字が入ってもマッチしなくなります
この3点を確認する前に「正規表現が難しい」と感じてしまうのは、多くの場合、問題が正規表現の設計ではなくこれらのケアレスミスにあるからです。慣れるまでは echo パイプでパターンを確認する習慣をつけておくと、切り分けの時間が大幅に短縮されます。
まとめ
正規表現を「呪文」から「武器」に変えるための道筋をまとめます。| やりたいこと | 使う記号・パターン例 |
|---|---|
| 行頭にマッチする | grep -E '^パターン' ファイル |
| 行末にマッチする | grep -E 'パターン$' ファイル |
| 0~9の任意の数字1文字 | [0-9] |
| 1回以上の繰り返し(-E必須) | grep -E '[0-9]+' ファイル |
| AまたはBにマッチ(-E必須) | grep -E 'ERROR|WARN' ファイル |
| ピリオドをリテラルとして検索 | grep -E '192\.168\.' ファイル |
| IPアドレスの先頭オクテット抽出 | grep -oE '^[0-9]{1,3}\.[0-9]{1,3}' ファイル |
| 複数パターンをOR検索 | grep -E 'ERROR|CRITICAL|FATAL' ファイル |
| パターンのテスト確認 | echo "テスト文字列" | grep -E 'パターン' |
まずは `[0-9]` と `+` と `|` の3つだけ使いこなせるようになれば、日常のログ調査はぐっと楽になります。それから少しずつ守備範囲を広げていく。焦らず、現場の作業の中で育てていきましょう。
正規表現を活用したコマンド操作をさらに深めたい方は、Linuxのポート確認コマンド(ss・lsof)の使い方やApacheのタイムアウト設定の記事も合わせてご覧ください。ログを読む力と正規表現の組み合わせが、現場の問題解決速度を一段階引き上げてくれます。
正規表現を含む「現場で使えるLinuxの実力」を体系的に身につけませんか?
正規表現のような実務スキルは、個別のコマンドを断片的に覚えるだけでは定着しません。現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Linuxで環境変数PATHを壊して全コマンドが使えなくなった日の話|現役講師が語るexport設定ミスの恐怖と回復手順
- この記事の属するカテゴリ:Linux学習ガイドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます