命令与包管理65 条

grep 文本搜索

在文件与目录中做正则搜索:-r 递归、-E 扩展正则、-i 忽略大小写、-v 反向过滤,-A/-B/-C 看上下文;排障查配置与日志的日常工具。

信创系统运维速查系统更新于 2026-10-13

grep 是什么

grep 按行做文本匹配,是查配置、翻日志、筛命令输出最常用的工具。默认按基本正则匹配,加 -E 用扩展正则,-r 递归目录,-i 忽略大小写,-v 反向保留不匹配的行,-A、-B、-C 看命中行的上下文。它的定位是「在已知的文本里找证据」,所以常和 find、journalctl、systemctl 的输出串成管道使用。麒麟 V10、UOS、openEuler 预装的都是 GNU grep,选项完全一致。

基本信息

所属GNU grep,各 Linux 发行版通用
语法grep [选项] 模式 [文件或目录...]
正则模式默认基本正则,-E 扩展正则,-F 固定字符串
递归与过滤-r 递归,--include 限定文件类型
上下文-A 后若干行,-B 前若干行,-C 前后各若干行
退出码0 有匹配,1 无匹配,2 出错

典型使用场景

  • 确认配置实际取值:从配置目录里查出关键指令,排除被注释掉的行
  • 日志排障:在服务日志里搜错误关键字,配合上下文看清前后经过
  • 过滤命令输出:把 systemctl、ss、rpm 的输出收窄到关心的部分
  • 批量核对:在多台机器或整套配置文件里查找某个地址或参数
  • 反向筛选:剔掉注释行与空行,得到真正生效的配置内容
  • 脚本判断:只看退出码判断是否存在匹配,不关心具体内容

典型用法

典型用法
grep -rn 'Listen' /etc/nginx --include='*.conf'   # 递归搜配置并限定文件类型
grep -iE 'error|fail' /var/log/messages | tail    # 忽略大小写搜多种关键字
grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'  # 剔掉注释与空行看生效配置
grep -n 'PermitRootLogin' /etc/ssh/sshd_config    # 带行号便于定位
journalctl -b --no-pager | grep -i 'oom' | head   # 在日志输出里二次过滤
grep -c 'Failed password' /var/log/secure        # 只统计匹配行数

常用选项读法

选项作用使用提示
-r递归搜索目录配合 --include 限定文件类型
-n显示行号改配置前定位用
-i忽略大小写搜关键字时避免漏结果
-v反向匹配剔注释行、排除已知噪声
-E扩展正则支持 | 与 + 等写法
-c只输出匹配行数做统计与巡检判断
-A/-B/-C显示上下文排障时看清前后经过
在大目录里做全文搜索时,速度与体验都不如 ripgrep:后者默认跳过版本库目录与二进制文件,输出更干净。日常在仓库或源码目录里搜文本,优先用 rg,grep 更适合快速核对单个文件与管道过滤。
grep 的退出码是脚本里的常见坑:没有匹配时返回 1,出错时返回 2。在开启遇错即停的脚本里,简单的「没找到」会让脚本直接中断,需要显式处理退出码或调整判断方式。

易错点

  • 搜二进制文件时只提示存在匹配却不显示内容,需要按文本强搜或明确排除二进制,否则会以为搜到却没证据
  • 管道里 grep 无匹配返回非零退出码,在严格模式的脚本中会中断流程,属于高频误伤
  • 正则写法与所用模式不匹配:用了扩展语法却没开对应选项,匹配结果与预期南辕北辙
  • 只搜关键字不看上下文:关键字出现在注释或示例里,据此改配置会改错地方

数据来源与参考

  • GNU grep 手册
  • 运维实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌