在匹配图案之前和之后打印线条

通常 grep 只打印匹配的行。在下面的例子中,seq 9 生成一个从 1 到 9 的数字列表,每行一个,grep 打印一个匹配的行:

seq 9 | grep 5
# 5

除了匹配的行本身之外,-C n 选项(或长形式的 --context=n)在每个匹配行之前和之后打印 n 行:

seq 9 | grep -C 2 '5'
# 3
# 4
# 5
# 6
# 7

当然,如果达到文件结尾或文件开头,将会打印少于 n 的行。

如果我们只想在之前或之后打印线,而不是两者,我们可以使用 -B n--before-context=n)或 -A n--after-context=n):

seq 9 | grep -B 2 '5'
# 3
# 4
# 5

seq 9 | grep -A 2 '5'
# 5
# 6
# 7

请注意,这些选项在 POSIX 中不可用(请参阅 grepPOSIX 规范 )。

如果两个或多个匹配行的上下文重叠,则所有行一起打印为一个大上下文。在下面的例子中,537 的上下文的一部分:

seq 9 | grep -E --context=2 '3|7'
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

但是,如果上下文不重叠,则使用组分隔线打印出它们。默认情况下,这是双连字符(--):

seq 9 | grep -E --context=2 '2|8'
# 1
# 2
# 3
# 4
# --
# 6
# 7
# 8
# 9

我们可以使用 --group-separator=SEP 选项设置不同的组分隔线,或者使用 --no-group-separator 选项完全禁止此行:

seq 9 | grep -E --context=0 --group-separator='****' '2|8'
# 2
# ****
# 8

seq 9 | grep -E --context=0 --group-separator='' '2|8'
# 2
# 
# 8

seq 9 | grep -E --context=0 --no-group-separator '2|8'
# 2
# 8

最后,如果我们选择 -v 选项来打印不匹配的行,则会围绕这些行提供上下文:

seq 9 | grep -E -v '1|3|4|5|6|7|9'
# 2
# --
# 8

seq 9 | grep -E -v -C 1 '1|3|4|5|6|7|9'
# 1
# 2
# 3
# --
# 7
# 8
# 9