正则
Linux 中的正则表达式(Regular Expression,Regex)不是某一个命令,而是一套文本匹配规则。它广泛应用于 grep、sed、awk、find、vim、Shell 等工具中。
一句话总结:Linux 正则就是“描述字符串模式”的语言。
一、Linux 正则有哪些?
Linux 常见有三种正则体系:
| 类型 | 全称 | 使用场景 | 特点 |
|---|---|---|---|
| BRE | Basic Regular Expression | grep、sed 默认 |
元字符较少,很多需要转义 |
| ERE | Extended Regular Expression | grep -E、egrep、awk |
功能更丰富,语法更简洁 |
| PCRE | Perl Compatible Regular Expressions | grep -P(GNU grep)、Perl、部分工具 |
功能最强,支持环视、懒惰匹配等 |
日常 Linux 运维中,BRE + ERE 就足够覆盖 95% 的场景。
二、最常用元字符
1. . —— 任意一个字符
例如:
cat
cot
cut
grep "c.t"
匹配:
cat
cot
cut
不能匹配:
ct
cart
2. * —— 前一个字符重复 0 次或多次
例如:
ab
abb
abbb
abbbb
grep "ab*"
全部匹配。
注意:
b*
表示:
bbbbbb
不是:
.*
很多初学者容易混淆。
3. .* —— 任意内容(最常见)
例如:
hello world
hello linux
hello chatgpt
grep "hello.*"
全部匹配。
4. ^ —— 行首
例如:
grep "^root"
匹配:
root
root123
不匹配:
myroot
5. $ —— 行尾
例如:
grep "log$"
匹配:
app.log
不匹配:
log.txt
6. ^...$ —— 整行匹配
例如:
abc
abcd
grep "^abc$"
只匹配:
abc
三、字符集合
[]
例如:
grep "[abc]"
匹配:
apple
banana
cat
因为包含:
a
b
c
范围
数字:
grep "[0-9]"
字母:
grep "[a-z]"
大写:
grep "[A-Z]"
组合:
grep "[A-Za-z0-9]"
排除
grep "[^0-9]"
不是数字。
注意:
这里:
[^ ]
和:
^
不是一个意思。
四、重复次数(ERE)
这些需要 grep -E 或 awk。
+
一个或多个:
grep -E "[0-9]+"
匹配:
1
22
333
?
0 或 1 次:
grep -E "colou?r"
匹配:
color
colour
{n}
固定次数:
grep -E "[0-9]{4}"
四位数字。
{n,}
至少:
grep -E "[0-9]{6,}"
6位以上。
{m,n}
范围:
grep -E "[0-9]{2,4}"
2~4位。
五、分组
例如:
grep -E "(jpg|png)"
匹配:
a.jpg
b.png
多个:
grep -E "(ERROR|WARN|FATAL)"
生产非常常见。
六、常见字符类
推荐使用 POSIX 字符类,可移植性更好。
| 字符类 | 含义 |
|---|---|
[[:digit:]] |
数字 |
[[:alpha:]] |
字母 |
[[:alnum:]] |
字母数字 |
[[:space:]] |
空白字符 |
[[:lower:]] |
小写 |
[[:upper:]] |
大写 |
[[:xdigit:]] |
十六进制字符 |
例如:
删除行尾空格:
sed 's/[[:space:]]*$//'
七、高频场景
场景一:删除空行
grep -v '^$'
或者:
sed '/^$/d'
场景二:删除注释
grep -v '^#'
或者:
sed '/^#/d'
场景三:删除空行+注释
grep -Ev '^#|^$'
或者:
sed '/^[[:space:]]*#/d;/^$/d'
更健壮:
grep -Ev '^[[:space:]]*#|^$'
可以处理前面带空格的注释。
场景四:IP 地址
简单:
grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
严格 IPv4:
^((25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})$
场景五:手机号(中国大陆)
grep -E "^1[3-9][0-9]{9}$"
场景六:邮箱
简单版:
grep -E "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"
场景七:日志 ERROR
grep -E "(ERROR|WARN|FATAL)"
场景八:查找图片
grep -E "\.(jpg|png|gif)$"
场景九:HTML 标签(简单匹配)
grep -E "<[^>]+>"
注意:正则不适合解析复杂 HTML/XML,这里只适用于简单文本匹配。
场景十:URL(简单匹配)
grep -E "^https?://"
八、grep、sed、awk 中正则的区别
grep
主要:
grep "abc"
过滤:
整行是否匹配
sed
例如:
sed 's/[0-9]/X/g'
替换:
数字。
awk
例如:
awk '/ERROR/'
或者:
awk '$1~/^Tom/'
按字段匹配:
$1
九、Shell 中的正则
例如:
if [[ $name =~ ^Tom ]]; then
echo ok
fi
使用:
=~
十、find 与正则
例如:
find . -regex ".*\.log"
注意:
find -regex 匹配的是完整路径,因此通常需要写成:
.*\.log
而不是仅:
\.log
不同实现(GNU/BSD)默认的正则语法也可能不同,可通过 -regextype 指定。
十一、grep、sed、awk 高频正则
grep
查 ERROR:
grep "^ERROR"
sed
替换数字:
sed 's/[0-9]/X/g'
awk
找年龄:
awk '$2~/^[0-9]+$/'
十二、常见转义
因为很多字符本身有特殊含义,需要转义。
例如:
匹配:
.
不是:
任意字符:
grep "\."
匹配:
*
grep "\*"
匹配:
$
grep "\$"
匹配:
[
grep "\["
十三、Linux 正则速查表
| 正则 | 含义 | 示例 |
|---|---|---|
. |
任意一个字符 | a.c |
* |
前一个字符重复 0 次或多次 | ab* |
.* |
任意长度任意字符 | hello.* |
^ |
行首 | ^root |
$ |
行尾 | log$ |
^...$ |
整行匹配 | ^abc$ |
[] |
字符集合 | [abc] |
[^] |
排除集合 | [^0-9] |
[0-9] |
数字 | [0-9]+ |
[a-z] |
小写字母 | [a-z]+ |
[A-Z] |
大写字母 | [A-Z]+ |
+ |
一个或多个(ERE) | [0-9]+ |
? |
零个或一个(ERE) | colou?r |
{n} |
恰好 n 次(ERE) | [0-9]{4} |
{m,n} |
m 到 n 次(ERE) | [0-9]{2,4} |
() |
分组(ERE) | (jpg | png) |
十四、生产环境最常见的 10 个正则
| 场景 | 正则 |
|---|---|
| 删除空行 | ^$ |
| 删除注释 | ^[[:space:]]*# |
| 查 ERROR/WARN | (ERROR|WARN) |
| IPv4(简单) | [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ |
| 手机号(中国大陆) | ^1[3-9][0-9]{9}$ |
| 邮箱(简单) | ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ |
| 图片后缀 | .(jpg|png|gif)$ |
| URL(简单) | ^https?:// |
| 数字 | ^[0-9]+$ |
| 字母数字下划线 | ^[A-Za-z0-9_]+$ |
十五、学习建议
对于 Linux 运维和开发,建议按下面的顺序掌握正则:
-
基础元字符:
.、*、^、$ -
字符集合:
[]、[^]、[0-9]、[[:space:]] -
ERE 扩展:
+、?、{m,n}、()、| -
与工具结合:
grep:过滤匹配行sed:替换、删除、插入awk:按字段匹配和统计find:文件路径匹配
真正高频使用的正则其实并不复杂,掌握 ^、$、.、*、[]、+、()、| 这几类,再结合 grep、sed、awk 的实际应用,就足以应对绝大多数 Linux 日常开发和运维场景。

浙公网安备 33010602011771号