テキスト処理 初級

正規表現の基礎(grep・sedで使う)

Linuxでよく使う基本正規表現・拡張正規表現の書き方を学び、grepやsedでテキストを検索・置換する方法を理解する

正規表現(regular expression / regex)は、文字列のパターンを表現するための記法です。 Linuxでは grepsedawk などのコマンドで広く使われており、ログ解析やファイル検索、テキスト置換に欠かせません。

この記事では 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つにまとめて指定することもできます。