grep
是 Linux 中用于文本搜索的强大工具,结合正则表达式(Regular Expression)可以实现复杂的模式匹配。以下是常见的正则表达式语法及示例:
1. 基本匹配
-
语法:直接匹配文本中的字符串。
bash
Copy
grep "hello" file.txt # 匹配包含 "hello" 的行
2. 行首/行尾
-
^
:匹配行首。 -
$
:匹配行尾。bash
Copy
grep "^start" file.txt # 匹配以 "start" 开头的行 grep "end$" file.txt # 匹配以 "end" 结尾的行 grep "^$" file.txt # 匹配空行(行首后直接接行尾)
3. 任意字符
-
.
:匹配任意单个字符(除换行符)。bash
Copy
grep "a.c" file.txt # 匹配如 "abc", "a2c", "a-c" 等
4. 字符集合
-
[ ]
:匹配集合中的任意一个字符。 -
[^ ]
:匹配不在集合中的任意一个字符。bash
Copy
grep "gr[ae]y" file.txt # 匹配 "gray" 或 "grey" grep "[0-9]" file.txt # 匹配包含数字的行 grep "[^a-z]" file.txt # 匹配包含非小写字母的字符
5. 量词(重复次数)
-
*
:前一个字符出现 0 次或多次。 -
+
:前一个字符出现 1 次或多次(需用-E
启用扩展正则)。 -
?
:前一个字符出现 0 次或 1 次(需用-E
)。 -
{n,m}
:前一个字符出现 n 到 m 次。bash
Copy
grep "go*gle" file.txt # 匹配 "ggle", "gogle", "google" 等 grep -E "go+gle" file.txt # 匹配 "gogle", "google" 等(不匹配 "ggle") grep -E "colou?r" file.txt # 匹配 "color" 或 "colour" grep -E "a{2,4}" file.txt # 匹配 "aa", "aaa", "aaaa"
6. 分组与或操作
-
( )
:分组(需用-E
)。 -
|
:逻辑“或”(需用-E
)。bash
Copy
grep -E "(apple|banana)" file.txt # 匹配 "apple" 或 "banana" grep -E "(abc)+" file.txt # 匹配 "abc", "abcabc" 等
7. 转义字符
-
\
:转义特殊字符(如.
、*
、$
等)。bash
Copy
grep "3\.14" file.txt # 匹配 "3.14"(避免被解析为 `.` 的通配符) grep "\\$10" file.txt # 匹配 "$10"(转义 $)
8. 预定义字符类
-
\d
:数字(需用-P
启用 Perl 正则,部分系统支持)。 -
\w
:单词字符(字母、数字、下划线)。 -
\s
:空白字符(空格、制表符等)。bash
Copy
grep -P "\d{3}" file.txt # 匹配连续 3 个数字(如 "123") grep -P "\w+" file.txt # 匹配单词(如 "hello_123")
9. 单词边界
-
\b
:匹配单词的边界。bash
Copy
grep "\bcat\b" file.txt # 匹配独立单词 "cat",不匹配 "category"
10. 反向引用
-
\n
:引用前面的分组(需用-E
或-P
)。bash
Copy
grep -E "(abc)\1" file.txt # 匹配 "abcabc"(分组 "abc" 重复一次)
示例综合应用
匹配 IP 地址:
bash
Copy
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt # 匹配如 "192.168.1.1"
匹配邮箱地址:
bash
Copy
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt # 匹配如 "user@example.com"
常用选项:
-
-i
:忽略大小写。 -
-v
:反向匹配(显示不匹配的行)。 -
-o
:仅输出匹配的部分。 -
-E
:启用扩展正则表达式(支持+
,?
,|
等)。 -
-P
:启用 Perl 兼容正则(支持\d
,\w
等)。
掌握这些正则表达式技巧后,grep
会成为你处理文本数据的利器!