2017-02-02 2 views
0

Einer meiner Skript wird wie unten Rück Ausgang,bash grep für Streich- und ignorieren über eine Zeile

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

So in der obigen Ausgabe, Ich versuche, die unter Ausgabe mit grep grep -vB1 'False' zu ignorieren, die nicht scheint zu funktionieren ,

NameComponent=Apache 
Fixed=False 

ist es möglich, dies mit grep oder ist eine bessere Möglichkeit mit awk auszuführen ..

Antwort

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

Für jede Zeile, die "False" übereinstimmt, wird der Code in der {} ausgeführt wird. N nimmt die nächste Zeile ebenfalls in den Musterbereich und d löscht dann das Ganze, bevor es zur nächsten Zeile weitergeht. Hinweis: die Verwendung von mehreren pipes gilt nicht als gute Praxis.

0

@ Karthi1234: Wenn Ihr input_file ist die gleiche wie zur Verfügung gestellten Proben versuchen dann:

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

erstmaligen Feldtrenn als Raum oder = dann hier überprüfen, ob Wertefeld 2. ist nicht gleich Apache und Falsch und erwähnte, keine Maßnahmen stechen, so Standard-Druck auszuführende Aktion wird von awk erfolgen .

EDIT: wie pro Antrag des OP folgenden ist der Code ein geändert hat, versuchen:

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

Sie Strings auch in Fall ändern können, wenn diese nicht diejenigen sind, die Sie wollen, Logik gleich sein sollte.

EDIT2: zB -> Sie könnten die Werte von string1 und string2 ändern und die Bedingungen bei Bedarf entsprechend Ihrer Anforderung erhöhen.

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

Aber das Problem ist $ 2 wird variieren. Ich schaue auf generische Weise, indem ich einfach das Schlüsselwort '" False "' benutze. – Karthi1234

+0

@ Karthi1234: Bearbeitete meine Antwort jetzt, bitten Sie, in Ihren Fragen etwas mehr klar zu sein, lassen Sie mich wissen, wenn Sie Fragen dazu haben. – RavinderSingh13

0

Wenn ich die Frage richtig verstanden haben Sie immer eine Zeile vor „Fixed = ...“ und Sie wollen beiden Linien drucken, wenn und nur wenn „Fixed = True“

Die folgenden awk der Trick sollte:

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

Beachten sie, dass, wenn die erste Zeile „Fixed = True“ ist die Zeichenfolge „NA“ als die erste Zeile gedruckt wird.