grep上下文参数可精准控制显示范围:-A显示匹配行后N行,-B显示前N行,-C显示前后各N行(等价于-A N -B N),-C N实际输出最多2N+1行,且自动处理文件边界。

直接用 grep 的上下文参数就行,不用额外工具或脚本。
grep -A 和 -B 用来精确控制前后行数
想看匹配行之后的几行,用 -A;想看之前的几行,用 -B。这两个参数互不干扰,可以单独用,也能组合用。
-
grep -A 3 "error" app.log:输出所有含error的行,以及每行后面紧跟着的 3 行 -
grep -B 2 "timeout" network.log:输出所有含timeout的行,以及每行前面的 2 行 -
grep -A 1 -B 1 "panic" kernel.log:等价于只看匹配行的“前 1 行 + 自己 + 后 1 行”,共 3 行
注意:-A 和 -B 的数字是“额外追加的行数”,不是总行数。比如 -A 0 就只输出匹配行本身。
grep -C 是最常用的上下文快捷写法
-C(或简写为 -数字)一次性指定前后各多少行,适合快速调试日志。
-
grep -C 5 "OOM" dmesg.log:每处匹配都输出前后各 5 行,共 11 行 -
grep -10 "segmentation fault" core.log:效果和-C 10完全一样,是 POSIX 兼容的简写形式 - 如果文件里连续多行都匹配同一个模式,
-C会合并上下文——比如两处匹配相隔不到 10 行,中间部分不会重复打印
别误以为 -C 5 是“总共显示 5 行”;它明确指“前 5 + 自己 + 后 5”,实际最多 11 行。
实际查日志时容易漏掉的边界问题
上下文参数对文件开头/结尾的处理很实在,但新手常忽略这点:
- 匹配行在文件第一行时,
-B 5不会报错,只是安静地少输出——前面根本没 5 行可取 - 同样,最后一行匹配时,
-A 5也只会输出存在的后续行(可能 0~5 行) - 如果用
grep -C 100查关键词,结果太大无法滚动查看,建议配合less:grep -C 100 "abc" big.log | less -N -
grep默认不按行号排序输出,多个匹配块之间顺序就是它们在原文件里的物理顺序
真正麻烦的是二进制文件或含控制字符的日志——grep 可能提前截断上下文,这时加 -a 强制当文本处理更稳妥。


















