下面我将从基础到高级,详细地介绍 grep 命令的用法。

核心概念:grep 是什么?
grep 的主要功能是在一个或多个文件中搜索匹配指定“模式”(Pattern)的行,并将匹配的行打印到标准输出(通常是你的终端屏幕)。
基本语法:
grep [选项] '模式' [文件...]
- 选项: 控制搜索行为的各种参数。
- 模式: 你要搜索的字符串或正则表达式。
- 文件: 要搜索的文件名,如果不指定文件,
grep会从标准输入(例如管道)中读取数据。
基础用法
在单个文件中搜索字符串
这是最简单的用法,在 file.txt 中搜索 "hello"。
grep 'hello' file.txt
file.txt包含 "hello world" 这一行,它就会被输出。- 注意:
grep默认是区分大小写的,搜索 "hello" 不会匹配 "Hello" 或 "HELLO"。
在多个文件中搜索
你可以同时指定多个文件。

grep 'error' log1.txt log2.txt log3.txt
从标准输入中搜索(管道)
grep 可以非常方便地与其他命令结合使用,通过管道 将一个命令的输出作为 grep 的输入。
# 查看当前目录下所有文件,并只显示包含 ".txt" 的行 ls -l | grep '.txt' # 查看所有正在运行的进程,并只显示包含 "nginx" 的行 ps aux | grep 'nginx'
常用选项
掌握这些选项是高效使用 grep 的关键。
-i (ignore case): 忽略大小写
当你不关心大小写时,这个选项非常有用。
grep -i 'hello' file.txt # 会同时匹配 hello, Hello, HELLO 等
-v (invert match): 反向匹配(输出不匹配的行)
这个选项会输出所有不包含指定模式的行。

# 显示 file.txt 中所有不包含 "hello" 的行 grep -v 'hello' file.txt
-n (line number): 显示行号
在输出匹配行的同时,显示其在文件中的行号。
grep -n 'error' app.log # 输出类似: # 15: [ERROR] Failed to connect to database. # 42: [ERROR] Disk space is full.
-c (count): 计算匹配的行数
只输出匹配的总行数,而不是具体的行。
grep -c 'error' app.log # 输出类似: # 2
-r 或 -R (recursive): 递归搜索
在指定目录及其所有子目录中搜索文件,这是查找代码的利器。
# 在当前目录及子目录的所有文件中搜索 "TODO" grep -r 'TODO' . # 在 /var/log 目录及其子目录中搜索 "nginx" grep -r 'nginx' /var/log
-l (files-with-matches): 只列出匹配的文件名
当你只想知道哪些文件包含某个模式,而不关心具体是哪一行时,这个选项非常有用。
# 列出当前目录及子目录中所有包含 "password" 的文件名 grep -r -l 'password' .
-w (word-regexp): 全字匹配
确保匹配的是整个单词,而不是单词的一部分,搜索 "the" 不会匹配 "then"。
echo "this is a test. the end." | grep -w 'the' # 只会输出 "the end." 这一行,因为 "the" 是一个独立的单词。
-A (after) 和 -B (before): 显示匹配行及其上下文
-A NUM(After): 显示匹配行之后的NUM行。-B NUM(Before): 显示匹配行之前的NUM行。-C NUM(Context): 显示匹配行及其前后各NUM行(最常用)。
# 在 app.log 中搜索 "error",并显示匹配行及其前后 2 行 grep -C 2 'error' app.log
进阶用法:正则表达式
grep 的真正威力在于其对正则表达式的支持。
基本正则表达式
默认情况下,grep 使用基本正则表达式。
- : 匹配任意单个字符(除了换行符)。
- : 匹配它前面的字符零次或多次。
^: 匹配行的开头。- : 匹配行的结尾。
[]: 匹配指定范围内的一个字符([a-z]匹配任意小写字母)。\: 转义特殊字符,使其失去特殊含义。
示例:
# 匹配以 "root" 开头的行
grep '^root' /etc/passwd
# 匹配以 "bash" 结尾的行
grep 'bash$' /etc/passwd
# 匹配包含 "gr[ae]y" 的行(即 "gray" 或 "grey")
grep 'gr[ae]y' color.txt
# 匹配 "co" 后面跟零个或多个 "l",再跟 "or" 的行(即 "color", "colour", "coor")
grep 'col*or' word.txt
# 匹配 IP 地址格式(非常简化的例子)
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' text.log
扩展正则表达式
如果你需要使用更丰富的正则表达式(如 , , , ),需要使用 -E 选项(或 egrep 命令)。
- : 匹配它前面的字符一次或多次。
- : 匹配它前面的字符零次或一次。
{n}: 匹配它前面的字符恰好n次。{n,}: 匹配它前面的字符至少n次。{n,m}: 匹配它前面的字符至少n次,但不超过m次。- : 或(匹配 两边的任意一个表达式)。
示例:
# 使用 -E 启用扩展正则表达式 # 匹配 "color" 或 "colour" grep -E 'colou?r' word.txt # 匹配 "111" 或 "112" grep -E '111|112' number.txt # 匹配一个或多个数字 grep -E '[0-9]+' text.log
颜色高亮显示
如果你的终端支持,grep 可以用高亮颜色显示匹配的文本,这在交互式使用时非常直观。
grep --color=auto 'error' app.log
--color=auto(或简写--color): 只有在输出到终端时才使用颜色,如果通过管道重定向到其他文件或命令,则自动禁用颜色,这是推荐的做法。- 大多数现代 Linux 发行版的
grep别名已经默认开启了颜色高亮。
总结与最佳实践
| 命令 | 功能 | 示例 |
|---|---|---|
grep 'pattern' file |
基础搜索 | grep 'main' source.c |
grep -i 'pattern' file |
忽略大小写 | grep -i 'error' log.txt |
grep -n 'pattern' file |
显示行号 | grep -n 'root' /etc/passwd |
grep -v 'pattern' file |
反向匹配 | grep -v '^#' config.conf (排除注释行) |
grep -r 'pattern' dir |
递归搜索目录 | grep -r 'TODO' . |
grep -C 2 'pattern' file |
显示上下文 | grep -C 2 'Exception' trace.log |
grep -w 'word' file |
全字匹配 | grep -w 'is' sentence.txt |
grep -E 'regex' file |
使用扩展正则 | grep -E 'go+gle' text.txt |
grep --color=auto 'p' f |
颜色高亮 | grep --color=auto 'warning' server.log |
一个强大的组合示例:
# 在项目代码中查找所有已废弃的函数,并显示这些函数所在的文件名和行号 # 1. find: 查找所有 .py 文件 # 2. xargs: 将文件列表传递给 grep # 3. grep: 在这些文件中搜索 # -n: 显示行号 # -H: 即使只有一个文件也显示文件名 (当用xargs时很有用) # --color=auto: 高亮显示 find . -name "*.py" -type f | xargs grep -nH --color=auto "deprecated"
通过掌握这些用法,你将能够高效地在 Linux/Unix 环境中处理和分析文本数据。
