bash grep for string并忽略上面的一行

时间:2017-02-02 04:38:25

标签: bash grep

我的一个脚本将返回如下输出

NameComponent=Apache
Fixed=False
NameComponent=MySQL
Fixed=True

所以在上面的输出中,我试图使用grep grep -vB1 'False'忽略下面的输出,这似乎不起作用,

NameComponent=Apache
Fixed=False

是否可以使用grep执行此操作,或者使用awk更好的方式...

3 个答案:

答案 0 :(得分:1)

<some-command> |tac |sed -e '/False/ { N; d}' |tac
NameComponent=MySQL
Fixed=True

对于匹配"False"的每一行,{}中的代码都会被执行。 N也将下一行带入模式空间,然后在移动到下一行之前删除整个事物。注意:使用多个pipes不被视为良好做法。

答案 1 :(得分:0)

@ Karthi1234:如果您的Input_file与提供的样本相同,请尝试:

awk -F' |=' '($2 != "Apache" && $2 != "False")'   Input_file

首先将字段分隔符作为空格或=然后在此处检查字段2nd的值是否等于sting Apache和False并且没有提到要执行的操作,因此默认打印操作将由awk完成。

编辑:根据OP的请求,以下代码已更改为1,请尝试:

awk '!/Apache/ && !/False/'   Input_file

如果这些不是您想要的,那么您也可以更改字符串,逻辑应该是相同的。

EDIT2:例如 - &gt;您可以根据需要更改string1和string2的值,并根据需要增加条件。

awk '!/string1/ && !/string2/'   Input_file

答案 2 :(得分:0)

如果我正确理解了这个问题,那么在“Fixed = ...”之前总是会有一行,并且当且仅当“Fixed = True”

时才打印两行。

以下awk应该可以解决问题:

< command > | awk 'BEGIN {prev='NA'} {if ($0=="Fixed=True") {print prev; print $0;} prev=$0;}'

请注意,如果第一行是“Fixed = True”,它将打印字符串“NA”作为第一行。