AWK ist einer der mächtigsten Befehle in Linux. Mit dem Befehl awk können Sie Daten verwalten und Berichte erstellen. Es erlaubt uns auch, logische Operationen, Variablen, Druckfunktionen und vieles mehr zu verwenden. AWK steht für „Aho, Weinberger und Kernighan“ und wird hauptsächlich zum Scannen und Verarbeiten von Mustern verwendet. Es durchsucht eine oder mehrere Dateien, um festzustellen, ob sie Zeilen enthalten, die dem angegebenen Muster entsprechen, und führt dann die zugehörigen Aktionen aus. Es liest aus einer Datei oder von seiner Standardeingabe und gibt es an seine Standardausgabe aus. Für jede Zeile stimmt es mit einem bestimmten Muster in der angegebenen Reihenfolge überein, wenn Übereinstimmungen die entsprechende Aktion ausführen.
Funktionen
• Zeigt eine Textdatei als Datensätze und Felder an
• Es hat Variablen, Bedingungen und Schleifen
• Verfügt über arithmetische und String-Operatoren
• Kann formatierte Berichte erstellen
• Text aus einer Zeichenfolge oder Datei lesen und bearbeiten
In diesem Tutorial werfen wir einen Blick auf den AWK-Linux-Befehl mit Beispielen und sehen, was er kann.
Basix-Syntax von AWK
Die grundlegende Syntax des AWK-Befehls ist unten dargestellt:
awk options program input-file
Nachfolgend finden Sie eine kurze Erläuterung der einzelnen Optionen:
• -F fs :Wird verwendet, um ein Dateitrennzeichen anzugeben.
• -f Datei:Wird verwendet, um eine Datei anzugeben, die ein awk-Skript enthält.
• -v var=Wert :Wird verwendet, um eine Variable zu deklarieren.
Wir verwenden die folgende Textdatei als Eingabedatei für alle Beispiele in diesem Artikel:
cat > contents.txt
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Lassen Sie uns nun den Inhalt der Datei „contents.txt“ mit dem AWK-Befehl überprüfen:
awk '{print}' contents.txt
Dadurch wird der Inhalt der Datei wie unten gezeigt gedruckt:
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Im obigen Beispiel wird kein Muster angegeben, daher wird die gesamte Datei gedruckt.
Drucken Sie nun alle Zeilen aus, die mit dem Muster „Verkäufe“ übereinstimmen:
awk '/sales/ {print}' contents.txt
Dadurch werden alle Zeilen gedruckt, die das Wort „sales“ enthalten, wie unten gezeigt:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
Variablen in AWK
AWK enthält einige eingebaute Variablen, die verwendet werden, um eine Textzeile in einzelne Wörter oder Teile, sogenannte Felder, aufzuteilen. Einige davon sind unten aufgeführt:
• $0 :Wird für die gesamte Zeile verwendet.
• $1 :Wird für das erste Feld verwendet.
• $2 :Wird für das zweite Feld verwendet.
• $n :Wird für das n-te Feld verwendet.
• NR :Wird verwendet, um die Gesamtzahl der aktuellen Datensätze anzugeben.
• NF :Wird verwendet, um die Gesamtzahl der Felder im Datensatz anzugeben.
• FS :Enthält das Feldtrennzeichen und wird verwendet, um Felder in der Eingabezeile zu trennen.
• RS :Speichert das aktuelle Datensatz-Trennzeichen.
• OFS :Es speichert das Ausgabefeld-Trennzeichen und wird verwendet, um die Felder zu trennen, wenn Awk sie druckt.
• ORS :Es speichert das Ausgabedatensatztrennzeichen und wird verwendet, um die Ausgabezeilen zu trennen, wenn Awk sie druckt.
Drucken Sie nun die Felder Nr. 1 und 3 aus der Datei content.txt mit der folgenden Syntax:
awk '{print $1,$3}' contents.txt
Sie sollten nur das erste und dritte Feld der Datei content.txt sehen:
hitesh sales
jayesh account
vyom purchase
bhavesh sales
rajesh sales
niraj account
jay purchase
deep sales
Sie können NR mit dem AWK-Befehl verwenden, um alle Zeilen zusammen mit der Zeilennummer auszugeben:
awk '{print NR,$0}' contents.txt
Ausgabe:
1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
6 niraj clerk account 20000
7 jay peon purchase 23000
8 deep clerk sales 20000
Sie können NF verwenden, um das letzte Feld anzuzeigen, und $1, um das erste Feld anzuzeigen:
awk '{print $1,$NF}' contents.txt
Dies druckt das erste und letzte Feld der Datei content.txt:
hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000
Um die Zeilennummer von 2 bis 5 auszugeben, verwenden Sie die NR-Variable wie unten gezeigt:
awk 'NR==2, NR==5 {print NR,$0}' contents.txt
Ausgabe:
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
Um die Anzahl der Zeilen in der Datei content.txt mit NR zu zählen:
awk 'END { print NR } ' contents.txt
Sie sollten die folgende Ausgabe sehen:
8
BEGIN- und END-Blöcke
Es gibt auch optionale BEGIN- und END-Blöcke, die Befehle enthalten können, die vor bzw. nach der Dateiverarbeitung ausgeführt werden. Der BEGIN-Block wird verwendet, um Aktionen auszuführen, bevor Datensätze verarbeitet werden, während der END-Block verwendet wird, um Aktionen auszuführen, nachdem Datensätze verarbeitet wurden.
Die grundlegende Syntax zur Verwendung von BEGIN- und END-Blöcken mit dem AWK-Befehl ist unten dargestellt:
awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file
Sie können Informationen zu den Feldern drucken, die Sie mit BEGIN- und END-Blöcken drucken.
Das folgende Beispiel druckt die Nachricht vor und nach der Verarbeitung des zweiten Felds jedes Datensatzes in der Datei content.txt:
awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt
Ausgabe:
Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.
Sie können auch die BEGIN- und END-Blöcke verwenden, um die Daten aus der Datei zu transformieren und in eine Tabelle umzuwandeln. Das folgende Beispiel konvertiert die Datei /etc/passwd in eine Tabelle:
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; } {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;} END { print "---------\nFile Complete" }' /etc/passwd
Ausgabe:
User UID GID Home Shell
--------------
root 0 0 /root /bin/bash
daemon 1 1 /usr/sbin /usr/sbin/nologin
bin 2 2 /bin /usr/sbin/nologin
sys 3 3 /dev /usr/sbin/nologin
sync 4 65534 /bin /bin/sync
games 5 60 /usr/games /usr/sbin/nologin
man 6 12 /var/cache/man /usr/sbin/nologin
lp 7 7 /var/spool/lpd /usr/sbin/nologin
mail 8 8 /var/mail /usr/sbin/nologin
news 9 9 /var/spool/news /usr/sbin/nologin
uucp 10 10 /var/spool/uucp /usr/sbin/nologin
proxy 13 13 /bin /usr/sbin/nologin
www-data 33 33 /var/www /usr/sbin/nologin
---------
File Complete
Bedingte Suche
Der AWK-Befehl unterstützt auch mehrere bedingte Anweisungen, darunter if, while-Schleife, for-Schleife und viele mehr. Dies hilft Ihnen, Zeilen abzurufen, die einer bestimmten Bedingung entsprechen.
Das folgende Beispiel verwendet die „if“-Bedingung, um alle Zeilen zu drucken, die „sales“ im dritten Feld enthalten:
awk '{ if ($3 ~ /sales/) print}' contents.txt
Ausgabe:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
Das folgende Beispiel verwendet die "for"-Schleife, um die ersten drei Felder jedes Datensatzes auszugeben, eines pro Zeile.
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
Ausgabe:
hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales
Das folgende Beispiel verwendet die "while"-Schleife, um die ersten beiden Felder jedes Datensatzes auszugeben, eines pro Zeile.
awk '{ i = 1; while ( i <= 2 ) { print $i i++ } }' contents.txt
Ausgabe:
hitesh1
engineer2
jayesh1
director2
vyom1
manager2
bhavesh1
engineer2
rajesh1
directory2
niraj1
clerk2
jay1
peon2
deep1
clerk2
Ausgabe von anderen Befehlen verarbeiten
Sie können auch den AWK-Befehl verwenden, um die Ausgabe des anderen Befehls zu parsen, anstatt einen Dateinamen anzugeben. Der Befehl "ip a" gibt die Informationen über System-IP, Mac-Adresse und andere netzwerkbezogene Informationen aus, wie unten gezeigt:
ip a s wlan0
Ausgabe:
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:bb:58:9c:f5:55 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.3/28 brd 172.20.10.15 scope global wlan0
valid_lft forever preferred_lft forever
inet6 2401:4900:1d71:ef26:8846:95b2:4ca8:aa7d/64 scope global temporary dynamic
valid_lft 600574sec preferred_lft 81574sec
inet6 2401:4900:1d71:ef26:4ebb:58ff:fe9c:f555/64 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::4ebb:58ff:fe9c:f555/64 scope link
valid_lft forever preferred_lft forever
Jetzt können Sie den AWK-Befehl verwenden, um nur die IP-Adresse des Systems wie unten gezeigt zu drucken:
ip a s wlan0 | awk -F '[\/ ]+' '/inet / {print $3}
Sie sollten die folgende Ausgabe sehen:
172.20.10.3
Beispiele für erweiterte AWK-Befehle
Beispiel 1: Mit dem AWK-Befehl können Sie die Zeilen mit einer bestimmten Anzahl von Zeichen drucken. Um beispielsweise Zeilen mit mehr als 27 Zeichen zu drucken, verwenden Sie den folgenden Befehl:
awk 'length($0) > 27' contents.txt
Ausgabe:
jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000
Beispiel 2: Überprüfen Sie den Würfel der angegebenen Zahl
Um den Würfel der angegebenen Zahl bis 5 zu drucken, führen Sie den folgenden Befehl aus:
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
Ausgabe:
Cube of 1 is 1
Cube of 2 is 8
Cube of 3 is 27
Cube of 4 is 64
Cube of 5 is 125
Beispiel 3: Zählen Sie die Anzahl der Zeilen in der angegebenen Datei
Sie können die Anzahl der Zeilen in der angegebenen Datei überprüfen und sie mit dem folgenden Befehl drucken:
awk 'END { print NR }' contents.txt
Ausgabe:
8
Beispiel 4: Finde die längste Zeile in der gegebenen Datei und drucke das Zeichen
Sie können die längste Zeile in der angegebenen Datei finden und das Zeichen dieser Zeile mit dem folgenden Befehl drucken:
awk '{ if (length($0) > max) max = length($0) } END { print max }' contents.txt
Ausgabe
29
Beispiel 5: Sortieren Sie die erste Spalte einer bestimmten Datei
Um die erste Spalte der Datei content.txt zu sortieren und zu drucken, führen Sie den folgenden Befehl aus:
awk -F: '{ print $1 }' contents.txt | sort
Ausgabe:
bhavesh engineer sales 30000
deep clerk sales 20000
hitesh engineer sales 30000
jayesh director account 25000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
vyom manager purchase 20000
Beispiel 6: Drucken Sie die geraden Zeilen
Führen Sie den folgenden Befehl aus, um nur geradzahlige Zeilen in der Datei content.txt zu drucken:
awk 'NR % 2 == 0' contents.txt
Ausgabe:
jayesh director account 25000
bhavesh engineer sales 30000
niraj clerk account 20000
deep clerk sales 20000
Beispiel 7: Ändern Sie das Feldtrennzeichen
Sie können das Feldtrennzeichen von Leerzeichen auf | ändern und drucken Sie es mit dem folgenden Befehl:
awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt
Ausgabe:
hitesh|engineer|sales|30000
jayesh|director|account|25000
vyom|manager|purchase|20000
bhavesh|engineer|sales|30000
rajesh|directory|sales|40000
niraj|clerk|account|20000
jay|peon|purchase|23000
deep|clerk|sales|20000
Schlussfolgerung
In diesem Lernprogramm haben Sie gelernt, wie Sie den AWK-Befehl verwenden, um die angegebenen Muster abzugleichen, und dann die zugehörigen Aktionen ausführen. Ich hoffe, Sie haben eine klare Vorstellung davon, wie Sie mit dem AWK-Befehl Textdateien bearbeiten, formatieren und selektiv drucken können.