是否可以将 grep -C 或 -A 或 -B 与排除匹配行的内容结合使用

use*_*910 5 linux grep

因此,使用 grep 我们可以使用 -A 来获取匹配“之后”的行,我们可以使用 -B 获取匹配“之前”的行。我们也可以使用 -C 来获取前后的行。

我有一些这样的数据

boring data
boring data
boring data
interesting value
MARK
boring data
boring data
boring data
interesting value
MARK
Run Code Online (Sandbox Code Playgroud)

我想得到这样的输出:

interesting value
interesting value
Run Code Online (Sandbox Code Playgroud)

使用选项 -BI 得到这个:

# cat somefile | grep -B 1 MARK

interesting value
MARK
interesting value
MARK
Run Code Online (Sandbox Code Playgroud)

我想完全排除 MARK 线。

Fre*_*ddy 10

您可以添加逆grep-v后你的第一个grep

$ grep -B1 --no-group-separator 'MARK' somefile | grep -v 'MARK'
interesting value
interesting value
Run Code Online (Sandbox Code Playgroud)

我添加--no-group-separator了省略匹配之间的分隔线。

  • 一种解决方法是`... | grep '[i]Tunes'` -- 匹配名为“iTunes”的进程,但不匹配 grep 的参数“[i]Tunes” (3认同)

ica*_*rus 8

如果您不依赖于使用grep,那么您可以使用其他工具,例如 awk。

awk '/MARK/ { print saved_line }
     { saved_line=$0 }'
Run Code Online (Sandbox Code Playgroud)

这表示如果该行匹配,则打印保存的行,并在每一行上保存它以备再次需要。