在匹配圖案之前和之後列印線條
通常 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