grep(global regular expression print)是
Linux 系统中最强大的文本搜索工具,核心功能是 “全局搜索
正则表达式并打印匹配行”。无论是日常文件内容检索、日志分析,还是脚本编程中的文本过滤,grep 都能通过灵活的选项和正则表达式支持,快速从海量文本中提取关键信息。本文系统梳理 grep 的基本语法、常用选项、正则表达式应用及高级组合技巧,从基础到进阶,帮助用户全面掌握这一必备
Linux 工具。
grep 的核心作用是在文件或输入流中搜索符合 “模式” 的文本行,并输出匹配结果。
- 模式(Pattern):可是普通字符串(如
"error"
)或正则表达式(如"^[0-9]+"
);
- 文件名:指定搜索的文件,支持通配符(如
*.log
);若省略文件名,grep 将从标准输入(如管道输出)读取数据。
grep "hello" example.txt
ps aux | grep "nginx"
grep 提供丰富选项以满足不同场景需求,以下是高频使用的核心选项分类解析:
选项 |
功能说明 |
示例 |
-i |
忽略大小写匹配(匹配Hello /HELLO /hello ) |
grep -i "hello" example.txt |
-v |
反转匹配:输出不包含模式的行 |
grep -v "debug" app.log (过滤日志中的 debug 信息) |
-w |
只匹配完整单词(不匹配单词的部分字符) |
grep -w "cat" text.txt (匹配 "cat",不匹配 "category") |
-x |
只匹配整行完全相等的内容 |
grep -x "success" result.txt (仅输出内容为 "success" 的行) |
选项 |
功能说明 |
示例 |
-n |
显示匹配行的行号 |
grep -n "error" app.log (输出格式:5:ERROR: connection failed ) |
-c |
统计匹配行的数量(仅输出数字) |
grep -c "warning" system.log (统计警告出现次数) |
-l |
只输出包含匹配内容的文件名(不显示具体行) |
grep -l "config" *.ini (列出含 "config" 的 ini 文件) |
-L |
只输出不包含匹配内容的文件名 |
grep -L "version" *.sh (列出不含 "version" 的脚本文件) |
选项 |
功能说明 |
示例 |
-A NUM |
显示匹配行及后续 NUM 行(After) |
grep -A 2 "error" app.log (显示错误行 + 后 2 行上下文) |
-B NUM |
显示匹配行及前面 NUM 行(Before) |
grep -B 3 "crash" debug.log (显示崩溃行 + 前 3 行上下文) |
-C NUM |
显示匹配行及前后各 NUM 行(Context) |
grep -C 1 "login" access.log (显示登录行 + 前后各 1 行) |
选项 |
功能说明 |
示例 |
-r /-R |
递归搜索目录及子目录中的所有文件 |
grep -r "user" /etc/ (递归搜索 /etc 下含 "user" 的文件) |
-include=PATTERN |
递归时只搜索符合 PATTERN 的文件 |
grep -r --include="*.py" "import" ./ (只递归搜索 py 文件中的 import 语句) |
-exclude=PATTERN |
递归时排除符合 PATTERN 的文件 |
grep -r --exclude="*.log" "error" ./ (递归搜索时排除 log 文件) |
grep 支持
基本正则表达式(BRE) 和
扩展正则表达式(ERE),通过
特殊符号组合实现复杂模式匹配。
元字符 |
功能说明 |
示例 |
. |
匹配任意单个字符(除换行符) |
grep "h.t" text.txt (匹配 "hot"/"hat"/"h1t" 等) |
[] |
匹配括号内的任意单个字符 |
grep "[0-9]" num.txt (匹配含数字的行) |
[^] |
匹配不在括号内的任意单个字符 |
grep "[^a-z]" text.txt (匹配含非小写字母的行) |
^ |
匹配行首位置 |
grep "^#" config.ini (匹配以 #开头的注释行) |
$ |
匹配行尾位置 |
grep ")$" script.sh (匹配以) 结尾的行) |
* |
匹配前面的字符零次或多次 |
grep "lo*ve" text.txt (匹配 "ve"/"love"/"loove" 等) |
\{n,m\} |
匹配前面的字符至少 n 次,最多 m 次 |
grep "a\{2,3\}" text.txt (匹配 "aa"/"aaa") |
扩展正则表达式支持更多运算符,无需对特殊符号转义:
元字符 |
功能说明 |
示例 |
|
|
+ |
匹配前面的字符一次或多次 |
grep -E "lo+ve" text.txt (匹配 "love"/"loove",不匹配 "ve") |
|
|
? |
匹配前面的字符零次或一次 |
grep -E "colou?r" text.txt (匹配 "color"/"colour") |
|
|
` |
` |
匹配多个模式中的任意一个(或逻辑) |
`grep -E "error |
warning"app.log`(匹配含 error 或 warning 的行) |
() |
分组匹配,结合 ` |
` 使用 |
`grep -E "(hello |
hi)world"text.txt`(匹配 "helloworld"/"hiworld") |
{n,m} |
同 BRE 的\{n,m\} ,无需转义 |
grep -E "a{2,3}" text.txt (匹配 "aa"/"aaa") |
|
|
find /var/log -type f -name "*.log" | xargs grep "failed login"
grep --color=auto "error" app.log
export GREP_OPTIONS='--color=auto -n'
需求 |
命令示例 |
搜索含特定单词的行(忽略大小写) |
grep -iw "keyword" file.txt |
统计日志中错误出现的次数 |
grep -c "ERROR" app.log |
递归搜索目录中的字符串并显示行号 |
grep -rn "target" ./directory |
显示错误行及前后 2 行上下文 |
grep -C 2 "ERROR" debug.log |
查找不含某字符串的文件 |
grep -L "pattern" *.txt |
- 正则表达式中的特殊字符(如
*
、$
)需用反斜杠\
转义(基础模式下),或用-E
启用扩展模式避免转义;
- 搜索包含空格或特殊符号的模式时,需用引号包裹(如
grep "hello world" file.txt
);
- 处理大文件或目录时,结合
--include
/--exclude
筛选文件可显著提升效率。
grep 命令是 Linux 文本处理的 “瑞士军刀”,从简单的字符串搜索到复杂的正则表达式匹配,其灵活性和效率使其成为开发者、运维人员的必备工具。掌握本文介绍的基础语法、常用选项及正则技巧,能大幅提升文本检索和日志分析的效率,轻松应对日常 Linux 操作中的各类文本处理需求。