正則表達式是 Linux 文字處理的核心技能。本文針對 Shell 腳本常見場景 (grep 過濾、sed 替換、awk 擷取),整理 40+ 實用模式:行首行尾錨定、字元類別、量詞、分組捕獲、轉義特殊字元、IP/日期/郵件格式驗證,並對照 BRE (基本) 與 ERE (延伸) 差異,附贈 grep -E、sed -r、awk 實戰指令範例,可直接複製套用。
| 元字元 | 意義 | BRE/ERE | 範例匹配 |
|---|---|---|---|
^ | 行首 | 通用 | ^root 以 root 開頭的行 |
$ | 行尾 | 通用 | bash$ 以 bash 結尾的行 |
. | 任意單一字元 | 通用 | a.c 匹配 abc, axc |
[abc] | 字元類別 (任一) | 通用 | [Ss]ignal Signal 或 signal |
[^abc] | 排除字元類別 | 通用 | [^0-9] 非數字 |
[a-z] | 範圍 | 通用 | [a-zA-Z] 英文字母 |
* | 前一元素 0 次或多次 | 通用 | ab*c ac, abc, abbc... |
\+ | 前一元素 1 次或多次 | ERE / BRE 需轉義 | ab\+c abc, abbc... |
\? | 前一元素 0 次或 1 次 | ERE / BRE 需轉義 | ab\?c ac, abc |
\{m,n\} | 前一元素 m~n 次 | BRE | [0-9]\{3\} 三位數字 |
{m,n} | 同上 | ERE | [0-9]{3} 三位數字 |
\(\) | 分組捕獲 | BRE | \(abc\)\1 abcabc |
() | 分組捕獲 | ERE | (abc)\1 abcabc |
\| | 或 | BRE | cat\|dog cat 或 dog |
| | 或 | ERE | cat|dog |
^$ # 空行
^[[:space:]]*$ # 空白行 (含空格/Tab)
^# # 註解行
^[^#] # 非註解行
# 簡易版 (不驗證 0-255)
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
# 嚴格版 (0-255)
((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])
# YYYY-MM-DD
[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])
# DD/MM/YYYY
(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/[0-9]{4}
[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}
https?://[[:alnum:]._-]+(:[0-9]+)?(/.*)?
([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}
:80\s+.*ESTABLISHED
:443\s+.*ESTABLISHED
# 搜尋包含 IP 的行
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log
# 搜尋非註解且非空行
grep -E -v '^#|^$' config.conf
# 顯示行號與匹配色彩
grep -En --color 'error|fail' /var/log/messages
# 將 YYYY-MM-DD 轉為 DD/MM/YYYY
sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' dates.txt
# 刪除行首空白
sed -r 's/^[[:space:]]+//' file.txt
# 在匹配行尾插入文字
sed -r '/ERROR/ s/$/ [ALERT]/' app.log
# 印出第 1 欄為 IP 格式的行
awk '$1 ~ /^[0-9]{1,3}(\.[0-9]{1,3}){3}$/' access.log
# 提取郵件域名
awk -F@ '/@/ {print $2}' maillist.txt | sort -u
grep 預設 BRE,加 -E 或用 egrep 切換 EREsed 預設 BRE,加 -r (GNU) 或 -E (BSD/macOS) 切換 EREawk 內建 ERE,無需切換+ ? {} () | 需轉義 \+ \? \{\} \(\) \|\+ \? 等
# 顯示正則匹配過程 (GNU grep)
grep -E --debug-pattern 'pattern' file
# 線上測試工具
# https://regex101.com/ (支援 PCRE, Golang, JavaScript, Python)
# https://regexr.com/