正規表現(regular expression / regex)は、文字列のパターンを表現するための記法です。
Linuxでは grep や sed、awk などのコマンドで広く使われており、ログ解析やファイル検索、テキスト置換に欠かせません。
この記事では grep を中心に、正規表現の基本的な書き方を学びます。
正規表現とは
正規表現は「特定の文字パターンにマッチする文字列」を表すルールです。
たとえば ^[0-9]+$ という正規表現は「先頭から末尾まで数字のみで構成された文字列」にマッチします。
検証用に、まずは以下のサンプルファイルを作成しておきましょう。
cat << 'EOF' > sample.txt
2026-06-01 INFO server started
2026-06-02 ERROR connection refused
2026-06-03 WARN disk usage 80%
2026-06-04 ERROR timeout occurred
user@example.com logged in
EOF
基本正規表現(BRE)の主なメタ文字
| メタ文字 | 意味 |
|---|---|
. | 任意の1文字 |
* | 直前の文字の0回以上の繰り返し |
^ | 行頭 |
$ | 行末 |
[...] | 文字クラス(いずれか1文字) |
[^...] | 否定文字クラス |
行頭・行末を指定する
^ で行頭、$ で行末にマッチさせます。
# "ERROR" で始まる行
grep '^2026-06-02' sample.txt
# "%" で終わる行
grep '%$' sample.txt
文字クラスを使う
[...] を使うと、複数の文字のいずれか1つにマッチさせられます。
# ERROR または WARN を含む行
grep '[EW][RA][RN]' sample.txt
これはやや無理やりな例なので、実用上は次に説明する拡張正規表現の方が読みやすくなります。
拡張正規表現(ERE)
grep -E(または egrep)を使うと拡張正規表現が使えるようになり、+ ? | () などのメタ文字をバックスラッシュなしで使えます。
| メタ文字 | 意味 |
|---|---|
+ | 直前の文字の1回以上の繰り返し |
? | 直前の文字の0回または1回 |
| | OR(どちらか) |
() | グループ化 |
{n,m} | n回以上m回以下の繰り返し |
# ERROR または WARN を含む行(OR)
grep -E 'ERROR|WARN' sample.txt
# 数字が1文字以上連続する部分にマッチ
grep -E '[0-9]+%' sample.txt
メールアドレスらしき文字列を抜き出す
grep -E '[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+' sample.txt
sedで正規表現を使った置換
sed は正規表現にマッチした部分を置換するのに便利です。基本構文は s/パターン/置換後/ です。
# ERROR を [重大] に置換する
sed 's/ERROR/[重大]/' sample.txt
# 拡張正規表現を使う場合は -E オプションを付ける
sed -E 's/(ERROR|WARN)/[\1]/' sample.txt
\1 は1番目の () でキャプチャした部分(後方参照)を表します。
grepでよく使うオプション
| オプション | 意味 |
|---|---|
-i | 大文字小文字を区別しない |
-v | マッチしない行を表示(否定) |
-c | マッチした行数を数える |
-n | 行番号を表示する |
-r | ディレクトリを再帰的に検索する |
# ERROR行以外を表示
grep -v 'ERROR' sample.txt
# ERROR行が何件あるか数える
grep -c 'ERROR' sample.txt
# 行番号付きで表示
grep -n 'ERROR' sample.txt
練習問題
理解を確認するために、以下の問題に挑戦してみましょう。sample.txt を使う前提です。
問題 1
sample.txt の中から WARN または ERROR を含む行を、拡張正規表現を使って抽出するコマンドを書いてください。
問題 2
sample.txt の中から、行頭が 2026-06-0 で始まり、かつ末尾が % で終わる行を抽出するコマンドを書いてください(1つの grep -E コマンドで)。
問題 3
sed を使って、sample.txt 内のすべての日付(YYYY-MM-DD 形式)を [DATE] に置換するコマンドを書いてください。拡張正規表現(-E)を使ってかまいません。
問題 4
sample.txt から ERROR を含まない行のうち、行番号付きで表示するコマンドを書いてください。
解答
問題 1
grep -E 'WARN|ERROR' sample.txt
問題 2
grep -E '^2026-06-0.*%$' sample.txt
問題 3
sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2}/[DATE]/' sample.txt
問題 4
grep -vn 'ERROR' sample.txt
-v と -n はこのように1つにまとめて指定することもできます。