首页/系统/Linux 运维命令速查/grep 上下文与提取(-A/-B/-C/-o)
文本处理77 条

grep 上下文与提取(-A/-B/-C/-o)

不只给匹配行:-A/-B/-C 显示前后几行上下文,-o 只抓匹配内容,定位异常时信号更完整。

Linux 运维命令速查系统更新于 2026-10-13

上下文与提取是什么

匹配行本身常常信息不足,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 一起用时,上下文整行与匹配片段会混在一起输出,人难读、脚本也难解析,实际使用中应只保留其中一种。

易错点

  • 多文件搜索时上下文块之间用 -- 分隔,脚本不做处理会把分隔行当作数据
  • -o 与上下文选项混用导致输出结构不一致,后续解析容易出错
  • -C 会给每个匹配都打印上下文,命中密集时输出量成倍增长,先统计匹配数量再决定是否要上下文
  • 在二进制文件上匹配默认只提示 Binary file matches,需要加 -a 才按文本处理

数据来源与参考

  • man 1 grep(GNU grep 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌