Grep 不能同时使用 -v 和 -A/B

Grep 不能同时使用 -v 和 -A/B

所以我尝试将 grep 与 -v 参数和 -A 参数一起使用。

所以我的文件有这样的文本:

This error
-this
-this
-that
[text I want]
This error
-asd
-asfag
-adsfhs
[text I want]
[text I want]
This error
-asdgsda
-asdgg
-gasdg

经过尾部之后,我发现这个日志文件充满了相同的内容,This error后跟 3 行构造,我可以使用 轻松找到它们grep -A3 'This error',这显示了错误及其后面的 3 行。

但我想看到除此之外的所有内容,因此使用 -v 参数,但它不起作用。当我grep -v -A3 'This error'这样做时,它会返回整个文件,就像 grep 根本不起作用一样。

这里有什么问题?

答案1

如果您可以使用sed代替grep,它提供了一个很好的解决方案:

sed -e '/This error/,+3d' myfile

这将删除包含该字符串的行This error和以下三行,但输出其他所有内容。该sed命令需要GNU sed+3地址是扩展名)。

答案2

您可以使用pcregrep

pcregrep -vM  'This error\n.*\n.*\n.*' file

它将给出输出:

[text I want]
[text I want]
[text I want] 

参考https://stackoverflow.com/q/2686147/9235408

答案3

作为蹼泳者评论中指出,您的grep -v命令将在与文本不匹配的每一行之后输出三行This error。这不是你想要的。

使用标准sed

sed '/This error/{ N;N;N; d; }' file

它会查找文件中的文本This error,当找到该文本时,它还会读取接下来的三行,并删除所有四行。所有其他行均被输出。

相关内容