Awk-Befehl unter Linux

AWK ist einer der mächtigsten Befehle in Linux. Mit dem Befehl awk können Sie Daten verwalten und Berichte erstellen. Es ermöglicht uns auch, logische Operationen, Variablen, Druckfunktionen und vieles mehr zu verwenden. AWK steht für “Aho, Weinberger and Kernighan” und wird hauptsächlich zum Scannen und Bearbeiten 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 ihrer Standardeingabe und gibt sie auf ihre Standardausgabe aus. Für jede Zeile stimmt sie mit dem angegebenen Muster in der angegebenen Reihenfolge überein, wenn Übereinstimmungen die entsprechende Aktion ausführen.

Merkmale

• Zeigt eine Textdatei als Datensätze und Felder an
• Es hat Variablen, Bedingungen und Schleifen
• Hat 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 tun 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 file : Wird verwendet, um eine Datei anzugeben, die ein awk-Skript enthält.
• -v var=Wert: Wird verwendet, um eine Variable zu deklarieren.

Als Eingabedatei für alle Beispiele in diesem Artikel verwenden wir folgende Textdatei:

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

In obigem example, es wird kein Muster angegeben, sodass die gesamte Datei gedruckt wird.

Drucken Sie nun alle Zeilen aus, die dem Muster “Sales” entsprechen:

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 integrierte Variablen, die verwendet werden, um eine Textzeile in einzelne Wörter oder Teile, die Felder genannt werden, zu unterteilen. Einige von ihnen sind unten gezeigt:

• $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 unterteilen.
• RS : Speichert das aktuelle Datensatztrennzeichen.
• OFS : Speichert das Ausgabefeldtrennzeichen und wird verwendet, um die Felder zu trennen, wenn Awk sie druckt.
• ORS : Speichert den Ausgabesatztrenner 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 zu drucken:

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

Dadurch wird das erste und letzte Feld der Datei content.txt gedruckt:

hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000

Um die Zeilennummer von 2 bis 5 zu drucken, 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 dem 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 die Datensätze verarbeitet wurden.

Die grundlegende Syntax für die Verwendung von BEGIN- und END-Blöcken mit dem AWK-Befehl ist unten dargestellt:

awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file

Mit den Blöcken BEGIN und END können Sie Informationen zu den Feldern drucken, die Sie drucken.
Die folgende example 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 Blöcke BEGIN und END verwenden, um die Daten aus der Datei zu transformieren und in eine Tabelle zu konvertieren. Die folgende example konvertiert die Datei /etc/passwd in eine Tabelle:

awk 'BEGIN { FS=":"; print "UserttUIDttGIDttHomettShelln--------------"; } {print $1,"tt",$3,"tt",$4,"tt",$6,"tt",$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, einschließlich if, while-Schleife, for-Schleife und viele mehr. Dies hilft Ihnen, Zeilen abzurufen, die einer bestimmten Bedingung entsprechen.

Die folgende example 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

Die folgende example verwendet die “for”-Schleife, um die ersten drei Felder jedes Datensatzes zu drucken, 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

Die folgende example verwendet die “while”-Schleife, um die ersten beiden Felder jedes Datensatzes zu drucken, 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 analysieren, anstatt einen Dateinamen anzugeben. Der Befehl “ip a” druckt die Informationen über die System-IP, die Mac-Adresse und andere netzwerkbezogene Informationen 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 AWK-Befehlserweiterungen

Beispiel 1: Mit dem Befehl AWK können Sie die Zeilen mit einer bestimmten Anzahl von Zeichen drucken. Für example, Zeilen mit mehr als 27 Zeichen 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üfe 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 mit dem folgenden Befehl drucken:

awk 'END { print NR }' contents.txt

Ausgabe:

8

Beispiel 4: Suchen Sie die längste Zeile in der angegebenen Datei und geben Sie das Zeichen aus

Sie können die längste Zeile in der angegebenen Datei finden und das Zeichen dieser Zeile mit dem folgenden Befehl ausgeben:

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

Führen Sie den folgenden Befehl aus, um die erste Spalte der Datei content.txt zu sortieren und zu drucken:

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

Um nur Zeilen mit geraden Nummern in der Datei content.txt zu drucken, führen Sie den folgenden Befehl aus:

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: Feldtrennzeichen ändern

Sie können das Feldtrennzeichen von Leerzeichen in | . ändern und drucken Sie es mit dem folgenden Befehl aus:

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

Fazit

In diesem Lernprogramm haben Sie gelernt, wie Sie den AWK-Befehl verwenden, um die angegebenen Muster abzugleichen und dann die zugehörigen Aktionen auszuführen. Ich hoffe, Sie haben eine klare Vorstellung davon, wie Sie den AWK-Befehl zum Bearbeiten, Formatieren und selektiven Drucken von Textdateien verwenden.