grep:显示每个匹配项周围的行

如何grep并显示每个匹配行周围的前5行和后5行?

1370315 次浏览

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

grep -B 3 -A 2 foo README.txt

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

grep -C 3 foo README.txt

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

grep astring myfile -A 5 -B 5

这将grep“myfile”为“astring”,并在每场比赛前后显示5行

-A-B可以工作,-C n(对于n行上下文)也可以,或者只是-n(对于n行上下文……只要n是1到9)。

我通常使用

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

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

man grep

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

info grep

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

/some/file.txt中搜索“17655”,显示前后10行上下文(使用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;

使用grep

$ grep --help | grep -i contextContext 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

这里是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

注意:将ab变量替换为前后的行数。

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

ripgrep

如果您关心性能,请使用#0,它的语法与grep相似,例如:

rg -C5 "pattern" .

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

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

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

$ grep thestring thefile -5

-5让你5行上面和下面的匹配'字符串'相当于-C 5-A 5 -B 5

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

| grep -C 5

| grep -5

应该能成功

我用紧凑的方式做:

grep -5 string file

这相当于:

grep -A 5 -B 5 string file

如果你经常搜索代码,银搜索者AG比grep更高效(即更快)。

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

例如:

ag -C 3 "foo" myFile
line 1line 2line 3line that has "foo"line 5line 6line 7

让我们用一个例子来理解。
我们可以将grep与选项一起使用:

-A 5  # this will give you 5 lines after searched string.-B 5  # this will give you 5 lines before searched string.-C 5  # this will give you 5 lines before & after searched string

<强>例子。File.txt包含6行,以下是操作。

[abc@xyz]~/% cat file.txt # print all file datathis is first linethis is 2nd linethis is 3rd linethis is 4th linethis is 5th linethis is 6th line
[abc@xyz]~% grep "3rd" file.txt # we are searching for keyword '3rd' in the filethis is 3rd line
[abc@xyz]~% grep -A 2 "3rd" file.txt # print 2 lines after finding the searched stringthis is 3rd linethis is 4th linethis is 5th line
[abc@xyz]~% grep -B 2 "3rd" file.txt # Print 2 lines before the search string.this is first linethis is 2nd linethis is 3rd line
[abc@xyz]~% grep -C 2 "3rd" file.txt # print 2 line before and 2 line after the searched stringthis is first linethis is 2nd linethis is 3rd linethis is 4th linethis is 5th line