GREP 文本检索实践:从关键词匹配到正则与退出码
这次在 AI 助手协助下完成了华为云学堂的 GREP 实验,练习了文本筛选和正则匹配。整理时发现,最值得记住的不是参数数量,而是三个区别:匹配整行还是输出片段、把输入当字符串还是正则、没有结果还是执行出错。
下面围绕一份小文件说明。它是为本文另外整理的可复现示例,并非实验服务器原始日志;相关命令与输出已在本地 GNU grep 3.0 中独立验证。内容不涉及真实业务数据。
先准备六行文本
在一个练习目录里,把下面内容保存为 grep-demo.txt。这是示例文件名,请避免覆盖已有文件。
INFO start
ERROR disk full
error retry
ERROR ERROR repeated
WARN a.b
WARN axb
grep 默认逐行检查文本,输出包含匹配内容的整行。先查大写的 ERROR,并用 -n 标出行号:
grep -n 'ERROR' grep-demo.txt
实际输出是:
2:ERROR disk full
4:ERROR ERROR repeated
第 3 行的小写 error 没出现,因为默认区分大小写。改用 grep -in 'error' grep-demo.txt 后,第 2、3、4 行都会输出。-i 负责忽略大小写,-n 负责行号,两者可以组合。
正则和字面量要分清
在正则表达式里,点号 . 有特殊含义。如果只是查找文字 a.b,固定字符串模式更直接:
grep -F 'a.b' grep-demo.txt
验证结果只有 WARN a.b,不会把 WARN axb 也选出来。单引号用于保护模式,避免被 shell 提前解释;它不会把 grep 的正则模式自动改成字面量模式。
需要表达“以 ERROR 或 WARN 开头”时,可以明确使用扩展正则:
grep -E '^(ERROR|WARN)' grep-demo.txt
结果是第 2、4、5、6 行。这里 ^ 限定行首,括号把两个候选词组成一组,| 表示二选一。先确定自己需要固定字符串还是正则,再选 -F 或 -E,通常比不断尝试转义字符更清楚。
行数不等于出现次数
grep -c 'ERROR' grep-demo.txt
grep -o 'ERROR' grep-demo.txt
第一条输出 2,统计的是匹配行数。第四行虽然出现两次 ERROR,仍只算一行。第二条只输出匹配到的非空片段,本例会连续输出三行 ERROR。看到计数与直觉不一致时,应先确认自己想数的是行,还是词的出现次数。
没有输出时,也看退出码
本例检索 MISSING 没有输出,退出码为 1;检索 ERROR 有结果,退出码为 0。在 Bash 中应紧跟命令用 echo $? 查看,插入其他命令会改变所检查的状态。
GNU grep 通常用 0 表示选中了行,1 表示没有选中行,2 表示出错。因此,脚本不能把所有非零状态都解释成“文件坏了”。还应留意标准错误中的提示,例如路径或访问权限问题。使用 -q 时另有细节:一旦找到匹配,它可能返回 0,即使同时遇到了错误。
这次实践留下的检查顺序
遇到结果不对,先确认文件路径和内容,再检查大小写、匹配模式,最后核对行数与退出码。保留一份很小的测试文件,可以把问题缩到一条命令上,也便于验证 AI 给出的解释。会运行命令只是第一步,能说清为什么多出或少了一行,才方便把它用于日志排查。
AI 协助说明: 本次云实验在 AI 助手协助下完成;本文由 AI 助手整理撰写,并对上述新增示例执行了独立验证,不代表作者独立手动完成全部操作。
参考资料:GNU grep 官方手册(Regular Expressions、General Output Control、Exit Status 章节)。
- 点赞
- 收藏
- 关注作者
评论(0)