正则

Linux 中的正则表达式(Regular Expression,Regex)不是某一个命令,而是一套文本匹配规则。它广泛应用于 grepsedawkfindvim、Shell 等工具中。

一句话总结:Linux 正则就是“描述字符串模式”的语言。


一、Linux 正则有哪些?

Linux 常见有三种正则体系:

类型 全称 使用场景 特点
BRE Basic Regular Expression grepsed 默认 元字符较少,很多需要转义
ERE Extended Regular Expression grep -Eegrepawk 功能更丰富,语法更简洁
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 -Eawk


+

一个或多个:

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 运维和开发,建议按下面的顺序掌握正则:

  1. 基础元字符.*^$

  2. 字符集合[][^][0-9][[:space:]]

  3. ERE 扩展+?{m,n}()|

  4. 与工具结合

    • grep:过滤匹配行
    • sed:替换、删除、插入
    • awk:按字段匹配和统计
    • find:文件路径匹配

真正高频使用的正则其实并不复杂,掌握 ^$.*[]+()| 这几类,再结合 grepsedawk 的实际应用,就足以应对绝大多数 Linux 日常开发和运维场景。

posted @ 2026-07-10 16:45  ZovoeY  阅读(15)  评论(0)    收藏  举报