题 grep一个文件,但显示几个周围的行?


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


2756
2017-08-12 17:55


起源


我保留一份副本 Brendan Gregg的perl剧本 为此目的。效果很好。 - Ethan Post
有关适用于Solaris的解决方案,请查看 这个链接。 - jahroy
man grep | grep -C 1 context :) - StvnW
man grep | grep -C 1 "\-C" ;) - Anders B


答案:


对于 BSD 要么 GNU  grep 您可以使用 -B num 设置匹配前的行数和 -A num 对于匹配后的行数。

grep -B 3 -A 2 foo README.txt

如果您想要使用之前和之后需要相同数量的行 -C num

grep -C 3 foo README.txt

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


3679
2017-08-12 17:57



这很好,但不幸的是Solaris grep不支持它。查看solaris的链接: unix.com/solaris/33533-grep-display-few-lines-before-after.html - рüффп
好的,但如果想表现出来的话 所有 比赛结束后的输出线? grep -A0和grep -A-1不会削减它...... - g33kz0r
虽然在我的手册页中提到过,但由于某种原因对我不起作用。 - Hayri Uğur Koltuk
如果您是HP-UX env,那么所有grep版本都不会像在Solaris中那样工作。能够使用Solaris链接但在该链接中用awk替换nawk。 - zkarthik
-n用于行号,但对于某些版本的grep -n#将显示带有行号的#周围行(如-c)。当我需要上下文时,这是一个有用的快捷方式。 - Anthony DiSanti


-A 和 -B 将会有效 -C n (对于 n 上下文)或者只是 -n (对于 n 上下文)。


520
2017-08-12 17:59



+1 - -5 比键入更快 -A 5 -B 5 - mouche


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


66
2017-09-07 11:13



ack还支持-A -B。 - Shuo
Ack在很多方面都比grep好。语法更简单,速度更快。 - chim


grep astring myfile -A 5 -B 5

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


32
2017-08-12 17:58



“grep astring myfile -C 5”也会这样做 - Syed Siraj Uddin


我通常使用

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

许多像grep这样的工具也有很棒的man文件。我发现自己指的是 grep的手册页 很多,因为你可以做很多事情。

man grep

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

info grep

16
2017-08-12 18:42





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

8
2017-10-08 00:21





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

5
2018-01-12 11:25



你没看过接受的答案吗?你只是重复已经在一个差不多10年的问题上所说的话...... - Yokai
哦,对不起,我很抱歉。但是我没有读到关于grep grep的帮助部分来检索答案的任何内容。 - Chiel ten Brinke


ripgrep

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

rg -C5 "pattern" .

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

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

该工具建立在 Rust的正则表达式引擎 这非常 高效 关于大数据。


2
2018-04-11 10:28





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


0
2018-04-11 10:24