在匹配圖案之前和之後列印線條

通常 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