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。在开启遇错即停的脚本里,简单的「没找到」会让脚本直接中断,需要显式处理退出码或调整判断方式。