我的一个脚本将返回如下输出
NameComponent=Apache
Fixed=False
NameComponent=MySQL
Fixed=True
所以在上面的输出中,我试图使用grep grep -vB1 'False'
忽略下面的输出,这似乎不起作用,
NameComponent=Apache
Fixed=False
是否可以使用grep执行此操作,或者使用awk更好的方式...
答案 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”作为第一行。