Erfahren Sie, wie Sie awk -Spezialmuster „Beginnen und Ende“ verwenden - Teil 9

Erfahren Sie, wie Sie awk -Spezialmuster „Beginnen und Ende“ verwenden - Teil 9

In Teil 8 Von dieser AWK -Serie haben wir einige leistungsstarke AWK -Befehlsfunktionen vorgestellt, dh Variablen, numerische Ausdrücke und Zuweisungsoperatoren.

Während wir voranschreiten, werden wir in diesem Segment mehr abdecken Awk Merkmale, und das sind die besonderen Muster: START Und ENDE.

Lernen Sie awk -Muster beginnen und enden

Diese Besonderheiten werden sich als hilfreich erweisen, wenn wir versuchen, weitere Methoden zum Komplex zu erweitern und zu erkunden Awk Operationen.

Lassen Sie uns unsere Gedanken wieder zur Einführung der Einführung des Awk Serie: Denken Sie daran, als wir diese Serie starteten, wies ich darauf hin, dass die allgemeine Syntax eines laufenden Eins ein Awk Befehl ist:

# awk 'Skript' Dateinamen 

Und in der obigen Syntax die Awk Skript hat die Form:

/ Muster/ Aktionen 

Wenn Sie das Muster im Skript betrachten, ist es normalerweise ein regulärer Ausdruck. Zusätzlich können Sie sich Muster auch als spezielle Muster vorstellen START Und ENDE. Deshalb können wir auch eine schreiben Awk Befehl in der folgenden Form:

awk 'begin actions / muster / actions / muster / actionen… . Ende Aktionen 'Dateinamen 

Für den Fall, dass Sie die speziellen Muster verwenden: START Und ENDE in einem (n Awk Skript, das ist es, was jeder von ihnen bedeutet:

  1. Muster beginnen: bedeutet, dass awk die in angegebenen Aktionen ausführt START Einmal vor Eingabezeilen gelesen.
  2. Endmuster: bedeutet, dass awk die in angegebenen Aktionen ausführt ENDE Bevor es tatsächlich verlässt.

Und der Ausführungsfluss des a Awk Befehlskript, das diese speziellen Muster enthält, lautet wie folgt:

  1. Wenn das START Muster wird in einem Skript verwendet, alle Aktionen für START werden einmal ausgeführt, bevor eine Eingabezeile gelesen wird.
  2. Dann wird eine Eingangslinie gelesen und in die verschiedenen Felder analysiert.
  3. Als nächstes wird jede der angegebenen nicht speziell angegebenen Muster mit der Eingangslinie für eine Übereinstimmung verglichen, wenn eine Übereinstimmung gefunden wird, die Aktionen für dieses Muster dann ausgeführt werden. Diese Phase wird für alle angegebenen Muster wiederholt.
  4. Als nächstes werden die Stufe 2 und 3 für alle Eingangsleitungen wiederholt.
  5. Wenn alle Eingabestellen gelesen und behandelt wurden, falls Sie das angeben ENDE Muster, die Aktionen werden ausgeführt.

Sie sollten sich immer an diese Ausführungsequenz erinnern, wenn Sie mit den speziellen Mustern arbeiten, um die besten Ergebnisse in einem zu erzielen Awk Betrieb.

Um alles zu verstehen, lassen Sie uns die Verwendung des Beispiels aus Teil 8 über die Liste der Domänen veranschaulichen Tecmint, wie in einer Datei namens gespeichert Domänen.txt.

Nachricht.Tecmint.Com Tecmint.com Linuxsay.com Windows.Tecmint.Com Tecmint.com Nachrichten.Tecmint.Com Tecmint.com Linuxsay.Com Tecmint.com Nachrichten.Tecmint.Com Tecmint.com Linuxsay.com Windows.Tecmint.Com Tecmint.com 
$ cat ~/domains.txt 
Inhalt der Datei anzeigen

In diesem Beispiel möchten wir die Häufigkeit der Domäne zählen Tecmint.com ist in der Datei aufgeführt Domänen.txt. Deshalb haben wir ein kleines Shell -Skript geschrieben, um dies mithilfe der Idee von Variablen, numerischen Ausdrücken und Zuordnungsoperatoren zu tun, die den folgenden Inhalt haben:

#!/bin/bash für Datei in [E -Mail -geschützt]; tun, wenn [-f $ file]; dann #print out Dateiname echo "Datei lautet: $ file" #print eine Nummer inkrementell für jede Zeile mit Tecmint.com awk '/^tecmint.com/ counter+= 1; printf "%s \ n", Zähler;  '$ file else #print fehlerinformationen infizierung ist keine Datei echo "$ -Datei ist keine Datei. Bitte geben Sie eine Datei an."> & 2 && Beenden 1 FI DEM #TERTEMINATE CRIPT mit Exit -Code 0 im Falle einer erfolgreichen Ausführung Exit 0 

Lassen Sie uns nun die beiden besonderen Muster verwenden: START Und ENDE im Awk Befehl im obigen Skript wie folgt:

Wir werden das Skript ändern:

awk '/^tecmint.com/ counter+= 1; printf "%s \ n", Zähler;  '$ Datei 

Zu:

awk ' START drucken "die Anzahl der Tecmint.com erscheint in der Datei: "; /^tecmint.com/ counter+= 1;  ENDE printf "%s \ n", Zähler;  '$ Datei 

Nachdem die Änderungen an der vorgenommen wurden Awk Befehl, das komplette Shell -Skript sieht jetzt so aus:

#!/bin/bash für Datei in [E -Mail -geschützt]; tun, wenn [-f $ file]; dann #print out Dateiname echo "Datei ist: $ file" #print Die Gesamtzeit ohne Tecmint.com erscheint in der Datei awk ' START drucken "die Anzahl der Tecmint.com erscheint in der Datei: "; /^tecmint.com/ counter+= 1;  ENDE printf "%s \ n", Zähler;  '$ file else #print fehlerinformationen infizierung ist keine Datei echo "$ -Datei ist keine Datei. Bitte geben Sie eine Datei an."> & 2 && Beenden 1 FI DEM #TERTEMINATE CRIPT mit Exit -Code 0 im Falle einer erfolgreichen Ausführung Exit 0 
Awk begin- und ende Muster

Wenn wir das Skript oben ausführen, druckt es zunächst den Speicherort der Datei Domänen.txt, dann ist die Awk Befehlskript wird ausgeführt, wo die START Speziales Muster hilft uns, die Nachricht auszudrucken “Die Häufigkeit, mit der Tecmint.com erscheint in der Datei::”Bevor Eingabestellen aus der Datei gelesen werden.

Dann unser Muster, /^tecmint.com/ wird mit jeder Eingangslinie und der Aktion verglichen, Zähler+= 1; wird für jede Eingangsleitung ausgeführt, wodurch die Häufigkeit zählt Tecmint.com wird in der Datei angezeigt.

Endlich, das ENDE Das Muster druckt die Gesamtzahl der Häufigkeit der Domäne Tecmint.com wird in der Datei angezeigt.

$ ./Skript.sh ~/domains.txt 
Das Skript zum Zählen der Häufigkeitsstring wird angezeigt

Abschließend gingen wir mehr durch Awk Features, die sich auf die Konzepte des besonderen Musters untersuchen: START Und ENDE.

Wie ich bereits erwähnt habe, können diese awk -Funktionen uns helfen, komplexere Textfiltervorgänge zu erstellen. Es gibt noch mehr zu verdecken Awk Funktionen und in Teil 10, Wir werden uns der Idee von awk eingebauten Variablen nähern. Bleiben Sie also in Verbindung.