Inverser regulärer Ausdruck in AWK?

Inverser regulärer Ausdruck in AWK?

Ich versuche, die Zeilen herauszufiltern, die ein bestimmtes Wort enthalten. Der reguläre Ausdruck ist eine Befehlszeileneingabe für das Skript.

$0 ~ regex {
//Do something.
}

Beispieleingabe:

**String** **number**
domain  1
domain  2
bla     3

Aus der obigen Eingabe kann der Benutzer also sagen: „Filtern Sie die Zeilen heraus, die das Wort „Domäne“ enthalten.“

Was ich versucht habe:

regex = "\?\\!domain" 

(negativer Vorausblick).

Aber dieser reguläre Ausdruck filtert jede Zeile heraus. Nicht nur die Zeilen mit dem Wort „Domain“.

Antwort1

Für die gegebene Eingabedatei inputgilt Folgendes:

domain
demesne

So filtern Sie nach Zeilen, die Folgendes enthalten domain:

$ awk '/domain/ { print }' input
domain

So filtern Sie nach Zeilennichtenthalten domain:

$ awk '!/domain/ {print }' input
demesne

Zum Filtern nachFeldAnstatt der gesamten Zeile können wir für die neue inputDatei Folgendes versuchen:

example www.example.com
exemplar www.example.net

Um Zeilen herauszufiltern, bei denen das erste Feldenthält example:

$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net

In Ihrer Frage haben Sie „ $0which is the whole line“ (das ist die gesamte Zeile) und nicht das erste Feld verwendet.

Antwort2

Eine weitere flexiblere/leistungsfähigere Möglichkeit zum Herausfiltern von Zeilen ist {next}:

  • Um alle Zeilen auszudrucken, dienichtmit einem gegebenen übereinstimmen regex, führen Sie Folgendes aus:
    awk '/regex/ {next} {print}' inputfile
    

Mit dieser Methode können Sie sogar alle Zeilen zwischen zwei bestimmten Zeilen herausfiltern, und zwar wie folgt:

  • Um alle Zeilen auszudrucken, diesind nichtGehen Sie zwischen einer übereinstimmenden Zeile regex1und der ersten übereinstimmenden nächsten Zeile wie folgt regex2vor:

    awk '/regex1/,/regex2/ {next} {print}' inputfile
    

    was mit der awk '!/regex/'Methode nicht möglich ist (wenn ich mich nicht irre).

Wenn Ihr Inhalt beispielsweise inputfilewie folgt aussieht:

hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message

Dieser Befehl würde dann awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfileFolgendes ausgeben:

hello, here is my confidential information


This is the end of my message

Antwort3

echo 'hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message' |  

 mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'

 gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'

hello, here is my confidential information


This is the end of my message

verwandte Informationen