grep: show lines surrounding each match

grep: show lines surrounding each match

技术背景

在处理文本文件时,我们常常需要查找包含特定字符串的行,并且可能希望查看匹配行周围的上下文信息。grep 是一个强大的文本搜索工具,它可以帮助我们实现这一需求。此外,还有一些类似的工具,如 ripgrepAG the silver searcher 等,它们在性能或功能上各有特点。

实现步骤

使用 grep 显示匹配行前后的内容

对于 BSDGNU grep,可以使用 -B num 设置匹配行之前的行数,使用 -A num 设置匹配行之后的行数。如果希望匹配行前后的行数相同,可以使用 -C num

1
2
3
4
# 显示匹配行前3行和后2行
grep -B 3 -A 2 foo README.txt
# 显示匹配行前后各3行
grep -C 3 foo README.txt

使用 ripgrep 进行高性能搜索

如果注重性能,可以使用 ripgrep,它的语法与 grep 类似。

1
2
# 显示匹配行前后各5行
rg -C5 "pattern" .

使用 AG the silver searcher 进行搜索

AG the silver searcher 也是一个高效的搜索工具,同样可以使用 -C 选项显示上下文。

1
2
# 显示匹配行前后各3行
ag -C 3 "foo" myFile

在不支持 -A-B-C 参数的系统中使用 awk

可以使用 awk 脚本来实现类似的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在 /some/file.txt 中搜索 "17655",显示前后各10行上下文,并输出行号
awk '
/17655/ {
for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
print before[i]
}
print (NR ":" ($0))
a = 10
}
a-- > 0 {
print (NR ":" ($0))
}
{
before[b] = (NR ":" ($0))
b = (b + 1) % 10
}' /some/file.txt;

核心代码

grep 显示上下文代码示例

1
2
# 显示匹配行前2行和后2行
grep -A 2 -B 2 "3rd" file.txt

ripgrep 显示上下文代码示例

1
2
# 显示匹配行前后各5行
rg -C5 "pattern" .

AG the silver searcher 显示上下文代码示例

1
2
# 显示匹配行前后各3行
ag -C 3 "foo" myFile

awk 实现显示上下文代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在 /some/file.txt 中搜索 "17655",显示前后各10行上下文,并输出行号
awk '
/17655/ {
for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
print before[i]
}
print (NR ":" ($0))
a = 10
}
a-- > 0 {
print (NR ":" ($0))
}
{
before[b] = (NR ":" ($0))
b = (b + 1) % 10
}' /some/file.txt;

最佳实践

  • 当处理小文件时,grep 已经足够满足需求。
  • 当处理大文件或需要高性能搜索时,推荐使用 ripgrepAG the silver searcher
  • 在不支持 grep 相关选项的系统中,可以使用 awk 脚本来实现显示上下文的功能。

常见问题

  • 问题grep-C-A-B 选项在某些系统中不支持。
    解决方法:可以使用 awk 脚本来实现类似的功能,如上述的 awk 代码示例。
  • 问题:如何快速记住 grep-A-B-C 选项的含义?
    解决方法:可以记住 -A 表示 “After”,-B 表示 “Before”,-C 表示 “in between”。

grep: show lines surrounding each match
https://119291.xyz/posts/2025-05-09.grep-show-lines-surrounding-each-match/
作者
ww
发布于
2025年5月9日
许可协议