![Inverser regulärer Ausdruck in AWK?](https://rvso.com/image/97228/Inverser%20regul%C3%A4rer%20Ausdruck%20in%20AWK%3F.png)
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 input
gilt 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 input
Datei 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 „ $0
which 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
regex1
und der ersten übereinstimmenden nächsten Zeile wie folgtregex2
vor: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 inputfile
wie 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}' inputfile
Folgendes 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