Linux正则表达式
前言
正则表达式就像Linux系统里的“文本搜索神器”,不管是筛选日志里的错误信息、提取配置文件中的关键参数,还是批量替换文本内容,都能帮你高效完成。它不用复杂编程,只要掌握一套简单的“字符规则”,就能让grep、egrep这些工具精准识别目标文本。这篇文章会用最通俗的语言,搭配大量实战例子,带你从基础到进阶,彻底搞懂正则表达式的用法。
一、正则表达式概述
1.1 什么是正则表达式
正则表达式(简称“正则”)是一套描述字符串模式的“规则代码”,由普通字符(比如字母a、数字5、标点.)和元字符(具有特殊含义的字符,比如^、$、*)组成。
简单说,它就像“文本过滤器”:你告诉它要找的字符串长什么样(比如“以数字开头、以字母结尾”),它就能在一堆文本里精准找出符合要求的内容。
1.2 正则表达式的分类
Linux里的正则主要分两类,核心区别是支持的元字符不同,适用的工具也不一样:
- 基础正则表达式(BRE):语法简单,功能基础,部分元字符(比如{}、+)需要加反斜杠\转义才能用。常用工具:grep、sed。
- 扩展正则表达式(ERE):功能更全,语法更简洁,元字符不用转义,写起来更省事。常用工具:egrep(等同于grep -E)、awk。
二、grep命令与正则表达式
grep是Linux里最常用的“文本搜索工具”,专门用来搭配正则表达式查找内容,学会它就能解决80%的文本查找需求。
2.1 grep命令基本用法
基本语法:grep [选项] 查找规则 目标文件
常用选项(记熟这几个就够日常用):
- -E:启用扩展正则表达式(相当于egrep)
- -c:统计符合条件的行数(不是字符数)
- -i:忽略大小写(比如找“the”,会匹配“The”“THE”)
- -o:只输出匹配到的内容(不显示整行)
- -v:反向匹配(输出不符合规则的行)
- -n:显示匹配行的行号(方便定位)
- –color=auto:高亮显示匹配内容(看得更清楚)
2.2 grep使用示例
举几个实际工作中常用的例子,一看就懂:
- 统计文件中包含“root”的行数:
grep -c root /etc/passwd,结果会显示数字(比如2,表示有2行包含root)。 - 忽略大小写查找“the”:
grep -i "the" web.sh,会匹配“the”“The”“THE”等所有大小写组合。 - 输出不包含“root”的行:
grep -v root /etc/passwd,适合筛选排除无关内容。 - 提取IP地址:
ifconfig | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1,直接从网卡信息中抠出IP(比如192.168.1.100)。 - 去除文件空行:
grep -v '^$' test.txt > new.txt,把test.txt里的空行删掉,保存到new.txt。
三、基础正则表达式(BRE)元字符
元字符是正则的“核心规则符号”,BRE的元字符部分需要转义,下面逐个讲清楚用法,每个都配例子。
3.1 常见的BRE元字符
- ****:转义符,让后面的元字符变成普通字符。比如要匹配“a.b”(包含小数点),就得写
a\.b,否则.会匹配任意字符。 - [list]:匹配列表中的任意一个字符。例子:
grep -n 'sh[io]rt' test.txt,会匹配“shirt”(sh+i+rt)和“short”(sh+o+rt)。 - [^list]:匹配不在列表中的任意一个字符。例子:
grep -n '[^w]oo' test.txt,会匹配“foo”“too”等,不匹配“woo”。 - *:匹配前面的字符0次或多次。例子:
grep -n 'woo*d' test.txt,会匹配“wd”(0个o)、“wod”(1个o)、“wood”(2个o)、“woood”(3个o)。 - +:匹配前面的字符至少1次(需要转义)。例子:
grep -n 'wo\+d' test.txt,会匹配“wod”“wood”,不匹配“wd”。 - {n}:匹配前面的字符恰好n次(需要转义)。例子:
grep -n 'o\{2\}' test.txt,只匹配包含“oo”的内容(比如“wood”“foo”)。 - {n,}:匹配前面的字符至少n次(需要转义)。例子:
grep -n 'o\{2,\}' test.txt,会匹配“oo”“ooo”“oooo”等。 - {n,m}:匹配前面的字符n到m次(需要转义)。例子:
grep -n 'wo\{2,5\}d' test.txt,会匹配“wood”(2个o)、“woood”(3个o)、“woooood”(5个o),不匹配“wod”(1个o)或“woooooood”(6个o)。
3.2 定位符与非打印字符
- ^:匹配行首(放在字符前面)。例子:
grep -n '^the' test.txt,只匹配以“the”开头的行(比如“the first line”)。 - **KaTeX parse error: Expected group as argument to '\.' at end of input: …例子:`grep -n '\.’ test.txt`,匹配以小数点结尾的行(.是元字符,需要转义)。
- **^KaTeX parse error: Expected group after '^' at position 22: …行。例子:`grep -n '^̲’ test.txt`,快速找出文件中的所有空行。
- \t:匹配制表符(Tab键)。例子:
grep -n '^\t' test.txt,匹配以Tab开头的行。 - \n:匹配换行符,常用于多行文本处理。
四、扩展正则表达式(ERE)元字符
ERE比BRE更灵活,不用转义{}、+、?这些元字符,还多了“或”“分组”功能,写规则更简洁。
4.1 常见的ERE元字符
- +:匹配前面的字符至少1次(无需转义),和BRE的+功能一样。
- ?:匹配前面的字符0次或1次(无需转义)。
- |:表示“或”,匹配多个规则中的任意一个(无需转义)。
- ():分组,把多个字符当成一个整体处理(无需转义)。
- **()+**:匹配多个重复的分组(无需转义)。
4.2 ERE使用示例
- 匹配至少1个o:
egrep -n 'wo+d' test.txt,结果和BRE的grep -n 'wo\+d' test.txt一样,匹配“wod”“wood”等。 - 匹配0个或1个s:
egrep -n 'bes?t' test.txt,会匹配“bet”(0个s)和“best”(1个s)。 - 匹配多个关键词:
egrep -n 'of|is|on' test.txt,同时查找包含“of”“is”或“on”的行。 - 分组匹配:
egrep -n 't(a|e)st' test.txt,匹配“tast”(t+a+st)和“test”(t+e+st),适合处理前缀后缀相同的单词。 - 重复分组匹配:
egrep -n 'A(xyz)+C' test.txt,匹配以“A”开头、“C”结尾,中间有1个或多个“xyz”的内容(比如“AxyzC”“AxyzxyzC”)。
五、正则表达式实战案例
光看理论不够,结合实际场景练一练,才能真正掌握。以下案例都基于test.txt文件(可自行创建测试)。
5.1 查找特定字符
- 需求:找出包含“the”的行,显示行号。命令:
grep -n 'the' test.txt。 - 需求:找出不包含“the”的行。命令:
grep -vn 'the' test.txt(-v反向匹配)。 - 需求:忽略大小写查找“the”。命令:
grep -in 'the' test.txt(-i忽略大小写)。
5.2 利用中括号"[]”查找集合字符
- 需求:同时查找“shirt”和“short”。命令:
grep -n 'sh[io]rt' test.txt。 - 需求:查找包含数字的行。命令:
grep -n '[0-9]' test.txt,也可以写grep -n '[0-9][0-9]*' test.txt(匹配1个或多个数字)。 - 需求:查找“oo”前面不是小写字母的内容。命令:
grep -n '[^a-z]oo' test.txt,会匹配“0oo”“!oo”等。
5.3 定位行首与行尾
- 需求:查找以小写字母开头的行。命令:
grep -n '^[a-z]' test.txt。 - 需求:查找以大写字母开头的行。命令:
grep -n '^[A-Z]' test.txt。 - 需求:查找不以字母开头的行。命令:
grep -n '^[^a-zA-Z]' test.txt(^在[]内表示取反)。 - 需求:查找以“abc”结尾的行。命令:
grep -n 'abc$' test.txt。
5.4 使用通配与重复字符
- 需求:查找以“w”开头、“d”结尾,中间有2个任意字符的内容。命令:
grep -n 'w..d' test.txt,会匹配“wood”(w+o+o+d)、“word”(w+o+r+d)、“wabd”(w+a+b+d)等。 - 需求:查找以“w”开头、“d”结尾,中间任意字符的内容。命令:
grep -n 'w.*d' test.txt,会匹配“wd”“wod”“wabcd”“w123d”等所有符合开头结尾的内容。 - 需求:查找至少包含2个“o”的内容。命令:
grep -n 'ooo*' test.txt(第一个o必选,后面的o可选,相当于至少2个o)。
5.5 查找连续字符范围“{}”
- 需求:查找恰好包含2个“o”的内容。命令:
grep -n 'o\{2\}' test.txt(BRE)或egrep -n 'o{2}' test.txt(ERE)。 - 需求:查找包含2到5个“o”的内容。命令:
grep -n 'o\{2,5\}' test.txt(BRE)或egrep -n 'o{2,5}' test.txt(ERE)。 - 需求:查找包含2个及以上“o”的内容。命令:
grep -n 'o\{2,\}' test.txt(BRE)或egrep -n 'o{2,}' test.txt(ERE)。
六、正则表达式元字符总结
| 元字符 | 说明 | 适用类型 |
|---|---|---|
| ^ | 匹配行首([]外);取反([]内) | BRE/ERE |
| $ | 匹配行尾 | BRE/ERE |
| . | 匹配除\r\n外的任意单个字符 | BRE/ERE |
| \ | 转义字符 | BRE/ERE |
| * | 匹配前一个字符0次或多次 | BRE/ERE |
| + | 匹配前一个字符至少1次(BRE需转义+) | BRE/ERE |
| ? | 匹配前一个字符0次或1次(BRE需转义?) | ERE |
| [] | 字符集合,匹配任意一个字符 | BRE/ERE |
| [^] | 否定字符集合,匹配不在其中的字符 | BRE/ERE |
| [n1-n2] | 字符范围(如[a-z]、[0-9]) | BRE/ERE |
| {} | 次数限定(BRE需转义{}) | BRE/ERE |
| | | 逻辑“或”(BRE需转义|) | ERE |
| () | 分组(BRE需转义()) | ERE |
| ()+ | 匹配重复分组 | ERE |
| \t/\n/\r | 制表符/换行符/回车符 | BRE/ERE |
正则表达式常用命令速查表
一、核心元字符总结表
| 类别 | 元字符 | 说明 | 适用类型 | 示例(匹配结果) |
|---|---|---|---|---|
| 基础匹配 | . | 匹配除\r\n外的任意单个字符 | BRE/ERE | w..d → 匹配“wood”“word”“wabd” |
[] | 字符集合,匹配任意1个字符 | BRE/ERE | sh[io]rt → 匹配“shirt”“short” | |
[^] | 否定集合,匹配不在集合中的1个字符 | BRE/ERE | [^w]oo → 匹配“foo”“too”(不匹配“woo”) | |
| 重复匹配 | * | 匹配前字符0次或多次 | BRE/ERE | woo*d → 匹配“wd”“wod”“wood” |
+/\+ | 匹配前字符至少1次(BRE需转义\+) | BRE/ERE | BRE:wo\+d;ERE:wo+d → 匹配“wod”“wood” | |
?/\? | 匹配前字符0次或1次(BRE需转义\?) | ERE(BRE需转义) | bes?t → 匹配“bet”“best” | |
{n}/\{n\} | 匹配前字符恰好n次(BRE需转义\{n\}) | BRE/ERE | BRE:o\{2\};ERE:o{2} → 匹配“oo” | |
{n,}/\{n,\} | 匹配前字符至少n次(BRE需转义) | BRE/ERE | BRE:o\{2,\};ERE:o{2,} → 匹配“oo”“ooo” | |
{n,m}/\{n,m\} | 匹配前字符n~m次(BRE需转义) | BRE/ERE | BRE:wo\{2,5\}d → 匹配“wood”“woood” | |
| 定位匹配 | ^ | 匹配行首([]内表“否定”) | BRE/ERE | ^the → 匹配以“the”开头的行;[^a-z] → 非小写字母 |
$ | 匹配行尾 | BRE/ERE | \.$ → 匹配以“.”结尾的行;^$ → 匹配空行 | |
| 逻辑/分组 | |/` | ` | 逻辑“或”(BRE需转义|) | ERE(BRE需转义) |
()/\(\) | 分组(BRE需转义\(\)) | ERE(BRE需转义) | `t(a | |
()+. | 匹配重复分组(至少1次) | ERE | A(xyz)+C → 匹配“AxyzC”“AxyzxyzC” | |
| 转义/特殊 | \ | 转义元字符(取消特殊含义) | BRE/ERE | a\.b → 匹配“a.b”(不匹配“ajb”) |
\t/\n/\r | 匹配制表符/换行符/回车符 | BRE/ERE | ^\t → 匹配以Tab开头的行 |
二、常用命令实战案例表
| 功能场景 | 命令 | 说明 | 工具/正则类型 |
|---|---|---|---|
| 基础查找 | grep -n 'the' test.txt | 查找含“the”的行,显示行号 | grep(BRE) |
grep -in 'the' test.txt | 忽略大小写查找“the”,显示行号 | grep(BRE) | |
| 统计与反向匹配 | grep -c root /etc/passwd | 统计/etc/passwd中含“root”的行数 | grep(BRE) |
grep -vn 'root' /etc/passwd | 输出不含“root”的行,显示行号 | grep(BRE) | |
| IP提取与空行处理 | `ifconfig | grep -o ‘[0-9]+.[0-9]+.[0-9]+.[0-9]+’ | head -1` |
grep -v '^$' test.txt > new.txt | 去除test.txt空行,保存到new.txt | grep(BRE) | |
| BRE特殊匹配 | grep -n 'wo\{2,5\}d' test.txt | 匹配“w开头、d结尾,中间2~5个o” | grep(BRE) |
grep -n '[0-9][0-9]*' test.txt | 查找含数字的行 | grep(BRE) | |
| ERE扩展匹配 | egrep -n 'wo+d' test.txt(同grep -E ...) | 匹配“wod”“wood”等(至少1个o) | egrep(ERE) |
egrep -n 'bes?t' test.txt | 匹配“bet”(0个s)或“best”(1个s) | egrep(ERE) | |
| `egrep -n 't(a | e)st’ test.txt` | 分组匹配“tast”“test” | |
| 高亮与精准输出 | grep --color=auto 'root' /etc/passwd | 高亮显示“root”匹配内容 | grep(BRE) |
grep -o 'oo' test.txt | 只输出匹配的“oo”(不显示整行) | grep(BRE) |
三、关键备注
- BRE与ERE区别:
- BRE(基础):
grep默认支持,+/?/()/{}需加\转义(如wo\+d); - ERE(扩展):用
egrep或grep -E,元字符无需转义(如wo+d)。
- BRE(基础):
- 工具替换:
egrep≡grep -E,awk也支持ERE,可按需选择。 - 常用选项速记:
-n(行号)、-i(忽略大小写)、-v(反向)、-c(计数)、-o(仅匹配内容)。
总结
正则表达式的核心是“用规则描述字符串”,看似复杂,其实只要记住常用元字符的用法,再结合grep、egrep多练几个例子,很快就能上手。日常工作中,它最常用在日志分析、配置文件解析、文本批量处理等场景,学会它能大幅节省重复劳动的时间。
更多推荐


所有评论(0)