grep 命令使用手册详解
grep 命令使用手册详解
一、正则表达式基础概念
文档首先明确正则表达式的核心定义与构成,为后续语法学习奠定基础。
1. 核心定义
-
本质:一种用于匹配字符串的 “模式(pattern)”,通过该模式可在文本中查找 1 个或多个目标字符串。
-
构成
:由 “普通字符” 和 “元字符” 组成,是独立于工具 / 语言的语法体系。
- 普通字符:无特殊含义的可打印 / 不可打印字符,包括大小写字母(a-Z)、数字(0-9)、标点符号(如
,
、!
)等。 - 元字符:具有特殊匹配功能的字符(如
[ ]
、^
、$
),是正则表达式的核心。
- 普通字符:无特殊含义的可打印 / 不可打印字符,包括大小写字母(a-Z)、数字(0-9)、标点符号(如
-
应用场景:Linux 工具(
vim
、grep
、less
)和编程语言(Perl、Python、C)均支持正则表达式。
2. 分类
正则表达式在 Linux 中主要分为两类,核心差异是支持的元字符数量:
- 普通正则表达式:支持基础元字符(如
[ ]
、.
),需通过grep
(默认)、sed
(默认)等工具使用。 - 扩展正则表达式:支持更多元字符(如
+
、?
、{ }
、()
),需通过egrep
或grep -E
、sed -r
等工具启用。
二、环境准备:实操文本与初始代码
文档以一个名为words
的文本文件为实操对象,先通过vim
创建并初始化内容,后续所有案例均基于该文件展开。
1. 创建与初始化words
文件
[root@server ~ 09:25:59]# vim words
[root@server ~ 09:26:27]# cat words | grep 'cat'
cat
category
acat
concatenate
三、核心语法与实操代码
文档按 “字符匹配→位置匹配→次数限定→特殊场景” 的逻辑,逐一讲解正则语法,并配套完整代码案例。
1. 普通字符匹配(基础)
普通字符直接作为模式匹配,无特殊处理,常用于精确查找固定字符串。
案例:在words
文件中查找包含 “cat” 的行
字符集匹配([ ]
与[^ ]
)
通过[ ]
定义 “字符集合”,匹配集合中的任意一个字符;[^ ]
则匹配 “除集合外的任意字符”,是正则中最常用的字符匹配方式。
(1)基础字符集[ ]
- 语法:
[字符1字符2...]
或[范围]
(如[a-z]
、[0-9]
)。 - 案例 1:匹配 “c” 和 “t” 之间是 “a” 或 “b” 的字符串(即
c[a/b]t
)
[root@server ~ 09:26:42]# echo cbt >> words
[root@server ~ 09:27:03]# echo c1t >> words
[root@server ~ 09:27:08]# cat words |grep 'c[ab]t'
cat
category
acat
concatenate
cbt
- 案例 2:按字符范围匹配(小写字母、大写字母、数字)
[root@server ~ 09:27:27]# cat words | grep 'c[a-z]t'
cat
category
acat
concatenate
cbt
[root@server ~ 09:28:02]# echo cCt >> words
[root@server ~ 09:28:20]# cat words | grep 'c[A-Z]t'
cCt
[root@server ~ 09:28:31]# cat words | grep 'c[0-9]t'
c1t
[root@server ~ 09:28:43]# cat words | grep 'c[a-z0-9]t'
cat
category
acat
concatenate
cbt
c1t#匹配- 要在前面加上-号
[root@server ~ 09:30:03]# echo c-t >> words
[root@server ~ 09:30:25]# cat words | grep 'c[-a-z0-9]t'
cat
category
acat
concatenate
cbt
c1t
c-t
反向字符集[^ ]
- 语法:
[^字符1字符2...]
,匹配 “除集合内字符外的任意字符”。 - 案例:匹配 “c” 和 “t” 之间不是“a” 或 “b” 的字符串
[root@server ~ 09:30:30]# cat words | grep 'c[^ab]t'
c1t
cCt
c-t
[root@server ~ 09:31:18]# cat words | grep 'c[a^b]t'
cat
category
acat
concatenate
cbt
[root@server ~ 09:31:36]# cat words | grep 'c[ab]t'
cat
category
acat
concatenate
cbt
通配符匹配(.
)
是基础元字符,匹配 “除换行符(\n)外的任意单个字符”,相当于 “任意字符占位符”。
案例:匹配 “c” 和 “t” 之间有任意 1 个字符的字符串(c.t
)
[root@server ~ 10:25:01]# cat words | egrep 'c.t'
cat
category
acat
concatenate
cbt
c1t
cCt
c-t
c.t
hello cat
转义字符(\
)
\
用于 “取消元字符的特殊含义”(将元字符转为普通字符),或 “激活普通字符的特殊含义”(如\n
表示换行符)。
案例 1:匹配普通小数点(.
)
[root@server ~ 10:23:48]# cat words | egrep 'c\.t'
c.t
逻辑或匹配(|
,扩展正则)
|
是扩展元字符,用于 “二选一匹配”(A 或 B),需用egrep
或grep -E
启用扩展正则。
案例:在words
中匹配 “cat” 或 “dog”
# 方法1:用egrep
[root@server ~ 10:25:07]# cat words | egrep 'cat|dog'
cat
category
acat
concatenate
dog
hello cat
dog# 方法2:用grep -E(效果同egrep)
[root@server ~ 10:26:52]# cat words | grep -E 'cat|dog'
cat
category
acat
concatenate
dog
hello cat
dog
预定义字符集([[:xxx:]]
)
文档提供了 Linux 正则中常用的 “预定义字符集”,用于简化常见匹配场景(如数字、字母),兼容性更强(适配不同字符编码)。
预定义字符集 | 描述 | 等价普通写法(ASCII 环境) | |
---|---|---|---|
[[:digit:]] | 数字(0-9) | [0-9] | |
[[:xdigit:]] | 十六进制数字(0-9、A-F、a-f) | [0-9A-Fa-f] | |
[[:lower:]] | 小写字母(a-z) | [a-z] | |
[[:upper:]] | 大写字母(A-Z) | [A-Z] | |
[[:alpha:]] | 所有字母(大小写) | [a-zA-Z] | |
[[:alnum:]] | 字母 + 数字 | [a-zA-Z0-9] | |
[[:blank:]]/[[:space:]] | 空白字符(空格、制表符、换行符等) | [ \t\n\r\f\v] | |
[[:punct:]] | 标点符号(如$ 、& 、() 、- 等) | [$&'()*+,-./:;<=>?@[\]^_ { | }~]` |
[[:print:]]/[[:graph:]] | 可打印字符(字母 + 数字 + 标点) | [a-zA-Z0-9[:punct:]] | |
[[:cntrl:]] | 控制字符(ASCII 中 000-037、177) | - |
非打印字符匹配
非打印字符(如换行符、制表符)需用转义序列匹配,文档列出了常用场景:
转义序列 | 描述 | 等价写法 |
---|---|---|
\cX | 控制字符(X 为 A-Z/a-z),如\cM = 回车符 | - |
\f | 换页符 | \x0c 、\cL |
\n | 换行符 | \x0a 、\cJ |
\r | 回车符 | \x0d 、\cM |
\s | 任意空白字符(空格、制表符等) | [ \f\n\r\t\v] |
\S | 任意非空白字符 | [^ \f\n\r\t\v] |
\w | 单词字符(字母 + 数字 + 下划线) | [a-zA-Z0-9_] |
\W | 非单词字符 | [^a-zA-Z0-9_] |
\t | 制表符 | \x09 、\cI |
\v | 垂直制表符 | \x0b 、\cK |
说明:grep
工具原生支持\w
、\W
、\s
、\S
,无需扩展正则。
定位符(匹配字符串位置)
定位符不匹配具体字符,仅匹配 “字符的位置”(如行首、行末、单词边界),常用于精确限定目标字符串的位置。
行首匹配(^
)
- 语法:
^目标字符串
,匹配 “以目标字符串开头的行”。 - 案例:匹配以 “cat” 开头的行
[root@server ~ 10:02:23]# cat words | grep '^cat'
cat
category
行末匹配($
)
-
语法:
目标字符串$
,匹配 “以目标字符串结尾的行”。 -
案例:匹配以 “cat” 结尾的行
[root@server ~ 10:02:35]# cat words | grep 'cat$' cat acat
单词边界匹配(\b
)
- 语法:
\b目标字符串
(目标字符串在单词开头)、目标字符串\b
(目标字符串在单词结尾)、\b目标字符串\b
(目标字符串是独立单词)。 - 案例:先追加 “hello cat”,再匹配单词边界
[root@server ~ 10:02:54]# echo hello world >> words
[root@server ~ 10:03:23]# cat words | grep '\bcat'
cat
category
[root@server ~ 10:03:34]# echo hello cat >> words
[root@server ~ 10:04:19]# cat words | grep 'cat\b'
cat
acat
hello cat
限定符(匹配次数,扩展正则)
限定符用于 “指定前一个子表达式的匹配次数”(如 “匹配 1 次以上”“匹配 2-3 次”),均为扩展元字符,需用egrep
或grep -E
。
限定符 | 语法 | 描述 | 案例 |
---|---|---|---|
* | 子表达式* | 匹配前一子表达式任意次数(0 次、1 次、多次) | do*g 匹配dg (o0 次)、dog (o1 次)、doog (o2 次) |
+ | 子表达式+ | 匹配前一子表达式1 次以上(至少 1 次) | do+g 匹配dog 、doog (不匹配dg ) |
? | 子表达式? | 匹配前一子表达式0 次或 1 次(最多 1 次) | do?g 匹配dg 、dog (不匹配doog ) |
{m} | 子表达式{m} | 匹配前一子表达式恰好 m 次 | do{2}g 仅匹配doog (o2 次) |
{m,n} | 子表达式{m,n} | 匹配前一子表达式m-n 次(含 m 和 n) | do{2,3}g 匹配doog (o2 次)、dooog (o3 次) |
{m,} | 子表达式{m,} | 匹配前一子表达式至少 m 次 | do{2,}g 匹配doog 、dooog 、doooog (o≥2 次) |
{,n} | 子表达式{,n} | 匹配前一子表达式最多 n 次 | do{,3}g 匹配dg (o0 次)、dog (o1 次)、doog (o2 次)、dooog (o3 次) |
案例:以 “d” 和 “g” 之间的 “o” 为例,验证各限定符
[root@server ~ 10:04:25]# echo dg >> words
[root@server ~ 10:22:04]# echo dog >> words
[root@server ~ 10:22:10]# echo dooog >> words
[root@server ~ 10:22:15]# cat words | grep 'do*g'
dog
dg
dog
dooog
[root@server ~ 10:22:28]# cat words | grep 'do?g'
[root@server ~ 10:22:35]# cat words | egrep 'do?g'
dog
dg
dog
[root@server ~ 10:22:48]# cat words | egrep 'do+g'
dog
dog
dooog
[root@server ~ 10:23:03]# cat words | egrep 'do{2}g'
[root@server ~ 10:23:29]# cat words | egrep 'do{3}g'
dooog
[root@server ~ 10:23:36]# cat words | egrep 'do{0,3}g'
dog
dg
dog
dooog