GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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 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.


Linux
  1. Linux-mv-Befehl

  2. Linux-Du-Befehl

  3. Linux-IP-Befehl

  4. Linux-cd-Befehl

  5. awk-Befehlsbeispiele unter Linux

Welcher Linux-Befehl

W-Befehl unter Linux

Bei Befehl unter Linux

Linux-awk-Befehl mit 10 Beispielen

Df-Befehl unter Linux

AWK-Befehl unter Linux/Unix