一、基本概念
grep(Global Regular Expression Print)是 Linux/Unix 中用于文本搜索的核心工具。其核心功能是:
- 在文件或输入流中匹配指定模式(支持正则表达式)。
- 输出包含匹配模式的行,支持高亮显示、行号标记等。
- 支持递归搜索目录、多文件处理及复杂过滤逻辑。
二、语法结构
grep [选项] [模式] [文件...]
grep [选项] [-e 模式 | -f 模式文件] [文件...]
示例:
grep "error" /var/log/syslog # 在 syslog 中搜索包含 "error" 的行
grep -r "TODO" ~/projects # 递归搜索项目目录中所有含 "TODO" 的文件
三、常用选项
选项 | 说明 |
---|---|
基础匹配 | |
-i | 忽略大小写(grep -i "warning" file ) |
-v | 反向匹配(输出不包含模式的行) |
-w | 匹配整个单词(避免部分匹配,如 grep -w "test" 不匹配 "testing") |
-x | 匹配整行(行内容必须完全等于模式) |
输出控制 | |
-n | 显示匹配行的行号(grep -n "error" log.txt ) |
-c | 仅统计匹配的行数(grep -c "404" access.log ) |
--color=auto | 高亮显示匹配内容 |
-o | 仅输出匹配的文本片段(非整行) |
多文件处理 | |
-r / -R | 递归搜索目录(grep -r "func" src/ ) |
-l | 仅输出包含匹配的文件名(grep -rl "deprecated" . ) |
-L | 输出不包含匹配的文件名 |
上下文查看 | |
-A NUM | 显示匹配行后 NUM 行(After) |
-B NUM | 显示匹配行前 NUM 行(Before) |
-C NUM | 显示匹配行前后各 NUM 行(Context) |
模式扩展 | |
-E | 启用扩展正则表达式(等价 egrep ) |
-F | 禁用正则,按字面文本匹配(等价 fgrep ) |
-f FILE | 从文件读取匹配模式(每行一个模式) |
四、正则表达式元字符
元字符 | 说明 | 示例 |
---|---|---|
基础匹配 | ||
. | 匹配任意单个字符(除换行符) | gr.p → "grep", "gr3p" |
* | 匹配前一个字符 0 次或多次 | go*gle → "ggle", "google" |
+ | 匹配前一个字符 1 次或多次(需 -E ) | go+gle → "gogle", "google" |
? | 匹配前一个字符 0 或 1 次(需 -E ) | colou?r → "color", "colour" |
锚定位置 | ||
^ | 匹配行首 | ^start → 行以 "start" 开头 |
$ | 匹配行尾 | end$ → 行以 "end" 结尾 |
\< / \> | 匹配单词边界 | \<the\> → 独立单词 "the" |
字符集 | ||
[...] | 匹配括号内任意字符 | [aeiou] → 匹配任意元音字母 |
[^...] | 匹配不在括号内的字符 | [^0-9] → 匹配非数字字符 |
` | ` | 逻辑或(需 -E ) |
分组与引用 | ||
() | 分组(需 -E ) | (abc)+ → 匹配 "abc", "abcabc" |
\n | 引用第 n 个分组(需 -E ) | (a.)\1 → 匹配 "abab" |
五、典型应用场景
1. 搜索日志中的错误信息
grep -n --color "CRITICAL" /var/log/app.log # 显示行号和高亮
grep -C 3 "panic" debug.log # 查看错误上下文
2. 统计代码中特定关键词
grep -r -c "#TODO" src/ # 统计每个文件的 TODO 数量
grep -w -o "function_[a-z]+" code.js | sort | uniq -c # 提取并统计函数名
3. 过滤命令输出
ps aux | grep "nginx" # 查找 Nginx 进程
netstat -tuln | grep ":80 " # 检查 80 端口占用
4. 批量处理文件
# 列出所有含 "user@example.com" 的配置文件
grep -rl "user@example.com" /etc/*.conf
# 删除所有空行(结合 sed)
grep -v "^$" input.txt > output.txt
5. 复杂正则匹配
# 匹配 IPv4 地址(简化版)
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
# 匹配日期格式 YYYY-MM-DD
grep -E "\b[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\b" dates.txt
六、命令实例
-
在文件中搜索字符串
grep 'hello' file.txt
在
file.txt
中搜索包含hello
的行。 -
忽略大小写搜索
grep -i 'hello' file.txt
在
file.txt
中搜索包含hello
、Hello
、HELLO
等不区分大小写的行。 -
显示匹配的行号
grep -n 'hello' file.txt
在
file.txt
中搜索包含hello
的行,并显示行号。 -
反转匹配
grep -v 'hello' file.txt
在
file.txt
中搜索不包含hello
的行。 -
递归搜索目录
grep -r 'hello' /path/to/directory
在
/path/to/directory
目录及其子目录中递归搜索包含hello
的行。 -
只输出匹配的文件名
grep -l 'hello' *.txt
在当前目录中搜索所有
.txt
文件,只输出包含hello
的文件名。 -
使用正则表达式
grep -E 'hello|world' file.txt
在
file.txt
中搜索包含hello
或world
的行(使用扩展正则表达式)。 -
显示匹配行及其前后行
grep -C 2 'hello' file.txt
在
file.txt
中搜索包含hello
的行,并显示其前后各 2 行。 -
搜索固定字符串
grep -F 'exact_string' file.txt
在
file.txt
中搜索完全匹配exact_string
的行(不使用正则表达式)。
七、注意事项
-
引号与特殊字符:
- 模式中包含空格或特殊符号(如
$
,*
)时,需用单引号包裹:
grep 'price: $5.99' file.txt
- 使用
-F
可避免正则解析(直接匹配*
或$
等字符)。
- 模式中包含空格或特殊符号(如
-
性能优化:
- 对大文件优先使用
-m NUM
限制匹配行数(如grep -m 100 "error"
)。 - 递归搜索时指定目录层级(结合
find
过滤文件类型)。
- 对大文件优先使用
-
正则兼容性:
grep
默认使用基本正则表达式(BRE)。- 使用
-E
或egrep
启用扩展正则表达式(ERE),支持+
,?
,|
等。
-
二进制文件处理:
- 使用
-a
强制将二进制文件视为文本搜索。 - 使用
-I
忽略二进制文件。
- 使用
通过灵活组合选项和正则表达式,grep
可高效完成日志分析、文本过滤、数据提取等任务。