3861

我想grep换一个字符串,还要显示前五行和后五行以及匹配的行。我怎么能做到这一点?

4

14 回答 14

5116

对于BSDGNU grep,您可以使用-B num设置匹配前的-A num行数和匹配后的行数。

grep -B 3 -A 2 foo README.txt

如果您希望前后行数相同,可以使用-C num.

grep -C 3 foo README.txt

这将显示 3 行之前和 3 行之后。

于 2008-08-12T17:57:43.307 回答
634

-A并且-B可以正常工作-C n(对于n上下文行),或者只是-n(对于n上下文行......只要 n 是 1 到 9)。

于 2008-08-12T17:59:56.080 回答
80

ack使用与 grep 类似的参数,并接受-C. 但通常更适合通过代码进行搜索。

于 2008-09-07T11:13:11.773 回答
42
grep astring myfile -A 5 -B 5

这将为“astring”grep“myfile”,并在每次匹配之前和之后显示 5 行

于 2008-08-12T17:58:00.153 回答
21

我通常使用

grep searchstring file -C n # n for number of lines of context up and down

许多像 grep 这样的工具也有非常棒的 man 文件。我发现自己经常参考grep 的手册页,因为你可以用它做很多事情。

man grep

许多 GNU 工具还有一个信息页面,除了手册页之外,它可能还有更多有用的信息。

info grep
于 2008-08-12T18:42:49.080 回答
16

使用 grep

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM
于 2018-01-12T11:25:38.453 回答
15

ripgrep

如果您关心性能,请使用ripgrep与 具有相似语法的grep,例如

rg -C5 "pattern" .

-C, --context NUM- 在每场比赛前后显示 NUM 行。

还有-A/--after-context-B/等参数--before-context

该工具建立在Rust 的正则表达式引擎之上,这使得它在处理大数据时非常高效。

于 2018-04-11T10:28:35.247 回答
13

/some/file.txt在显示前后 10 行上下文中搜索“17655” (使用Awk),输出前面是行号,后跟一个冒号。grep当不支持这些-[ACB]选项时,在 Solaris 上使用它。

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;
于 2013-10-08T00:21:17.040 回答
12

如果您经常搜索代码,银牌搜索器 AG比 grep 更有效(即更快)。

您可以使用该-C选项显示上下文行。

例如:

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7
于 2020-04-28T17:14:25.193 回答
9

您可以在 grep 命令中使用选项-A(after) 和-B(before)。

尝试grep -nri -A 5 -B 5 .

于 2020-12-30T09:41:18.177 回答
6

这是@Ygor 中的解决方案awk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

注意:用前后的行数替换a和变量。b

它对于不支持 grep 和参数的系统-A特别有用-B-C

于 2018-04-11T10:24:12.747 回答
6

我以紧凑的方式做到这一点:

grep -5 string file

这相当于:

grep -A 5 -B 5 string file
于 2019-12-11T17:24:10.497 回答
5

Grep 有一个名为 的选项Context Line Control,您可以--context在其中简单地使用

| grep -C 5

或者

| grep -5

应该做的伎俩

于 2019-03-11T07:11:40.793 回答
4
$ grep thestring thefile -5

-5让你5在匹配 'thestring' 上方和下方的行等效于-C 5or -A 5 -B 5

于 2019-01-05T18:39:36.197 回答