grep 基础与扩展正则的差异
grep 默认使用基础正则,分组、量词与交替都需要转义;加选项切到扩展正则后这些写法可以直接使用,同时一些原本是字面量的字符需要转义。另一层容易被忽略的语义是:grep 的匹配单位是行,只要行内出现符合模式的内容就算命中,想要整行相符必须显式指定。
基本信息
| 默认语法 | 基础正则,分组、量词与交替需要转义 |
|---|---|
| 扩展语法 | 扩展正则,上述写法直接可用,字面量反而需要转义 |
| 固定字符串 | 按字面文本查找,不做正则解释,速度最快 |
| 匹配单位 | 以行为单位的部分匹配,整行相符需显式声明 |
典型使用场景
- 日志筛选:按关键字与状态码筛选行,配合计数统计出现次数
- 端口与进程检查:从长输出中挑出关注的行,再用字段截取进一步处理
- 配置审查:查找未注释的有效配置行,需要区分行首注释符
- 批量替换前的预检:先统计命中行数,确认影响范围再执行改写
- 脚本可移植性:写进脚本的规则要避免依赖单一实现的扩展语法
写法对照与常用选项
写法对照与常用选项
grep 'error' app.log # 基础用法:行内含关键字即命中
grep -E 'error|fatal' app.log # 扩展正则:交替直接写
grep 'error\|fatal' app.log # 基础正则下用转义表达交替
grep -F 'a.b' file # 固定字符串查找,只匹配字面的 a 点 b
grep -c -w 'timeout' app.log # 计数并按整词匹配
grep -x 'OK' result.txt # 整行必须完全相符
grep -n -A2 'ERROR' app.log # 显示行号并附带匹配行的后两行
grep -r --include='*.conf' 'listen' /etc/ # 递归并在指定文件类型中查找语法与常用选项
| 项目 | 基础正则 | 扩展正则 |
|---|---|---|
| 分组 | 需要转义 | 直接写括号 |
| 交替 | 需要转义竖线 | 直接写竖线 |
| 量词加号与问号 | 需要转义(部分实现提供扩展) | 直接写 |
| 区间量词 | 需要转义大括号 | 直接写大括号 |
| 字面加号 | 直接写 | 需要转义 |
常见实现为基础正则额外提供了未转义的加号、问号与竖线等扩展写法,看起来可以省掉切换语法的选项,但这些属于实现扩展;换到其他系统或精简环境上可能失效,脚本里显式选择语法更稳妥。
批量替换或删除前先用计数选项确认命中行数:行级部分匹配很容易超出预期范围,先看数量再看样本是最省事的习惯。