2017-02-02 73 views
0

我的一個腳本將返回如下輸出,bash的grep的字符串,而忽略上面一行

NameComponent=Apache 
Fixed=False 
NameComponent=MySQL 
Fixed=True 
在上面的輸出

所以,我想用grep grep -vB1 'False'這似乎不工作忽略了下面的輸出,

NameComponent=Apache 
Fixed=False 

是否可以執行此用grep或者是使用awk沒有更好的方法..

回答

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

對於匹配"False"的每一行,{}中的代碼被執行。 N也將下一行放入模式空間中,然後在刪除所有內容之前先移動到下一行。注意:使用多個pipes不被視爲良好做法。

0

@ Karthi1234:如果您INPUT_FILE是一樣的提供的樣品然後嘗試:

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

首先製造領域分隔符,空格或=然後在這裏檢查,如果場第2的值不等於蜇Apache和虛假,並提到沒有要執行的操作,從而默認的打印操作將通過AWK完成。

編輯:爲每個操作的要求以下是更改代碼,請嘗試:

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

你可以在情況發生變化的字符串太多,如果這些都不是你想要的,邏輯應該是一樣的。

EDIT2:例如 - >您可以更改string1和string2的值,並根據需要增加條件(如果需要)。

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

但問題是$ 2會保持不同。我只是使用關鍵字'「False」來尋找一些通用的方法。 – Karthi1234

+0

@ Karthi1234:現在編輯我的答案,要求您在問題中更加清楚,讓我知道您是否有任何疑問。 – RavinderSingh13

0

如果我理解正確的問題,你將永遠有前行「固定= ...」,你要同時打印線當且僅當「固定=真」

以下awk應該做的伎倆:

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

注意,如果第一行是「固定=真」,它將打印字符串「NA」作爲第一行。