前言

正则表达式就像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使用示例

举几个实际工作中常用的例子,一看就懂:

  1. 统计文件中包含“root”的行数:grep -c root /etc/passwd,结果会显示数字(比如2,表示有2行包含root)。
  2. 忽略大小写查找“the”:grep -i "the" web.sh,会匹配“the”“The”“THE”等所有大小写组合。
  3. 输出不包含“root”的行:grep -v root /etc/passwd,适合筛选排除无关内容。
  4. 提取IP地址:ifconfig | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1,直接从网卡信息中抠出IP(比如192.168.1.100)。
  5. 去除文件空行: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. 匹配至少1个o:egrep -n 'wo+d' test.txt,结果和BRE的grep -n 'wo\+d' test.txt一样,匹配“wod”“wood”等。
  2. 匹配0个或1个s:egrep -n 'bes?t' test.txt,会匹配“bet”(0个s)和“best”(1个s)。
  3. 匹配多个关键词:egrep -n 'of|is|on' test.txt,同时查找包含“of”“is”或“on”的行。
  4. 分组匹配:egrep -n 't(a|e)st' test.txt,匹配“tast”(t+a+st)和“test”(t+e+st),适合处理前缀后缀相同的单词。
  5. 重复分组匹配: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/EREw..d → 匹配“wood”“word”“wabd”
[]字符集合,匹配任意1个字符BRE/EREsh[io]rt → 匹配“shirt”“short”
[^]否定集合,匹配不在集合中的1个字符BRE/ERE[^w]oo → 匹配“foo”“too”(不匹配“woo”)
重复匹配*匹配前字符0次或多次BRE/EREwoo*d → 匹配“wd”“wod”“wood”
+/\+匹配前字符至少1次(BRE需转义\+)BRE/EREBRE:wo\+d;ERE:wo+d → 匹配“wod”“wood”
?/\?匹配前字符0次或1次(BRE需转义\?)ERE(BRE需转义)bes?t → 匹配“bet”“best”
{n}/\{n\}匹配前字符恰好n次(BRE需转义\{n\})BRE/EREBRE:o\{2\};ERE:o{2} → 匹配“oo”
{n,}/\{n,\}匹配前字符至少n次(BRE需转义)BRE/EREBRE:o\{2,\};ERE:o{2,} → 匹配“oo”“ooo”
{n,m}/\{n,m\}匹配前字符n~m次(BRE需转义)BRE/EREBRE:wo\{2,5\}d → 匹配“wood”“woood”
定位匹配^匹配行首([]内表“否定”)BRE/ERE^the → 匹配以“the”开头的行;[^a-z] → 非小写字母
$匹配行尾BRE/ERE\.$ → 匹配以“.”结尾的行;^$ → 匹配空行
逻辑/分组|/``逻辑“或”(BRE需转义|)ERE(BRE需转义)
()/\(\)分组(BRE需转义\(\))ERE(BRE需转义)`t(a
()+.匹配重复分组(至少1次)EREA(xyz)+C → 匹配“AxyzC”“AxyzxyzC”
转义/特殊\转义元字符(取消特殊含义)BRE/EREa\.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提取与空行处理`ifconfiggrep -o ‘[0-9]+.[0-9]+.[0-9]+.[0-9]+’head -1`
grep -v '^$' test.txt > new.txt去除test.txt空行,保存到new.txtgrep(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(ae)st’ test.txt`分组匹配“tast”“test”
高亮与精准输出grep --color=auto 'root' /etc/passwd高亮显示“root”匹配内容grep(BRE)
grep -o 'oo' test.txt只输出匹配的“oo”(不显示整行)grep(BRE)

三、关键备注

  1. BRE与ERE区别:
    • BRE(基础):grep默认支持,+/?/()/{}需加\转义(如wo\+d);
    • ERE(扩展):用egrep或grep -E,元字符无需转义(如wo+d)。
  2. 工具替换:egrep ≡ grep -E,awk也支持ERE,可按需选择。
  3. 常用选项速记:
    • -n(行号)、-i(忽略大小写)、-v(反向)、-c(计数)、-o(仅匹配内容)。

总结

正则表达式的核心是“用规则描述字符串”,看似复杂,其实只要记住常用元字符的用法,再结合grep、egrep多练几个例子,很快就能上手。日常工作中,它最常用在日志分析、配置文件解析、文本批量处理等场景,学会它能大幅节省重复劳动的时间。

更多推荐