在匹配图案之前和之后打印线条
通常 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 中不可用(请参阅 grep
的 POSIX 规范 )。
如果两个或多个匹配行的上下文重叠,则所有行一起打印为一个大上下文。在下面的例子中,5
是 3
和 7
的上下文的一部分:
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