Dieser Artikel ist Teil der fortlaufenden Reihe von Awk-Tutorial-Beispielen. Awk hat mehrere leistungsstarke eingebaute Variablen. Es gibt zwei Arten von eingebauten Variablen in Awk.
- Variable, die Werte definiert, die geändert werden können, wie z. B. Feldtrennzeichen und Datensatztrennzeichen.
- Variable, die für Verarbeitung und Berichte verwendet werden kann, z. B. Anzahl der Datensätze, Anzahl der Felder.
1. Awk FS Beispiel:Eingabefeld-Trennvariable.
Awk liest und analysiert standardmäßig jede Zeile aus der Eingabe basierend auf Leerzeichen und setzt die Variablen $1, $2 usw. Die Awk FS-Variable wird verwendet, um das Feldtrennzeichen für jeden Datensatz festzulegen. Awk FS kann auf jedes einzelne Zeichen oder jeden regulären Ausdruck gesetzt werden. Sie können das Trennzeichen für Eingabefelder mit einer der beiden folgenden Optionen verwenden:
- Mit der Befehlszeilenoption -F.
- Awk FS kann wie eine normale Variable gesetzt werden.
Syntax: $ awk -F 'FS' 'commands' inputfilename (or) $ awk 'BEGIN{FS="FS";}'
- Awk FS ist ein einzelnes Zeichen oder ein regulärer Ausdruck, den Sie als Trennzeichen für Eingabefelder verwenden möchten.
- Awk FS beliebig oft geändert werden kann, behält es seine Werte, bis es explizit geändert wird. Wenn Sie das Feldtrennzeichen ändern möchten, ist es besser, dies zu ändern, bevor Sie die Zeile lesen. Diese Änderung wirkt sich also auf die Zeile aus, die Sie lesen.
Hier ist ein awk FS-Beispiel zum Lesen der /etc/passwd-Datei mit „:“ als Feldtrennzeichen.
$ cat etc_passwd.awk BEGIN{ FS=":"; print "Name\tUserID\tGroupID\tHomeDirectory"; } { print $1"\t"$3"\t"$4"\t"$6; } END { print NR,"Records Processed"; }
$awk -f etc_passwd.awk /etc/passwd Name UserID GroupID HomeDirectory gnats 41 41 /var/lib/gnats libuuid 100 101 /var/lib/libuuid syslog 101 102 /home/syslog hplip 103 7 /var/run/hplip avahi 105 111 /var/run/avahi-daemon saned 110 116 /home/saned pulse 111 117 /var/run/pulse gdm 112 119 /var/lib/gdm 8 Records Processed
2. Awk OFS-Beispiel:Ausgabefeld-Trennvariable
Awk OFS ist ein Ausgabeäquivalent der awk FS-Variablen. Standardmäßig ist awk OFS ein einzelnes Leerzeichen. Es folgt ein awk-OFS-Beispiel.
$ awk -F':' '{print $3,$4;}' /etc/passwd 41 41 100 101 101 102 103 7 105 111 110 116 111 117 112 119
Concatenator in der print-Anweisung „“, verkettet zwei Parameter mit einem Leerzeichen, das standardmäßig der Wert von awk OFS ist. Der Awk OFS-Wert wird also wie unten gezeigt zwischen die Felder in der Ausgabe eingefügt.
$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd 41=41 100=101 101=102 103=7 105=111 110=116 111=117 112=119
3. Awk RS Beispiel:Record Separator-Variable
Awk RS definiert eine Linie. Awk liest standardmäßig Zeile für Zeile.
Nehmen wir an, Schülernoten werden in einer Datei gespeichert, alle Datensätze werden durch doppelte neue Zeilen getrennt, und alle Felder werden durch ein Zeilenumbruchzeichen getrennt.
$cat student.txt Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 65 Edwin 2537 78 67 45 Dayan 2415 30 47 20
Jetzt druckt das folgende Awk-Skript den Schülernamen und die Rollnummer aus der obigen Eingabedatei.
$cat student.awk BEGIN { RS="\n\n"; FS="\n"; } { print $1,$2; } $ awk -f student.awk student.txt Jones 2143 Gondrol 2321 RinRao 2122 Edwin 2537 Dayan 2415
Im Skript student.awk liest es jedes Schülerdetail als einen einzelnen Datensatz, da awk RS einem doppelten Zeilenumbruchzeichen zugewiesen wurde und jede Zeile in einem Datensatz ein Feld ist, da FS ein Zeilenumbruchzeichen ist.
4. Awk ORS-Beispiel:Datensatztrennvariable ausgeben
Awk ORS ist ein Ausgangsäquivalent von RS. Jeder Datensatz in der Ausgabe wird mit diesem Trennzeichen gedruckt. Es folgt ein awk-ORS-Beispiel:
$ awk 'BEGIN{ORS="=";} {print;}' student-marks Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=
Im obigen Skript wird jeder Datensatz in der Datei mit den Schülernoten durch das Zeichen „=“ getrennt.
5. Awk NR-Beispiel:Anzahl der Datensätze variabel
Awk NR gibt Ihnen die Gesamtzahl der verarbeiteten Datensätze oder die Zeilennummer an. Im folgenden awk NR-Beispiel hat die NR-Variable die Zeilennummer, im END-Abschnitt gibt awk NR die Gesamtzahl der Datensätze in einer Datei an.
$ awk '{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}' student-marks Processing Record - 1 Processing Record - 2 Processing Record - 3 Processing Record - 4 Processing Record - 5 5 Students Records are processed
6. Awk NF Beispiel:Anzahl der Felder in einem Datensatz
Awk NF gibt Ihnen die Gesamtzahl der Felder in einem Datensatz. Awk NF ist sehr nützlich, um zu überprüfen, ob alle Felder in einem Datensatz vorhanden sind.
Sehen wir uns die Datei mit den Schülernoten an, Test3-Punktzahl fehlt für die Schüler, wie unten gezeigt.
$cat student-marks Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 Edwin 2537 78 67 45 Dayan 2415 30 47
Das folgende Awk-Skript gibt die Nummer des Datensatzes (Zeile) und die Anzahl der Felder in diesem Datensatz aus. Es ist also sehr einfach herauszufinden, dass der Test3-Score fehlt.
$ awk '{print NR,"->",NF}' student-marks 1 -> 5 2 -> 5 3 -> 4 4 -> 5 5 -> 4
7. Awk FILENAME Beispiel:Name der aktuellen Eingabedatei
Die Variable FILENAME gibt den Namen der gelesenen Datei an. Awk kann eine Anzahl von zu verarbeitenden Eingabedateien akzeptieren.
$ awk '{print FILENAME}' student-marks student-marks student-marks student-marks student-marks student-marks
Im obigen Beispiel wird der DATEINAME, d. h. die Schülernoten, für jeden Datensatz der Eingabedatei ausgegeben.
8. Awk FNR Beispiel:Anzahl der Datensätze relativ zur aktuellen Eingabedatei
Wenn awk aus der Mehrfacheingabedatei liest, gibt die awk NR-Variable die Gesamtzahl der Datensätze relativ zu allen Eingabedateien an. Awk FNR gibt Ihnen die Anzahl der Datensätze für jede Eingabedatei.
$ awk '{print FILENAME, FNR;}' student-marks bookdetails student-marks 1 student-marks 2 student-marks 3 student-marks 4 student-marks 5 bookdetails 1 bookdetails 2 bookdetails 3 bookdetails 4 bookdetails 5
Wenn Sie im obigen Beispiel anstelle von awk FNR awk NR verwenden, erhalten Sie für die Datei bookdetails 6 bis 10 für jeden Datensatz.
Empfohlene Lektüre
Sed- und Awk-101-Hacks, von Ramesh Natarajan . Ich verbringe mehrere Stunden am Tag in einer UNIX/Linux-Umgebung mit dem Umgang mit Textdateien (Daten-, Konfigurations- und Protokolldateien). Ich verwende Sed und Awk für alle meine Textbearbeitungsarbeiten. Basierend auf meiner Sed- und Awk-Erfahrung habe ich das Sed and Awk 101 Hacks eBook geschrieben, das 101 praktische Beispiele zu verschiedenen erweiterten Funktionen von Sed und Awk enthält, die Ihr UNIX / Linux-Leben verbessern werden. Auch wenn Sie Sed und Awk seit mehreren Jahren verwenden und dieses Buch noch nicht gelesen haben, tun Sie sich bitte einen Gefallen und lesen Sie dieses Buch. Sie werden von den Möglichkeiten der Dienstprogramme Sed und Awk begeistert sein.