首页 > 解决方案 > 一起使用 grep -A 和 -v 开关

问题描述

grep -v反转匹配,以便我可以从输入/文件中排除行。

如果模式匹配,是否可以排除两行?

printf "foo\nbar\nbaz\n" | grep -A1 -v foo

不起作用。我希望这段代码只输出baz,但它输出

bar
baz

标签: parsinggrep

解决方案


,-A和标志导致为满足搜索条件-B-C每一行打印指定数量的上下文行。当您使用-v时,搜索条件是反转的,因此所选行是那些与模式不匹配的行。因此,grep -A1 -v foo打印所有不包含foo的行,以及不包含的行之后的行foo

我知道这不是您要寻找的,但它grep是指定的工作方式。据我所知,没有选项可以在模式匹配后抑制线条的打印。

但是,使用以下方法很容易完成这一壮举awk

awk '/foo/{c=2} c{c--;next;} 1'

请注意,awk使用 Posix 扩展正则表达式,例如grep -E. 正则表达式必须用斜杠包围,这意味着您需要反斜杠转义任何需要匹配的斜杠。除此之外,它将与grep.


推荐阅读