grep一个文件,但显示几行?


3414

我想grep输入一个字符串,但还要显示前五行和后五行以及匹配的行。我将如何做到这一点?


3
为此,我保留了Brendan Gregg的perl脚本的副本。效果很好。
Ethan Post

6
有关在Solaris上有效的解决方案,请查看此链接
jahroy

106
man grep | grep -C 1 context:)
StvnW 2015年

20
man grep | grep -C 1 "\-C";)
Anders B

9
@StvnW ...我不知道是否要调用该元数据(在更一般的情况下,而不是在SO上下文中),或如何调用它。您通过显示如何使用答案来找到答案来回答问题。
bballdave025 '18

Answers:


4531

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

grep -B 3 -A 2 foo README.txt

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

grep -C 3 foo README.txt

这将在前面显示3行,在后面显示3行。


56
很好,但是很遗憾,Solaris grep不支持该功能。请参阅链接对于Solaris:unix.com/solaris/33533-grep-display-few-lines-before-after.html
рüффп

9
好的,但是如果要在比赛后显示所有输出行怎么办?grep -A0和grep -A-1不要剪掉...
g33kz0r11年

2
尽管在我的手册页中有所提及,但由于某种原因对我不起作用。
HayriUğurKoltuk'8年

2
如果您是HP-UX env,则所有grep版本都无法像在Solaris中那样工作。能够使用Solaris链接,但在该链接中将awk替换为nawk。
zkarthik

6
-n用于行号,但是对于某些版本的grep -n#将显示#个带有行号的环绕行(如-c)。这是一个有用的快捷方式,当我需要上下文时,这是我的首选。
Anthony DiSanti

607

-A并且-B-C n(对于n上下文行)或仅-n(对于n上下文行...只要n为1到9)都可以工作。


我尝试了这种-n格式,发现它只能工作到9。因为15它返回了5条线
Deepak Mahakale

7
@DeepakMahakale这可能与POSIX程序通常如何解析命令行参数/选项有关。选项说明符是一个字符(例如-A-B-C)。通常,选项说明符后跟一个值(-o a.out在GCC中指定输出文件),但它也可以用作简单的switch /标志(-g在GCC中启用调试信息)。但是选项之间的空格是可选的,因此对于没有值的选项,可以将它们合并(-ABC),这意味着将对其-15进行解释-1 -5(两个单独的选项)并-5覆盖-1
natiiix

1
-5比-A 5 -B 5都快。如果您选择-9以上的-A或-B或-C,则对于脚本的其他读者来说更干净。
埃里克·阿尔丁格

76

ack使用与grep类似的参数,并接受-C。但是通常通过代码搜索会更好。


5
ack还支持-A -B。
2016年

在许多方面,Ack都比grep好。使用更简单的语法可以更快。
chim

1
grep的优点是可以在许多系统上默认安装。
Marc Z

1
@MarcZ:的确,默认情况下,与ack相比,grep更有可能被安装,但是ack是可移植的独立脚本。无需编译它或将其安装在/ usr / bin /等系统目录中。一旦将其下载并放入$ PATH中列出的目录(及其eXecute权限位置1),它应立即运行。(无需sudo或root特权即可获得工作许可。)
JL

这个问题是关于grep,不确定使用它来“做广告” ack(确实是一个很好的工具)是一个好主意……
MonsieurDart

39
grep astring myfile -A 5 -B 5

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


19
“ grep astring myfile -C 5”将执行相同操作
Syed Siraj Uddin

20

我通常使用

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

许多工具(例如grep)也具有非常好的man文件。我发现自己经常参考grep的手册页,因为您可以做很多事情。

man grep

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

info grep

13

使用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

您没有阅读已接受的答案吗?您只是在重复已经将近10年的一个问题上已经说过的话...
Yokai

7
哦,对不起洋海。但是我什么都没有读到grep的grep帮助部分来检索答案。
Chiel 10 Brinke

1
@Yokai除了Chiel十Brinke所说的外,接受的答案没有提到长选项
user3738870

10

在“ /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;

7

ripgrep

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

rg -C5 "pattern" .

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

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

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


5

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

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

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


4
$ grep thestring thefile -5

-5使您5在匹配“ thestring”上下的行等于-C 5-A 5 -B 5


4

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

| grep -C 5

要么

| grep -5

应该做的把戏


1

我用做紧凑的方式

grep -5 string file

那相当于

grep -A 5 -B 5 string file

0

如果您经常搜索代码,则银级搜索程序比grep效率更高(即更快)。

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

例如:

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.