显示匹配项之前的所有行

显示匹配项之前的所有行

我想显示匹配项之前的所有行,而不仅仅是 10、7 或 14,如中所述如何在 bash 中获取 grep 结果之前/之后的行?

我该怎么做?匹配的行是否包含并不重要。

例如,而不是:

... | grep -B 10 -- "foo"

我想:

... | grep -B -- "foo"

但是最后的代码不起作用。

答案1

  • 包括这场比赛在内,

    sed '/foo/q' file
    

    最好sed一旦找到匹配项,则立即退出,否则sed将继续读取文件并浪费时间,这对于大文件来说将是相当可观的。

  • 除了比赛之外,

    sed -n '/foo/q;p' file
    

    -n标志表示只p打印到达命令的行。由于该foo行触发了quit 操作,因此它未到达p,因此不会被打印。

    • 如果你sed是 GNU 的,这可以简化为

      sed '/foo/Q' file
      

参考

  1. /foo/地址
  2. qp常用命令
  3. QGNU Sed 扩展命令
  4. -n命令行选项

答案2

使用 GNU sed。打印所有行,从第一行到包含所需字符串的行。

sed '0,/foo/!d' file

答案3

以下是使用 的解决方案sed,给定 file.txt 的内容:

bar
baz
moo
foo
loo
zoo

包含模式的命令

tac file.txt | sed -n '/foo/,$p' | tac

输出

bar
baz
moo
foo

排除模式

tac file.txt | sed -n -e '/foo/,$p' | tac | sed -n '/foo/!p'

bar
baz
moo

答案4

FreeBSD(包括MacOS)版本确实有这样的功能。

效果很好-B -1,它显示文件开头匹配项之前的所有行。

... | grep -B -1 -- "foo"

同样-A -1,它显示匹配之后到文件末尾的所有行。

... | grep -A -1 -- "foo"

对某些人来说可能有用,但它不适用于 Ubuntu 中包含的 GNU 实现。

相关内容