关于搜索:grep一个文件,但显示几个周围的行?

grep a file, but show several surrounding lines?

我想用grep来表示一个字符串,同时也显示前面的五行和后面的五行以及匹配的行。我怎样才能做到这一点?


对于bsd或gnu grep,您可以使用-B num来设置匹配前的行数,使用-A num来设置匹配后的行数。

1
grep -B 3 -A 2 foo README.txt

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

1
grep -C 3 foo README.txt

这将显示前面的3行和后面的3行。


-A-B将起作用,-C n将起作用(对于n行上下文),或只是-n行上下文…只要n是1到9)。


ACK使用与grep类似的参数,并接受-C。但通常最好是通过代码进行搜索。


1
grep astring myfile -A 5 -B 5

这将使"myfile"变为"astring",并在每次比赛前后显示5行


我通常使用

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

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

1
man grep

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

1
info grep

在/some/file.txt"中搜索"17655",显示前后10行上下文(使用awk),输出前面是行号,后面是冒号。当"grep"不支持"-[acb]"选项时,在Solaris上使用此选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;


使用GRIP

1
2
3
4
5
6
$ 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


ripgrep

如果您关心性能,请使用与grep语法类似的ripgrep,例如。

1
rg -C5"pattern" .

-C, --context NUM - Show NUM lines before and after each match.

还有参数,如-A/--after-context-B/--before-context

这个工具是建立在Rust的Regex引擎之上的,这使得它在大数据上非常有效。


grep有一个名为Context Line Control的选项,您可以使用--contect,简单地说,

1
| grep -C 5

1
| grep -5

应该做这个把戏


1
$grep thestring thefile -5

-5表示在匹配项的上下各5行"theString"等于-c 5或-A 5 -B 5


这是awk中的@ygor解决方案

1
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

注:用前后行数替换ab变量。

对于不支持grep的-A-B-C参数的系统尤其有用。