上下文与提取是什么
匹配行本身常常信息不足,grep 的上下文选项正是为此设计:-A N 显示匹配行之后的 N 行、-B N 显示之前的 N 行、-C N 显示前后各 N 行,-o 只输出匹配到的片段而不是整行,-m N 在匹配满 N 行后停止读取。-m 在超大日志上价值明显,因为它满足条件就退出,不必读完整文件,比把输出管道接给 head 更省 IO(后者仍要处理完前面的输出)。多文件搜索时,相邻匹配块之间会用 -- 分隔,这是机器解析输出时必须处理的边界。
基本信息
| 适用平台 | Linux/macOS(GNU grep 与 BSD grep,个别选项 BSD 略有差异) |
|---|---|
| 命令语法 | grep [-A N|-B N|-C N|-o|-m N] 模式 文件 |
| 常用选项 | -A 后 N 行 -B 前 N 行 -C 前后各 N 行 -o 只输出匹配片段 -m 匹配 N 行后停止 -n 显示行号 --color 高亮 |
| 常用组合 | 与 -n、-r、--include、--exclude 搭配使用 |
| 权限说明 | 读取目标文件即可,读系统日志需要 sudo |
典型使用场景
- 异常定位:看到 ERROR 后往前看几行,通常能看到触发原因
- 堆栈分析:抓取异常行前后文,还原调用现场
- 片段提取:用 -o 只取关键词或键值对,便于后续统计
- 大文件采样:用 -m 快速看到前几条匹配,不必读完整文件
- 多文件对比:同一模式在不同文件中的上下文并列查看
常用示例
常用示例
grep -n -C 3 'OutOfMemory' app.log # 前后各 3 行,带行号
grep -B 2 -A 5 'ERROR' app.log | less # 前 2 行后 5 行
grep -o 'duration=[0-9]*ms' app.log | head # 只取匹配片段
grep -m 5 'GET /api' access.log # 匹配满 5 行就停
grep -oP '(?<=user=)[^ ]+' app.log # PCRE 后向断言提取字段值
grep -C2 --color=always 'panic' dmesg.txt # 保留颜色便于人工查看选项与输出对照
| 选项 | 输出内容 | 注意 |
|---|---|---|
| -A N | 匹配行及其后 N 行 | 适合看后续影响与连锁报错 |
| -B N | 匹配行及其前 N 行 | 适合追根因线索 |
| -C N | 前后各 N 行 | 最常用,等价于同时写 -A 与 -B |
| -o | 只输出匹配到的部分 | 带上下文选项时输出结构会混乱,二者选一 |
| -m N | 匹配满 N 行即停止读取 | 超大文件快速采样,显著省 IO |
多文件搜索时不同文件的匹配块之间会插入一行 -- 作为分隔。写脚本解析输出时要跳过分隔行,或用 --no-group-separator 与 --group-separator 自行控制。
-o 与 -A/-B/-C 一起用时,上下文整行与匹配片段会混在一起输出,人难读、脚本也难解析,实际使用中应只保留其中一种。