当前位置:首页>Linux>Linux grep 命令详解:文本过滤必备技能

Linux grep 命令详解:文本过滤必备技能

  • 2026-10-11 12:14:32
Linux grep 命令详解:文本过滤必备技能
grep 是 Linux 中使用频率最高的命令之一,几乎所有涉及文本查找、日志分析、进程排查的场景都离不开它。本文系统梳理 grep 的核心用法和常用选项,帮你快速建立完整的知识框架。

一、grep 是什么

grep 的全称是 Global Regular Expression Print,即"全局正则表达式打印"。

它的作用很简单:在文件或管道输出中,按行查找包含指定内容的行,并显示出来。

两种基本使用方式:

# 方式一:直接在文件中查找grep '关键字'  文件名# 方式二:通过管道接收其他命令的输出命令 | grep '关键字'

二、核心选项速查

选项英文全称作用
-nline-number显示匹配行的行号
-vinvert-match排除匹配行(取反)
-iignore-case忽略大小写
-oonly-matching只显示匹配到的部分,而非整行
-ccount统计匹配的行数
-wword-regexp精确匹配整个单词
-rrecursive递归搜索目录下所有文件
-lfiles-with-matches只输出包含匹配的文件名
-Lfiles-without-match只输出不包含匹配的文件名
-qquiet静默模式,不输出内容,只返回状态码
-A Nafter-context显示匹配行后 N 行
-B Nbefore-context显示匹配行前 N 行
-C Ncontext显示匹配行前后各 N 行
-eregexp指定多个匹配模式
-Eextended-regexp使用扩展正则表达式
-Ffixed-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运维技能

最新文章

随机文章