インフラエンジニアのための正規表現入門|ログ解析・grepコマンドで使える実践パターン
正規表現はインフラエンジニアの「必殺技」
インフラエンジニアとして現場に出てから、正規表現の重要性を強く実感しました。ログが何万行もあるとき、特定のエラーパターンを探したい。その瞬間に正規表現が使えるかどうかで、作業時間が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を叩くことで、自然と使いこなせるようになります。現場でのログ解析速度が段違いに変わりますので、ぜひ実践してみてください。



