前言
在Linux系统管理与Shell脚本编程中,高效、精准地处理文本是一项核心能力。无论是分析冗长的系统日志、解析复杂的配置文件,还是进行批量文本操作,都离不开强大的文本处理工具。正则表达式(Regular Expression)作为描述字符串模式的通用语言,正是这一切的基石。它搭配grep
、sed
、awk
等文本处理器,可以让我们用简洁的规则完成复杂的查找、过滤、替换和提取任务,从而极大地提升工作效率和脚本的智能化水平。
本章将系统性地介绍正则表达式的基本概念、语法规则及其在Linux环境下的分类(BRE与ERE),并通过大量实例详细讲解最常用的文本搜索工具grep
的用法。无论您是初学者还是希望巩固基础,本章内容都将为您打下坚实的文本处理基础,助您解锁Shell编程的更高级技能。
1. 正则表达式
1.1 定义
正则表达式(Regular Expression, regex/regexp/RE)是一种用来描述字符串模式的规则。
功能:检索、替换、过滤符合特定规则的字符串。
1.2 用途
系统日志筛选(如定位“登录失败”“服务启动失败”)
配置文件解析
文本查找替换
脚本编程中的条件匹配
1.3 Linux 正则表达式分类
BRE (基础正则表达式)
传统语法,功能有限
量词
{}
需要转义\{n,m\}
+
,?
,()
需要转义常用工具:
grep
、sed
ERE (扩展正则表达式)
功能更强大,语法简洁
+
,?
,()
,{}
,|
等无需转义常用工具:
egrep
(grep -E
)、awk
1.4 正则表达式组成
1.4.1 普通字符
字母、数字、标点符号等本身。
1.4.2 BRE 中的元字符 (Metacharacters)
字符 | 功能描述 |
---|---|
. | **匹配任何单个字符,换行符除外( 换行符(\n )、回车符(\r )) 例如 a.c 匹配 abc , aac , a-c 。 |
* | 量词:匹配前一个字符(或表达式)零次或多次。 例如 a* 匹配 "" (空), a , aa , aaa ... |
^ | 1. 锚点:匹配行的开头。 例如 2. 在[ ]内:表示取反(字符组中第一个字符时) 例如 |
$ | 锚点:匹配行的结尾。例如 world$ 匹配以 "world" 结尾的行。 |
[ ] | 开始一个字符组。例如 [aeiou] 匹配任何一个元音字母。 |
\ |
1. 转义符:取消后续字符的特殊含义,使其成为普通字符 例如 2. 激活符:赋予后续字符特殊含义(这是BRE独有的特点) 例如 |
1.4.3 重复次数
*
0 次或无数次匹配前面子表达式0次或者多次 例:goo*d、go.*d
\+
至少 1 次匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}
恰好 n 次匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字
\{m,n\}
m 到 n 次匹配前面的子表达式n到m次,例: go\{2,3\}d、'[0-9]\{2,3\}'匹配两位到三位数字
\{n,\}
至少 n 次匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数字
2. grep —— 条件查找
常用选项
-E
:启用扩展正则-c
:统计匹配行数-i
:忽略大小写-o
:只输出匹配内容-v
:反向匹配(不包含的行)-n
:显示行号--color=auto
:高亮匹配
示例
grep -c root /etc/passwd # 统计 root 出现的行数 grep -i 'the' web.sh # 不区分大小写匹配 grep -v root /etc/passwd # 输出不包含 root 的行 grep -o ifconfig | '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' # 提取 IP 地址
3. 基础正则 vs 扩展正则
BRE 常见元字符
^
行首$
行尾.
任意单字符[list]
匹配字符集[^list]
反向匹配*
0 或多次\{n\}
精确次数\{n,\}
至少 n 次\{n,m\}
n~m 次
ERE 新增功能
+
一个或多个?
0 或 1 次|
或者(OR)()
分组()+
匹配重复的组
4. 元字符操作案例
查找特定字符
grep -n 'the' test.txt # 查找 the grep -vn 'the' test.txt # 反向匹配
中括号集合
grep -n 'sh[io]rt' test.txt # shirt 或 short grep -n '[^w]oo' test.txt # 前面不是 w 的 oo grep -n '[wd]' test.txt # 查找 有(w或d)--简单来说(找 有 w 或 d 的行) grep -n '[^wd]' test.txt # 查找 有(非w且非d)--简单来说(找 有[非w且非d]的行) grep -nv '[wd]' test.txt # 查找 没有(w或d)——简单来说(找 没有w和d的行) grep -nv '[^wd]' test.txt # 查找 没有(非w且非d)——简单来说(找 没有[非w且非d]的行)
定位符***
grep -n '^the' test.txt # 行首是 the grep -n '\.$' test.txt # 行尾是 . grep -n '^$' test.txt # 空行
点与星
grep -n 'w..d' test.txt # w 开头 d 结尾,中间任意两个字符 grep -n 'woo*d' test.txt # wo 开头 d 结尾,中间 o (数量为0到无数个) grep -n 'w.*d' test.txt # w 开头 d 结尾,中间任意字符[.*意思是有0~无数个“.”(而“.”表示任意字符)] 执行以下命令即可查询任意数字所在行。 grep -n '[0-9][0-9]*' test.txt #至少有1个数字 grep -n '[0-9]*' test.txt #至少有0个数字
次数限定符
#查询两个 o 的字符。 grep -n 'o\{2\}' test.txt # oo #查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串 grep -n 'wo\{2,5\}d' test.txt # w 开头 d 结尾,2-5 个 o #查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。 grep -n 'wo\{2,\}d' test.txt # 至少两个 o
5.总结
本章系统地讲解了正则表达式的基础知识及其在Linux文本处理,特别是在grep
工具中的应用。核心内容可归纳为以下几点:
核心概念:正则表达式是一种用于描述字符串模式的规则,是文本检索、替换和过滤的强大工具,广泛应用于日志分析、配置解析和脚本编程中。
两大分类:Linux中的正则表达式主要分为基础正则表达式(BRE)和扩展正则表达式(ERE)。前者语法传统,元字符如
{ }
、( )
、+
、?
需要转义;后者功能更强大,这些元字符无需转义,语法更简洁。元字符体系:掌握了构成正则表达式的核心元字符及其功能,包括:
定位符:
^
(行首)、$
(行尾)匹配符:
.
(任意单个字符)、[]
(字符集合)、[^]
(反向字符集)量词:
*
(0次或多次)、\+
(至少1次,BRE需转义)、\{n,m\}
(指定次数范围,BRE需转义)
实践工具:重点掌握了文本搜索利器
grep
的常用选项(如-i
忽略大小写、-v
反向匹配、-n
显示行号、-o
只输出匹配内容)及其与正则表达式结合使用的多种实战案例,从而能够高效地完成各种文本搜索任务。学习路径:正则表达式的学习关键在于“理论与实践相结合”。理解元字符的含义是基础,而通过大量实践在
grep
、sed
、awk
等工具中灵活运用,才能真正掌握这门文本处理的利器,为后续更深入的Shell编程和系统管理工作做好准备。