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

Mar*_*son 3277 search logging grep command-line-interface

我想要grep一个字符串,但也显示前面的五行和以下五行以及匹配的行.我怎么能这样做?

Pat*_*otz 4356

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

grep -B 3 -A 2 foo README.txt
Run Code Online (Sandbox Code Playgroud)

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

grep -C 3 foo README.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 这很好,但不幸的是Solaris grep不支持它.请参阅solaris的链接:http://www.unix.com/solaris/33533-grep-display-few-lines-before-after.html (54认同)
  • 好的,但如果想在比赛结束后显示_all_输出线怎么办?grep -A0和grep -A-1不会削减它...... (9认同)
  • -n用于行号,但对于某些版本的grep -n#将显示带有行号的#周围行(如-c).当我需要上下文时,这是一个有用的快捷方式. (6认同)
  • 虽然在我的手册页中提到过,但由于某种原因对我不起作用. (2认同)
  • 如果您是HP-UX env,那么所有grep版本都不会像在Solaris中那样工作.能够使用Solaris链接但在该链接中用awk替换nawk. (2认同)
  • @g33kz0r,在这种情况下,您应该单独提问。(尽管有人不厌其烦地在这里回答你,但我为什么...) (2认同)

Stu*_*Stu 600

-A并且-B-C n(对于n上下文行)或仅-n(对于n上下文行)起作用.

  • +1 - `-5`的输入速度比`-A 5 -B 5`快 (253认同)
  • @DeepakMahakale这可能与POSIX程序通常如何解析命令行参数/选项有关。选项说明符是单个字符(例如-A,-B或-C)。通常,选项说明符后跟一个值(“ -o a.out”以在GCC中指定输出文件),但它也可以用作简单的开关/标志(“ -g”以在GCC中启用调试信息)。但是选项之间的空格是可选的,因此对于没有值的选项,可以将它们合并(`-ABC`),这意味着`-15`被解释为`-1 -5`(两个单独的选项),而` -5`会覆盖`-1`。 (7认同)
  • 我尝试了“-n”格式,发现它只能工作到“9”。对于“15”,它返回 5 行 (3认同)
  • -5 比 -A 5 -B 5 都快。它们不能一起使用。如果您选择 -A 或 -B 或 -C 而不是 -9,则脚本的其他读者会更清楚。 (2认同)

elm*_*rco 76

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

  • ack还支持-A -B. (5认同)
  • @MarcZ:确实,grep 比 ack 更可能在默认情况下安装,但 ack 是一个可移植的独立脚本。无需编译它或将其安装在 /usr/bin/ 等系统目录中。一旦下载并放入 $PATH 中列出的目录(及其 eXecute 权限位集),它应该可以立即工作。(无需 sudo 或 root 权限即可开始工作。) (2认同)

dbr*_*dbr 38

grep astring myfile -A 5 -B 5
Run Code Online (Sandbox Code Playgroud)

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

  • "grep astring myfile -C 5"也会这样做 (18认同)
  • 哇,太棒了!A = 之后,B = 之前,C = 上下文 (4认同)

Tus*_*har 21

让我们用一个例子来理解。
\n我们可以使用 grep 和选项:

\n
-A 5  # this will give you 5 lines after searched string.\n-B 5  # this will give you 5 lines before searched string.\n-C 5  # this will give you 5 lines before & after searched string\n
Run Code Online (Sandbox Code Playgroud)\n

例子。\nFile.txt包含6行,以下是操作。

\n
-A 5  # this will give you 5 lines after searched string.\n-B 5  # this will give you 5 lines before searched string.\n-C 5  # this will give you 5 lines before & after searched string\n
Run Code Online (Sandbox Code Playgroud)\n

记住选项的技巧:

\n
    \n
  1. -A \xe2\x80\x83\xe2\x86\x92 A 表示“之后
  2. \n
  3. -B \xe2\x80\x83\xe2\x86\x92 B 表示“ B之前”
  4. \n
  5. -C \xe2\x80\x83\xe2\x86\x92 C 表示“介于两者之间”
  6. \n
\n


Sam*_*ell 19

我通常使用

grep searchstring file -C n # n for number of lines of context up and down
Run Code Online (Sandbox Code Playgroud)

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

man grep
Run Code Online (Sandbox Code Playgroud)

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

info grep
Run Code Online (Sandbox Code Playgroud)


Ros*_*ose 19

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

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

例如:

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7
Run Code Online (Sandbox Code Playgroud)

  • 您在什么系统(包括发行版名称和版本)上尝试过?是默认安装的吗?如果没有,有哪些安装说明?默认情况下,它未安装在 [Ubuntu MATE 20.04](https://en.wikipedia.org/wiki/Ubuntu_MATE#Releases) (Focal Fossa) 上。 (2认同)

Chi*_*nke 12

使用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
Run Code Online (Sandbox Code Playgroud)

  • 哦,我很抱歉Yokai.但是我没有读到关于grep grep的帮助部分来检索答案的任何内容. (7认同)

小智 12

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

grep -5 string file
Run Code Online (Sandbox Code Playgroud)

这相当于:

grep -A 5 -B 5 string file
Run Code Online (Sandbox Code Playgroud)


小智 9

在"/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;
Run Code Online (Sandbox Code Playgroud)


pri*_*ime 7

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

| grep -C 5
Run Code Online (Sandbox Code Playgroud)

或者

| grep -5
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩


ken*_*orb 6

ripgrep

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

rg -C5 "pattern" .
Run Code Online (Sandbox Code Playgroud)

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

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

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


ken*_*orb 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
Run Code Online (Sandbox Code Playgroud)

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

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


JBo*_*one 5

$ grep thestring thefile -5
Run Code Online (Sandbox Code Playgroud)

-5获取5匹配 'thestring' 相当于-C 5or 的上方和下方的行-A 5 -B 5