所以我尝试将 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]
答案3
作为蹼泳者评论中指出,您的grep -v
命令将在与文本不匹配的每一行之后输出三行This error
。这不是你想要的。
使用标准sed
:
sed '/This error/{ N;N;N; d; }' file
它会查找文件中的文本This error
,当找到该文本时,它还会读取接下来的三行,并删除所有四行。所有其他行均被输出。