在匹配前显示所有行

Mar*_*mbo 12 command-line grep text-processing

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

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

例如,而不是:

... | grep -B 10 -- "foo"
Run Code Online (Sandbox Code Playgroud)

我想要:

... | grep -B -- "foo"
Run Code Online (Sandbox Code Playgroud)

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

Qua*_*odo 15

参考

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

  • 使用 GNU sed,还有 `Q` 可以退出而不默认打印匹配的行 (3认同)
  • @MarioPalumbo `perl -pe 'exit if /foo/'`; 类似地`awk'/foo/{exit} 1'` (2认同)

Cyr*_*rus 6

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

sed '0,/foo/!d' file
Run Code Online (Sandbox Code Playgroud)


sch*_*ity 5

sed鉴于file.txt的内容,这是一个解决方案:

bar
baz
moo
foo
loo
zoo
Run Code Online (Sandbox Code Playgroud)

命令包括模式

tac file.txt | sed -n '/foo/,$p' | tac
Run Code Online (Sandbox Code Playgroud)

输出

bar
baz
moo
foo
Run Code Online (Sandbox Code Playgroud)

排除模式

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

bar
baz
moo
Run Code Online (Sandbox Code Playgroud)

  • `tac` 是一个反向的 `cat` ;) (4认同)
  • 哇。我已经断断续续地使用 UNIX(大部分时间是打开的)近 30 年,并且在今天之前从未听说过“tac”。总是有新的东西需要学习。 (2认同)