前言:很多刚学 Linux 的朋友,对正则表达式(regex)很陌生,觉得符号杂乱、记不住。其实 Linux 正则是文本检索、过滤、替换的核心工具,不管是排查日志、筛选配置、批量修改文件都离不开它。
一、什么是 Linux 正则表达式?
正则表达式是一套文本匹配规则模板,由普通字符和特殊元字符组成。
核心作用:按照自定义规则,从海量文本中精准筛选、匹配、替换符合条件的内容。
对比理解:
- 普通搜索:匹配完全一致的内容(比如搜索 abc,只能找到 abc)
- 正则搜索:匹配符合规则的内容(比如匹配所有字母、所有数字、所有手机号格式内容)
Linux 常用正则工具:grep(筛选)、sed(替换/删除)、awk(文本处理)
二、Linux 正则的两大分类(新手最容易踩的坑)
Linux 正则分为基础正则(BRE) 和扩展正则(ERE) ,两者最大的区别:**部分特殊符号是否需要转义 **。
1. 基础正则 BRE(默认支持)
适用命令:普通 grep、sed
规则: + ? | () {} 全部需要加反斜杠转义 ,否则不生效
示例:匹配1-9次数字,BRE写法:[0-9]{1,9}
2. 扩展正则 ERE(需要手动开启)
适用命令:grep -E、sed -r、awk(默认就是扩展正则)
规则: + ? | () {} 不需要转义,直接使用即可
示例:匹配1-9次数字,ERE写法:[0-9]{1,9}
新手核心建议:日常使用直接用 grep -E、sed -r,开启扩展正则,少写转义符,减少报错!
三、正则核心两类字符(必记)
正则所有语法,只由两种字符构成,新手不用死记硬背,分类理解即可。
1. 普通字符
包括大小写字母、数字、无特殊意义的符号(_、- 等)。
规则:自身匹配自身,没有特殊功能,和普通搜索一致。
例:正则 test,只匹配文本中的 test 字符串。
2. 元字符(正则灵魂,重点记忆)
拥有特殊匹配功能的符号,不代表符号本身,用来定义匹配规则。下面是 Linux 高频必用元字符,全覆盖日常场景。
四、高频元字符详解 + 实操案例
所有案例统一使用 grep -E 扩展正则,写法简单、新手易上手。
1. 单字符匹配符号
单字符匹配是正则最基础的匹配规则,核心三个符号即可覆盖基础场景。英文句号 . 可以匹配任意单个非换行字符,比如规则 a.b 能匹配 a1b、acb、a#b 等格式内容。方括号 [] 用于匹配括号内的任意一个字符,常用写法有 [0-9] 匹配所有数字、[a-z] 匹配小写字母、[A-Z] 匹配大写字母,组合 [a-zA-Z0-9_] 可匹配字母、数字和下划线,常用于匹配用户名、变量名。而 [^] 代表取反,能够匹配所有不在括号内的字符,[^0-9] 即可匹配全部非数字字符。
2. 位置匹配符号(锚点,精准匹配)
核心作用:限定内容出现在行首还是行尾,避免匹配到多余内容,日志排查超常用。
位置锚点符号用于精准限定匹配内容的位置,避免模糊匹配,是日志筛选的核心用法。 ^ 代表行首匹配,^error 可以精准筛选出所有以 error 开头的日志行,快速定位报错信息。 **能够匹配所有以 txt 结尾的文本行。组合 **^$** 可直接匹配文件中的纯空行,通过命令grep -E "^$" test.txt` 即可快速找出文件内所有空行。
3. 重复匹配符号(控制字符出现次数)
最常用的一组符号,用来匹配不确定长度的内容。
重复匹配符号用于控制前置字符的出现次数,适配不确定长度的文本匹配场景,日常使用频率极高。 ***** 表示前置字符出现0次或多次,ab* 可匹配 a、ab、abb、abbb 等内容; + 表示前置字符至少出现1次,ab+ 只能匹配 ab、abb 这类包含b的内容,无法单独匹配a; ? 表示前置字符出现0次或1次,ab? 仅匹配 a 和 ab。同时支持精准次数限定,{n} 匹配恰好n次,[0-9]{3} 匹配3位数字;{n,} 匹配至少n次,[0-9]{6,} 匹配6位及以上数字;{n,m} 匹配n到m次,[0-9]{1,11} 可匹配1-11位数字,适配手机号、短数字场景。
4. 分组与选择符号
分组与或逻辑符号用于实现复杂匹配规则,解决多字符、多规则匹配需求。 () 为分组符号,可将多个字符整合为一个整体统一匹配,(ab)+ 就能整体重复匹配ab、abab、ababab等组合,同时分组还支持后续sed替换引用。 | 是或逻辑符号,可匹配左右任意一条规则,常用于多关键词筛选,比如 error|warn 可以一次性匹配文本中包含error或warn的所有行。
五、字符简写类(新手提速必备)
Linux 提供了简写规则,不用每次都写 [0-9]、[a-z],简洁高效。
Linux 提供了极简字符简写规则,替代冗长的区间写法,大幅提升匹配效率。常用简写对应关系:\d 等价于 [0-9] 匹配数字,\D 等价于 [^0-9] 匹配非数字;\w 等价于 [a-zA-Z0-9_] 匹配单词字符,\W 匹配非单词字符;\s 匹配空格、制表符、换行等所有空白符,\S 匹配所有非空白符。熟练使用简写,能让正则语句更简洁、易读。
六、三大核心命令正则用法(直接套用)
学正则最终是为了落地命令,这里给新手整理最常用的固定用法,直接复制修改即可。
1. grep 筛选文本(查)
核心参数:-E 开启扩展正则,-v 反向匹配(排除),-n 显示行号
常用案例:
grep是Linux最常用的文本筛选工具,搭配扩展正则参数 -E 使用,无需转义特殊符号,同时可搭配 -v 反向匹配、-n 显示匹配行号。日常高频用法:筛选文件所有空行 grep -E "^$" test.txt,筛选文件所有非空行 grep -E -v "^$" test.txt,筛选以数字开头的文本行 grep -E "^[0-9]" test.txt,批量筛选日志中错误、告警信息grep -E "error|fail" log.txt。
2. sed 替换/删除文本(改、删)
核心参数:-r 开启扩展正则,-i 直接修改文件(谨慎使用)
语法:sed -r 's/匹配规则/替换内容/g' 文件名 (s=替换,g=全局替换)
常用案例:
sed核心用于文本替换和删除,搭配 -r 开启扩展正则,-i 参数可直接修改源文件(新手慎用,建议先测试)。通用语法为 sed -r 's/匹配规则/替换内容/g' 文件名,其中s代表替换,g代表全局匹配替换。日常高频用法:删除文件所有空行 sed -r '/^$/d' test.txt,删除文本中所有数字 sed -r 's/[0-9]+//g' test.txt,批量替换abc开头的整行内容sed -r 's/^abc.*/test/g' test.txt。
3. awk 精准截取文本(析)
awk 默认支持扩展正则,无需加参数,适合按列、按规则截取内容
常用案例:筛选包含IP的行(简单正则匹配)
awk 默认原生支持扩展正则,无需额外参数,主打精准文本截取、按规则筛选内容,常用于日志解析、数据提取。最常用的实操场景为筛选文本、日志中的IP地址,命令如下:awk '/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/ {print $0}' log.txt,可精准匹配并输出所有包含合法IP格式的行。
七、新手必避的5个正则坑
新手90%的报错,都出自这几点,牢记即可少走弯路:
新手使用Linux正则极易踩坑,这5个高频问题一定要规避,能解决绝大多数匹配异常问题。第一,混淆基础正则与扩展正则,普通grep、sed默认基础正则,+、{}、()等符号必须转义,日常统一使用 grep -E、sed -r 即可规避;第二,贪心匹配问题,.* 会匹配尽可能多的字符,模糊匹配可用,精准匹配建议限定字符范围;第三,锚点误用,^、是精准匹配的关键,不加锚点会匹配文本中间的目标内容,行首尾精准筛选必须搭配使用;第四,中括号内特殊符号失效,.、*、+等元字符放入[]后,会失去特殊功能,仅代表符号本身;第五,空白行判断失误,`^仅匹配纯空行,包含空格、制表符的空白行需用^\s*$` 匹配。
八、新手极简学习总结
最后做一个新手极简总结,方便大家快速记忆、落地使用。首先,Linux正则分为基础正则BRE和扩展正则ERE,日常工作统一使用扩展正则,通过 grep -E、sed -r 开启,减少转义符带来的报错;其次,正则核心核心逻辑只有四类:单字符匹配、位置锚点、重复次数限定、分组或逻辑,掌握这些就可以应对99%的场景;最后,正则学习无需死记硬背,重点掌握高频元字符和grep、sed、awk三大命令的固定用法,以实操为主、够用为原则,熟练后可快速完成日志排查、文本批量处理等工作。