Verwenden regelmäßiger Ausdrücke in awk

Verwenden regelmäßiger Ausdrücke in awk

Regelmäßige Ausdrücke sind ein leistungsstarkes Werkzeug für die Textverarbeitung in awk. Sie ermöglichen es Ihnen, nach Mustern in einer Textdatei zu suchen und die Daten basierend auf diesen Mustern zu manipulieren. In diesem Artikel werden wir untersuchen.

Grundlagen regelmäßiger Ausdruck

Reguläre Ausdrücke sind Muster, die zu einem bestimmten Satz von Zeichen übereinstimmen. In der folgenden Tabelle werden einige der grundlegenden Metacharacer der regulären Ausdrucksmetacharacer in awk verwendet:

MetacharakterBeschreibung
.Entspricht jedem einzelnen Charakter
[]Entspricht jedem Charakter in den Klammern
^Entspricht dem Beginn einer Linie
$Entspricht dem Ende einer Linie
*Entspricht null oder mehr Vorkommen des vorherigen Charakters
+Entspricht einem oder mehreren Vorkommen des vorherigen Charakters
?Entspricht Null oder einem Auftreten des vorherigen Charakters

AWK bietet zwei integrierte Funktionen für die Verwendung regulärer Ausdrücke: passen() Und sub (). Der passen() Funktion wird verwendet, um das erste Auftreten eines regulären Ausdrucks in einer Zeichenfolge zu finden und sub () wird verwendet, um das erste Auftreten eines regulären Ausdrucks in einer Schnur zu ersetzen. Hier sind einige Beispiele:

Beispiel 1: Einen regulären Ausdruck abgleichen

Angenommen, wir haben eine Datei mit einer Liste von E -Mail -Adressen und möchten alle E -Mail -Adressen finden, die mit enden “.com ”. Wir können die verwenden passen() Funktion, um diese Aufgabe wie folgt zu erfüllen:

awk 'if (match ($ 0, /\.com $/)) print $ 0 'E -Mail.txt
12345awk 'if (match ($ 0, /\.com $/)) print $ 0 'E -Mail.txt

Hier benutzen wir die passen() Funktion zur Suche nach dem regulären Ausdruck /.com $/ (die zu jeder Zeichenfolge entspricht, die mit endet “.com ”) in jeder Zeile der Datei. Wenn eine Übereinstimmung gefunden wird, drucken wir die Linie.

Beispiel 2: Ersetzen eines regulären Ausdrucks

Angenommen, wir haben eine Datei mit einer Liste von Telefonnummern und möchten alle Instanzen von ersetzen "555" mit "666". Wir können die verwenden sub () Funktion, um diese Aufgabe wie folgt zu erfüllen:

awk 'sub (/555/, "666", $ 0) drucken $ 0' Telefon drucken.txt
1234awk 'sub (/555/, "666", $ 0) drucken $ 0' Telefon drucken.txt

Hier benutzen wir die sub () Funktion zur Suche nach dem regulären Ausdruck /555/ (die in jeder Zeile der Datei zu jeder Zeichenfolge übereinstimmt, die „555“ enthält) und ersetzen Sie sie durch "666". Wir drucken dann die modifizierte Zeile.

Erweiterte reguläre Expressionstechniken

Zusätzlich zu den Metacharactremen der regulären Ausdrucksgründen unterstützt AWK mehrere erweiterte reguläre Expressionstechniken, mit denen Sie komplexere Textverarbeitungsaufgaben erledigen können. Diese beinhalten:

1. Gruppierung:

Sie können Teile eines regulären Ausdrucks mit Klammern zusammenarbeiten. Auf diese Weise können Sie einen Quantifizierer auf die gesamte Gruppe anwenden oder bestimmte Teile der übereinstimmenden Zeichenfolge extrahieren.

Angenommen, wir haben eine Datei mit einer Liste von Mitarbeiternamen und Gehältern, und wir möchten die Namen und Gehälter separat extrahieren. Wir können die Gruppierung verwenden, um diese Aufgabe wie folgt zu erfüllen:

awk 'if (match ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, rstart, rlength) halt = substr ($ 0, rstart+Länge (Name) +1 +1 , Länge ($ 0) -RStart-Length (Name)) Druckname Druckgehalt 'Mitarbeiter.txt
12345678awk 'if (match ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, rstart, rlength) halt = substr ($ 0, rstart+Länge (Name) +1 +1 , Länge ($ 0) -RStart-Length (Name)) Druckname Druckgehalt 'Mitarbeiter.txt

Hier verwenden wir die Gruppierung, um den regulären Ausdruck zu entsprechen /^(\ W+) \ S+(\ D+) $ / (der eine Zeile mit einem oder mehreren Wortzeichen enthält, gefolgt von einer oder mehreren Whitespace -Zeichen, gefolgt von einer oder mehreren Ziffern) und den Namen und das Gehalt separat extrahieren.

2. Backreferenzen:

Sie können Backreferenzen verwenden (ich.e., \ 1, \ 2 usw.) sich auf Teile des regulären Ausdrucks beziehen, die von einer Gruppe übereinstimmen,. Auf diese Weise können Sie übereinstimmende Substrings in der Ersatzzeichenfolge wiederverwenden.

Angenommen, wir haben eine Datei mit einer Liste von Telefonnummern im Format (xxx) xxx-xxxx (xxx), und wir möchten das Format in XXX-XXX-XXXX ändern. Wir können Backreferenzen verwenden, um diese Aufgabe wie folgt zu erfüllen:

awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) Drucken $ 0 ' Telefon.txt
1234awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) Drucken $ 0 ' Telefon.txt

Hier verwenden wir Backreferenzen (ich.e., \ 1, \ 2 und \ 3), um auf die drei Gruppen von Ziffern zu verweisen, die mit dem regulären Ausdruck übereinstimmen "/(\ D3) (\ d3) (\ d 3)-(\ d 4)/" (Die eine Telefonnummer im Format (xxx) xxx-xxxx (xxx) übereinstimmt und das Format durch xxx-xxx-xxxx ersetzen.

3. Lookahead und LookBehind:

Sie können Lookahead verwenden (?=)) und schauen Sie aus (?<=) nur dann, wenn sie ein anderes Muster folgen oder von ihnen vorausgehen, um Muster zu entsprechen.

Angenommen, wir haben eine Datei mit einer Liste von URLs, und wir möchten nur die Domainnamen extrahieren (ich.e., der Text zwischen "Http: //" und der nächste "/" Charakter). Wir können Lookahead verwenden und aussehen, um diese Aufgabe wie folgt zu erfüllen:

awk 'if (match ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt
12345awk 'if (match ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt

Hier verwenden wir Lookahead (?<=) dem regulären Ausdruck entsprechen “/((?<=http://)[^/]+/" (was zu allen Charakteren entspricht, die danach kommen "Http: //" und vor dem nächsten "/" Zeichen) und den Domain -Namen extrahieren.

4. Negierte Charakterklassen:

Angenommen, wir haben eine Datei mit einer Liste von E -Mail -Adressen und möchten nur die Adressen extrahieren, die zu einer bestimmten Domäne gehören (e).G., Beispiel.com). Wir können negierte Zeichenklassen verwenden, um diese Aufgabe wie folgt zu erfüllen:

awk 'if (match ($ 0, /^[^@]+@Beispiel \.com $/)) print $ 0 'E -Mails.txt
12345awk 'if (match ($ 0, /^[^@]+@Beispiel \.com $/)) print $ 0 'E -Mails.txt

Hier verwenden wir eine negierte Charakterklasse ([^@]+) Zu den Charakteren passt, die nicht sind "@" und extrahieren Sie den Benutzernamen und stimmen Sie dann der wörtlichen Saite ab "@Beispiel.com ” Um sicherzustellen, dass die Adresse zur angegebenen Domäne gehört.

5. Wechsel:

Angenommen, wir haben eine Datei mit einer Liste von Telefonnummern und möchten nur die Zahlen extrahieren, die entweder im Format "(xxx) xxx-xxxx" oder "xxx-xxx-xxx" enthalten sind. Wir können Wechsel verwenden, um diese Aufgabe wie folgt zu erfüllen:

awk 'if (match ($ 0, /\ (\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) print substr ($ 0, rstart, rlength) 'Telefone.txt
12345awk 'if (match ($ 0, /\ (\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) print substr ($ 0, rstart, rlength) 'Telefone.txt

Hier verwenden wir Wechsel (|) entweder dem regulären Ausdruck zu entsprechen "/(\ D3) (\ d3) (\ d 3)-(\ d 4)/" (die eine Telefonnummer im Format (xxx) xxx-xxxx) oder im regulären Ausdruck entspricht "/(\ D 3)-(\ d 3)-(\ d 4)/" (die mit einer Telefonnummer im Format XXX-XXX-XXXX übereinstimmt).

Abschluss

Regelmäßige Ausdrücke sind ein leistungsstarkes Werkzeug für die Textverarbeitung in awk. Sie ermöglichen es Ihnen, nach Mustern in einer Textdatei zu suchen und die Daten basierend auf diesen Mustern zu manipulieren. Indem Sie regelmäßige Ausdrücke in awk beherrschen, können Sie in Ihren Textverarbeitungsaufgaben effektiver und effizienter werden und komplexe Datenmanipulation mühelos durchführen.