正規表現はインフラエンジニアの「必殺技」

インフラエンジニアとして現場に出てから、正規表現の重要性を強く実感しました。ログが何万行もあるとき、特定のエラーパターンを探したい。その瞬間に正規表現が使えるかどうかで、作業時間が10分と2秒に分かれます。大げさではなく、実際にそれだけ差がつく技術です。

難しく見えますが、基本パターンを10個覚えるだけで現場のほとんどの場面に対応できます。今回はインフラエンジニアが実際によく使うパターンに絞って解説します。

まず覚えるべき基本メタ文字

正規表現は「メタ文字」と呼ばれる特殊記号の組み合わせで作ります。

  • .(ドット):任意の1文字にマッチ
  • *:直前の文字の0回以上の繰り返し
  • +:直前の文字の1回以上の繰り返し
  • ?:直前の文字の0回または1回
  • ^:行の先頭
  • $:行の末尾
  • [ ]:文字クラス(角括弧内のいずれか1文字)
  • |:OR(どちらか)
  • ( ):グループ化
  • d:数字1文字([0-9]と同じ)

grepコマンドで正規表現を使う

Linuxのgrepコマンドは正規表現の練習に最適です。実際の現場でもっとも使うコマンドのひとつです。

基本的な使い方

  • grep ‘ERROR’ /var/log/syslog (ERRORを含む行を抽出)
  • grep -E ‘[0-9]{1,3}.[0-9]{1,3}’ access.log (IPアドレスパターンを抽出)
  • grep -v ‘INFO’ app.log (INFOを含まない行を抽出)
  • grep -c ‘WARN’ /var/log/app.log (WARNが含まれる行数をカウント)

-Eオプションで拡張正規表現(ERE)が使えます。{1,3}のような繰り返し数指定ができるので積極的に使いましょう。

現場でよく使う正規表現パターン集

IPアドレスの抽出

[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}

アクセスログから接続元IPを一覧化するときに使います。

タイムスタンプの抽出

[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}

特定の時間帯のログを絞り込む際に有効です。

HTTPステータスコードの抽出

“HTTP/[0-9].[0-9]” [4-5][0-9]{2}

Nginxのアクセスログから4xx・5xxエラーを抽出します。

空行の削除

grep -v ‘^$’ ファイル名

設定ファイルの整理やログの見通しをよくするときに使います。

sedとawkと組み合わせる

正規表現はgrepだけでなく、sedやawkと組み合わせることでさらに強力になります。

  • sed -E ‘s/ERROR/【ERROR】/g’ app.log (ERRORを強調表示に置換)
  • awk ‘/ERROR/{print $0}’ app.log (grepと同様の絞り込みだが列操作も可能)

実際の現場では「ログから特定フィールドだけ抜き出して集計」という処理をシェルスクリプトで書くことがよくあります。grep→sed→awkのパイプラインを組めるようになると、障害調査の速度が格段に上がります。

Pythonでの正規表現活用

Pythonのreモジュールを使えば、より複雑なログ解析が可能です。

  • import re でreモジュールをインポート
  • re.findall(pattern, text) でマッチする文字列を全件取得
  • re.search(pattern, text) で最初のマッチを取得

私も運用自動化スクリプトでPythonの正規表現を日常的に使っています。

まとめ:まずgrepで手を動かして覚える

正規表現は読むより書いて覚えるものです。まずはgrepコマンドとともに、実際のログファイルに対して試してみてください。10パターンの基本メタ文字を使いこなせるだけで、現場での作業効率は大きく変わります。

現場で頻出の正規表現パターン10選

インフラエンジニアが実際によく使うパターンを厳選しました。これだけ覚えておけば現場の大半に対応できます。

# IPアドレスのパターン(簡易版)
grep -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/syslog

# エラーログの抽出(ERROR・WARN・FATAL)
grep -E 'ERROR|WARN|FATAL' /var/log/app.log

# 特定の日付のログ抽出(2026-04-12形式)
grep '^2026-04-12' /var/log/app.log

# HTTPステータス 4xx・5xxの抽出
grep -E '" [45][0-9]{2} ' /var/log/nginx/access.log

# 空行を除外する
grep -v '^$' /etc/nginx/nginx.conf

# 特定のプロセスIDを含む行
grep 'PIDs*[0-9]+' /var/log/syslog

# タイムスタンプ形式の抽出(HH:MM:SS)
grep -E '[0-2][0-9]:[0-5][0-9]:[0-5][0-9]' /var/log/syslog

# MACアドレスのパターン
grep -E '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}' /var/log/dhcpd.log

# メールアドレスのパターン(簡易)
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}' logfile.txt

# 行末の空白を含む行を検索
grep ' $' /etc/hosts

grepの便利なオプション

正規表現と組み合わせることで、ログ解析の効率が大きく上がるgrepオプションを紹介します。

# 前後の行も表示(コンテキスト)
grep -B 3 -A 3 'ERROR' /var/log/app.log    # エラー行の前3行・後3行

# 大文字小文字を区別しない
grep -i 'error' /var/log/app.log

# マッチしない行を表示
grep -v 'DEBUG' /var/log/app.log

# 行番号を表示
grep -n 'FATAL' /var/log/app.log

# 再帰的に検索(ディレクトリ内の全ファイル)
grep -r 'timeout' /etc/nginx/

# マッチした行数だけ表示
grep -c 'ERROR' /var/log/app.log

sedコマンドと正規表現の組み合わせ

grepと並んでよく使うのがsedです。ログの整形・文字列置換に活用できます。

# IPアドレスをマスクする(ログの匿名化)
sed -E 's/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/xxx.xxx.xxx.xxx/g' access.log

# タイムスタンプを削除して本文のみ抽出
sed -E 's/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} //' app.log

# 空行を削除
sed '/^$/d' config.txt

まとめ:正規表現をマスターするための3ステップ

  • ステップ1:メタ文字10個(. * + ? ^ $ [] | () d)を暗記する
  • ステップ2:実際のアクセスログ・syslogでgrepを毎日使って感覚を掴む
  • ステップ3:sedとの組み合わせでログ整形まで自動化できるようにする

正規表現は「覚えるもの」ではなく「使いながら身につくもの」です。今日から実際のログファイルに対してgrepを叩くことで、自然と使いこなせるようになります。現場でのログ解析速度が段違いに変わりますので、ぜひ実践してみてください。

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営