grep 是 Linux 中使用频率最高的命令之一,几乎所有涉及文本查找、日志分析、进程排查的场景都离不开它。本文系统梳理 grep 的核心用法和常用选项,帮你快速建立完整的知识框架。一、grep 是什么
grep 的全称是 Global Regular Expression Print,即"全局正则表达式打印"。
它的作用很简单:在文件或管道输出中,按行查找包含指定内容的行,并显示出来。
两种基本使用方式:
# 方式一:直接在文件中查找grep '关键字' 文件名# 方式二:通过管道接收其他命令的输出命令 | grep '关键字'
二、核心选项速查
| 选项 | 英文全称 | 作用 |
|---|
-n | line-number | 显示匹配行的行号 |
-v | invert-match | 排除匹配行(取反) |
-i | ignore-case | 忽略大小写 |
-o | only-matching | 只显示匹配到的部分,而非整行 |
-c | count | 统计匹配的行数 |
-w | word-regexp | 精确匹配整个单词 |
-r | recursive | 递归搜索目录下所有文件 |
-l | files-with-matches | 只输出包含匹配的文件名 |
-L | files-without-match | 只输出不包含匹配的文件名 |
-q | quiet | 静默模式,不输出内容,只返回状态码 |
-A N | after-context | 显示匹配行后 N 行 |
-B N | before-context | 显示匹配行前 N 行 |
-C N | context | 显示匹配行前后各 N 行 |
-e | regexp | 指定多个匹配模式 |
-E | extended-regexp | 使用扩展正则表达式 |
-F | fixed-strings | 按固定字符串匹配(不解析正则) |
--include | — | 递归搜索时只匹配指定文件 |
--exclude | — | 递归搜索时排除指定文件 |
三、基础用法详解
1. 基本过滤
在文件中查找包含指定关键字的行:
# 查找 /etc/services 中包含 "http" 的行grep 'http' /etc/services
通过管道过滤其他命令的输出:
# 查看当前系统中是否有 nginx 进程在运行ps -ef | grep 'nginx'
技巧: 用 grep 过滤进程时,结果中会混入 grep 自身的进程。用 grep -v grep 排除它:
ps -ef | grep 'nginx' | grep -v grep
2. 显示行号:-n
查找内容的同时显示所在行号,方便定位:
# 查找 /etc/services 中包含 "ssh" 的行并显示行号grep -n 'ssh' /etc/services
输出示例:
22/tcp # 行号清晰标注在最前面
在排查配置文件问题时,行号能帮你快速定位到需要修改的位置。
3. 忽略大小写:-i
不确定目标内容是大写还是小写时,用 -i 忽略大小写差异:
# 过滤日志中的 "error",不区分大小写# 能同时匹配 Error、ERROR、error 等grep -i 'error' /var/log/messages
4. 排除/取反:-v
有时候你不知道要什么,但明确知道不要什么。-v 可以过滤出不包含指定内容的行:
# 查看 /etc/passwd 中所有可以登录的用户(排除 nologin)grep -v 'nologin' /etc/passwd# 排除空行grep -v '^$' config.txt
5. 只显示匹配内容:-o
默认 grep 显示整行,-o 只输出匹配到的那部分字符串:
# 从日志中只提取 IP 地址grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log
6. 统计匹配次数:-c
只关心匹配了多少行,不需要看具体内容时:
# 统计日志中出现 "Failed password" 的次数grep -c 'Failed password' /var/log/secure
四、选项组合使用
grep 的选项可以自由组合,应对更复杂的场景:
# 忽略大小写 + 显示行号grep -ni 'warning' /var/log/messages# 排除空行 + 排除注释行(以 # 开头)grep -v '^$' nginx.conf | grep-v'^#'# 统计失败登录次数(不区分大小写)grep -ic 'failed password' /var/log/secure
五、进阶用法
1. 上下文显示:-A、-B、-C
查日志时,只看匹配行往往不够,还需要看前后几行才能理解上下文:
# 显示匹配行及其后 3 行(After)grep -A 3 'Exception' app.log# 显示匹配行及其前 5 行(Before)grep -B 5 'OOM' /var/log/syslog# 显示匹配行的前后各 2 行(Context)grep -C 2 'timeout' nginx.conf
排查报错时,-A 用来看错误后面的堆栈信息,-B 用来看错误之前的请求上下文,-C 两头都看。这三个选项在日志分析中使用频率极高。
2. 精确匹配整个单词:-w
避免关键字作为其他单词的一部分被误匹配:
# 不加 -w:搜 "log" 会匹配到 login、catalog、logout 等grep 'log' app.conf# 加 -w:只匹配独立的 "log" 这个单词grep -w 'log' app.conf
3. 递归搜索目录:-r
在整个目录树中查找,排查代码或配置文件时必备:
# 在 /etc/ 下递归查找包含 "AllowUsers" 的文件grep -rn 'AllowUsers' /etc/# 只搜索 .conf 文件grep -rn --include='*.conf''listen' /etc/nginx/# 排除 .log 文件grep -rn --exclude='*.log''password' /var/
--include 和 --exclude 支持通配符,递归搜索时可以精确控制搜索范围,避免在大量无关文件中浪费时间。
4. 只输出文件名:-l / -L
当你只需要知道"哪些文件包含/不包含某内容",而不关心具体匹配行时:
# 找出 /etc/ 下所有包含 "root" 的配置文件grep -rl 'root' /etc/# 找出项目中没有包含 "license" 声明的源文件grep -rL 'license' src/
批量替换前先用 -l 确认受影响的文件范围,是一个良好的操作习惯。
5. 多模式匹配:-e
同时匹配多个关键字(OR 关系),每个关键字用一个 -e 指定:
# 同时过滤 error、warning、criticalgrep -e 'error' -e 'warning' -e 'critical' app.log# 也可以用 -E 的管道符实现同样效果grep -E 'error|warning|critical' app.log
两种写法效果相同,-e 的优势是不需要开启扩展正则,每个模式独立指定。
6. 静默模式:-q
不输出任何内容,仅通过命令的返回值($?)判断是否匹配成功。常用于 Shell 脚本中的条件判断:
# 在脚本中判断服务是否运行if grep -q 'running' /var/run/service.status; thenecho"服务正常"elseecho"服务异常,正在重启..." systemctl restart myservicefi
返回值 0 表示匹配成功,1 表示未匹配,2 表示出错(如文件不存在)。
六、扩展正则与相关工具
扩展正则:-E
基础正则中 +、|、() 等符号需要转义,使用 -E 开启扩展正则可以直接书写:
# 基础正则(需要转义)grep 'error\|warning\|fatal' app.log# 扩展正则(更直观)grep -E 'error|warning|fatal' app.log# 匹配连续数字grep -E '[0-9]+' data.txt
历史上 egrep 等同于 grep -E,fgrep 等同于 grep -F,但这两个命令已不推荐使用,建议直接用 grep -E 和 grep -F。
更快的替代方案:ripgrep
如果你经常需要在大量文件中搜索,推荐了解 ripgrep(rg),它在速度上远超传统 grep,并且默认递归搜索、自动忽略 .gitignore 中的文件:
# 在当前目录递归搜索rg "pattern" ./# 指定文件类型rg --type py "import" ./
七、实用场景汇总
| 场景 | 命令 |
|---|
| 在文件中查找关键字 | grep '关键字' 文件 |
| 过滤进程 | ps -ef \| grep '进程名' \| grep -v grep |
| 查找并显示行号 | grep -n '关键字' 文件 |
| 不区分大小写查找 | grep -i '关键字' 文件 |
| 排除指定内容 | grep -v '不要的内容' 文件 |
| 排除空行和注释 | grep -v '^$' 文件 \| grep -v '^#' |
| 统计匹配行数 | grep -c '关键字' 文件 |
| 只提取匹配部分 | grep -oE '正则' 文件 |
| 多关键字同时匹配 | grep -E '词1\|词2\|词3' 文件 |
| 查看匹配行及上下文 | grep -C 3 '关键字' 文件 |
| 精确匹配单词 | grep -w '单词' 文件 |
| 递归搜索目录 | grep -rn '关键字' 目录/ |
| 递归搜索指定类型文件 | grep -rn --include='*.conf' '关键字' 目录/ |
| 只列出匹配的文件名 | grep -rl '关键字' 目录/ |
| 脚本中条件判断 | if grep -q '关键字' 文件; then ... |
八、小结
grep 是 Linux 文本过滤的基石,核心就三个动作:找什么、在哪找、怎么显示。
基础选项:-n(行号)、-i(忽略大小写)、-v(排除)、-o(只显示匹配)、-c(计数)、-E(扩展正则)。
进阶选项:-A/-B/-C(上下文)、-w(精确单词)、-r(递归搜索)、-l/-L(文件名)、-q(静默判断)、--include/--exclude(文件过滤)。
grep 既能直接操作文件,也能通过管道对接任何命令的输出,灵活性极高。
处理大规模文件搜索时,可以考虑 ripgrep 作为高性能替代。
掌握 grep,就掌握了 Linux 文本处理的第一把钥匙。建议收藏本文,日常使用中反复对照练习,关注我,给你分享更多linux运维技能