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 元字符
-
.
:匹配任意单个字符(除\r\n
) -
[]
:匹配字符集,如[a-z]
、[0-9]
-
[^list]
:匹配非集合中的字符 -
^
:行首 -
$
:行尾 -
\
:转义符,用于去除其后字符的特殊意义
1.4.3 重复次数
-
*
:匹配前面的子表达式0 次或多次 -
\+
:匹配前面的子表达式至少 1 次 -
\{n\}
:匹配前面的子表达式恰好 n 次 -
\{m,n\}
:匹配前面的子表达式m 到 n 次 -
\{n,\}
:匹配前面的子表达式至少 n 次
扩展功能(ERE)
-
+
:一个或多个 -
?
:0 或 1 次 -
|
:或者(OR) -
()
:分组 -
()+
:匹配重复的组
2. grep —— 条件查找
常用选项
-
-E
:启用扩展正则 -
-c
:统计匹配行数 -
-i
:忽略大小写 -
-o
:只输出匹配内容 -
-v
:反向匹配(不包含的行) -
-n
:显示行号 -
--color=auto
:高亮匹配
示例
bash
grep -c root /etc/passwd # 统计 root 出现的行数 grep -i "the" web.sh # 不区分大小写匹配 grep -v root /etc/passwd # 输出不包含 root 的行 grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' ifconfig.out | head -1 # 提取 IP 地址
3. 基础正则 vs 扩展正则
BRE 常见元字符
-
^
:行首 -
$
:行尾 -
.
:任意单字符 -
[list]
:匹配字符集 -
[^list]
:反向匹配 -
*
:0 或多次 -
\{n\}
:精确次数 -
\{n,\}
:至少 n 次 -
\{n,m\}
:n~m 次
ERE 新增功能
-
+
:一个或多个 -
?
:0 或 1 次 -
|
:或者(OR) -
()
:分组 -
()+
:匹配重复的组
4. 元字符操作案例
-
查找特定字符
bash
grep -n 'the' test.txt # 查找 the grep -vn 'the' test.txt # 反向匹配
-
中括号集合
bash
grep -n 'sh[io]rt' test.txt # shirt 或 short grep -n '[^w]oo' test.txt # 前面不是 w 的 oo
-
定位符
bash
grep -n '^the' test.txt # 行首是 the grep -n '\.$' test.txt # 行尾是 . grep -n '^$' test.txt # 空行
-
点与星
bash
grep -n 'w..d' test.txt # w 开头 d 结尾,中间两个字符 grep -n 'woo*d' test.txt # w 开头 d 结尾,中间 o 可有可无 grep -n 'w.*d' test.txt # w 开头 d 结尾,中间任意字符 grep -n '[0-9][0-9]*' test.txt # 任意数字所在行
-
次数限定符
bash
grep -n 'o\{2\}' test.txt # oo grep -n 'wo\{2,5\}d' test.txt # w 开头 d 结尾,2-5 个 o grep -n 'wo\{2,\}d' test.txt # 至少两个 o
5. 总结
正则表达式是一种用于描述字符串模式的规则,广泛应用于文本检索、替换和过滤。
掌握基础元字符(如 ^
, $
, .
, \
, *
, []
, [^]
, {n}
, {n,}
, {n,m}
)及其在 BRE 和 ERE 中的差异,是高效使用文本处理工具(如 grep
、sed
、awk
)的关键。