Awk ist eine Allzweck-Skriptsprache für erweiterte Textverarbeitung entwickelt. Es wird hauptsächlich als Berichts-und Analysetool verwendet.
Im Gegensatz zu den meisten anderen prozeduralen Programmiersprachen ist awk datengetrieben, was bedeutet, dass Sie eine Reihe von Aktionen definieren, die für den Eingabetext ausgeführt werden sollen. Es nimmt die Eingabedaten, transformiert sie und sendet das Ergebnis an die Standardausgabe.
Dieser Artikel behandelt das Wesentliche der Programmiersprache awk., Wenn Sie die Grundlagen von awk kennen, können Sie Textdateien in der Befehlszeile erheblich bearbeiten.
Wie awk funktioniert #
Es gibt verschiedene Implementierungen von awk. Wir verwenden die GNU-Implementierung von awk, die gawk heißt. Auf den meisten Linux-Systemen ist derawk
– Interpreter nur ein Symlink zugawk
.
Datensätze und Felder #
Awk kann Textdatendateien und-streams verarbeiten. Die Eingabedaten sind in Datensätze und Felder unterteilt. Awk arbeitet jeweils an einem Datensatz, bis das Ende der Eingabe erreicht ist., Datensätze werden durch ein Zeichen getrennt, das als Datensatztrennzeichen bezeichnet wird. Das standardmäßige Datensatztrennzeichen ist das Zeilenumbruchzeichen, was bedeutet, dass jede Zeile in den Textdaten ein Datensatz ist. Ein neues Datensatztrennzeichen kann mit der Variablen RS
gesetzt werden.
Datensätze bestehen aus Feldern, die durch das Feldtrennzeichen getrennt sind. Standardmäßig werden Felder durch ein Leerzeichen getrennt, einschließlich eines oder mehrerer Tabulatorzeichen, Leerzeichen und Zeilenumbruchszeichen.
Die Felder in jedem Datensatz werden durch das Dollarzeichen referenziert ($
) gefolgt von Feldnummer, beginnend mit 1., Das erste Feld wird mit $1
, das zweite mit $2
usw. dargestellt. Das letzte Feld kann auch mit der speziellen Variablen $NF
referenziert werden. Der gesamte Datensatz kann mit $0
referenziert werden.
Hier ist eine visuelle Darstellung, die zeigt, wie auf Datensätze und Felder verwiesen wird:
tmpfs 788M 1.8M 786M 1% /run/lock /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($NF) --> fields|-----------------------------------------| $0 --> record
Awk program #
Um einen Text mit awk
zu verarbeiten, schreiben Sie ein Programm, das dem Befehl mitteilt, was zu tun ist., Das Programm besteht aus einer Reihe von Regeln und benutzerdefinierten Funktionen. Jede Regel enthält ein Muster-und Aktionspaar. Regeln werden durch Zeilenumbrüche oder Semikolons getrennt (;
). In der Regel sieht ein awk-Programm folgendermaßen aus:
pattern { action }pattern { action }...
Wenn awk
Daten verarbeitet, wenn das Muster mit dem Datensatz übereinstimmt, führt es die angegebene Aktion für diesen Datensatz aus. Wenn die Regel kein Muster hat, werden alle Datensätze (Zeilen) abgeglichen.
Eine awk-Aktion ist in Klammern eingeschlossen ({}
) und besteht aus Anweisungen., Jede Anweisung gibt die auszuführende Operation an. Eine Aktion kann mehr als eine Anweisung haben, die durch Zeilenumbrüche oder Semikolons getrennt ist (;
). Wenn die Regel keine Aktion hat, wird standardmäßig der gesamte Datensatz gedruckt.
Awk unterstützt verschiedene Arten von Anweisungen, einschließlich Ausdrücke, Bedingungen, Eingabe, Ausgabe-Anweisungen und vieles mehr. Die häufigsten awk-Anweisungen sind:
-
exit
– bricht die Ausführung des gesamten Programms und wird beendet., -
next
– Stoppt die Verarbeitung des aktuellen Datensatzes und wechselt zum nächsten Datensatz in den Eingabedaten. -
print
– Datensätze, Felder, Variablen und benutzerdefinierten Text drucken. -
printf
– Gibt Ihnen mehr Kontrolle über das Ausgabeformat, ähnlich wie C und bashprintf
.
Beim Schreiben von Awk-Programmen wird alles nach dem Hash-Zeichen (#)
und bis zum Ende der Zeile als Kommentar betrachtet., Lange Zeilen können mit dem Fortsetzungszeichen backslash (\
) in mehrere Zeilen unterteilt werden.
Ausführen von awk-Programmen #
Ein awk-Programm kann auf verschiedene Arten ausgeführt werden. Wenn das Programm kurz und einfach ist, kann es direkt an den awk
-Interpreter in der Befehlszeile übergeben werden:
awk 'program' input-file...
Wenn das Programm in der Befehlszeile ausgeführt wird, sollte es in einfache Anführungszeichen gesetzt werden (''
), damit die Shell das Programm nicht interpretiert.,
Wenn das Programm groß und komplex ist, legen Sie es am besten in eine Datei und übergeben Sie die Datei mit der Option -f
an den Befehl awk
:
awk -f program-file input-file...
In den folgenden Beispielen verwenden wir eine Datei mit dem Namen „teams.txt“, das wie folgt aussieht:
Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585
Awk Patterns #
Patterns in awk steuern, ob die zugehörige Aktion ausgeführt werden soll oder nicht.,
Awk unterstützt verschiedene Arten von Mustern, einschließlich regulärer Ausdrücke, Beziehungsausdrücke, Bereiche und spezieller Ausdrucksmuster.
Wenn die Regel kein Muster hat, wird jeder Eingabedatensatz abgeglichen. Hier ist ein Beispiel für eine Regel, die nur eine Aktion enthält:
awk '{ print $3 }' teams.txt
Das Programm druckt das dritte Feld jedes Datensatzes:
6058514948
Muster für reguläre Ausdrücke #
Ein regulärer Ausdruck oder Regex ist ein Muster, das einer Reihe von Zeichenfolgen entspricht., Awk-Muster für reguläre Ausdrücke sind in Schrägstriche eingeschlossen (//
):
/regex pattern/ { action }
Das grundlegendste Beispiel ist ein literaler Zeichen-oder Zeichenfolgenabgleich. Um beispielsweise das erste Feld jedes Datensatzes anzuzeigen, der „0.5“ enthält, führen Sie den folgenden Befehl aus:
awk '/0.5/ { print $1 }' teams.txt
CelticsPacers
Das Muster kann ein beliebiger Typ eines erweiterten regulären Ausdrucks sein., Hier ist ein Beispiel, das das erste Feld druckt, wenn der Datensatz mit zwei oder mehr Ziffern beginnt:
awk '/^/ { print $1 }' teams.txt
76ers
Relationale Ausdrucksmuster #
Die relationalen Ausdrucksmuster werden im Allgemeinen verwendet, um den Inhalt eines bestimmten Feldes oder einer bestimmten Variablen abzugleichen.
Standardmäßig werden Muster für reguläre Ausdrücke mit den Datensätzen abgeglichen. Um einen regulären Ausdruck mit einem Feld abzugleichen, geben Sie das Feld an und verwenden Sie den Vergleichsoperator „enthalten“ (~
) für das Muster.,
Um beispielsweise das erste Feld jedes Datensatzes zu drucken, dessen zweites Feld „ia“ enthält, geben Sie Folgendes ein:
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers
Um Felder abzugleichen, die kein bestimmtes Muster enthalten, verwenden Sie den Operator !~
:
awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics
Sie können Zeichenfolgen oder Zahlen für Beziehungen vergleichen, z. B. größer als, kleiner als, gleich usw., Der folgende Befehl gibt das erste Feld aller Datensätze aus, deren drittes Feld größer als 50 ist:
awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers
Bereichsmuster #
Bereichsmuster bestehen aus zwei durch ein Komma getrennten Mustern:
pattern1, pattern2
Alle Datensätze, die mit einem Datensatz beginnen, der dem ersten Muster entspricht, bis ein Datensatz das stimmt mit dem zweiten Muster überein.,
Hier ist ein Beispiel, das das erste Feld aller Datensätze druckt, beginnend mit dem Datensatz einschließlich „Raptors“ bis zum Datensatz einschließlich „Celtics“:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics
Die Muster können auch Beziehungsausdrücke sein. Mit dem folgenden Befehl werden alle Datensätze gedruckt, beginnend mit dem, dessen viertes Feld gleich 32 ist, bis zu dem, dessen viertes Feld gleich 33 ist:
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598
Bereichsmuster können nicht mit anderen Musterausdrücken kombiniert werden.,
Spezielle Ausdrucksmuster #
Awk enthält die folgenden speziellen Pattens:
-
BEGIN
– Wird verwendet, um Aktionen auszuführen, bevor Datensätze verarbeitet werden. -
END
– Wird verwendet, um Aktionen auszuführen, nachdem Datensätze verarbeitet wurden.
DasBEGIN
– Muster wird im Allgemeinen zum Festlegen von Variablen und das END
– Muster zum Verarbeiten von Daten aus den Datensätzen, z. B. Berechnung, verwendet.
Im folgenden Beispiel wird „Verarbeitung starten.“, dann drucken Sie das dritte Feld jedes Datensatzes und schließlich “ Verarbeitung beenden.,“:
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.
Wenn ein Programm nur ein BEGIN
– Muster hat, werden Aktionen ausgeführt und die Eingabe nicht verarbeitet. Wenn ein Programm nur ein END
– Muster hat, wird die Eingabe verarbeitet, bevor die Regelaktionen ausgeführt werden.
Die Gnu-Version von awk enthält auch zwei weitere spezielle Muster BEGINFILE
und ENDFILE
, mit denen Sie Aktionen bei der Verarbeitung von Dateien ausführen können.,
Kombinieren von Mustern #
Awk ermöglicht es Ihnen, zwei oder mehr Muster mit dem logischen UND Operator (&&
) und logischen ODER Operator (||
) zu kombinieren.,
Hier ist ein Beispiel, das den Operator &&
verwendet, um das erste Feld des Datensatzes zu drucken, dessen drittes Feld größer als 50 und das vierte Feld kleiner als 30 ist:
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors
Integrierte Variablen #
Awk verfügt über eine Reihe integrierter Variablen, die nützliche Informationen enthalten und es Ihnen ermöglichen, wie das Programm verarbeitet wird. Nachfolgend sind einige der häufigsten integrierten Variablen aufgeführt:
-
NF
– Die Anzahl der Felder im Datensatz., -
NR
– Die Nummer des aktuellen Datensatzes. -
FILENAME
– Der Name der aktuell verarbeiteten Eingabedatei. -
FS
– Feld-separator. -
RS
– Datensatztrennzeichen. -
OFS
– Ausgabefeldtrennzeichen. -
ORS
– Ausgabedatensatztrennzeichen.,
Hier ist ein Beispiel, wie der Dateiname und die Anzahl der Zeilen (Datensätze) gedruckt werden:
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.
Variablen in AWK können in jeder Zeile des Programms festgelegt werden. Um eine Variable für das gesamte Programm zu definieren, fügen Sie sie in ein BEGIN
– Muster ein.
Ändern des Feld – und Datensatztrennzeichens #
Der Standardwert des Feldtrennzeichens ist eine beliebige Anzahl von Leerzeichen oder Tabulatorzeichen. Es kann geändert werden, indem in der FS
Variable.,
Um beispielsweise das Feldtrennzeichen auf .
zu setzen, würden Sie Folgendes verwenden:
awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0
Das Feldtrennzeichen kann auch auf mehr als ein Zeichen gesetzt werden:
awk 'BEGIN { FS = ".." } { print $1 }' teams.txt
Wenn awk Einzeiler auf dem befehlszeile können Sie auch die Option -F
verwenden, um das Feldtrennzeichen zu ändern:
awk -F "." '{ print $1 }' teams.txt
Standardmäßig ist das Datensatztrennzeichen ein Zeilenumbruchzeichen und kann mit der Variablen RS
geändert werden.,
Hier ist ein Beispiel, das zeigt, wie das Datensatztrennzeichen in .
geändert wird:
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585
Awk Actions #
Awk actions are enclosed in braces ({}
) and executed when the pattern matches. Eine Aktion kann null oder mehr Anweisungen haben. Mehrere Anweisungen werden in der Reihenfolge ausgeführt, in der sie angezeigt werden, und müssen durch Zeilenumbrüche oder Semikolons getrennt werden (;
).,
Es gibt verschiedene Arten von Action-Anweisungen, die in awk unterstützt werden:
- – Ausdrücke wie Variablenzuweisung, arithmetische Operatoren, Inkrement-und Dekrementoperatoren.
- Steueranweisungen, die zur Steuerung des Programmflusses verwendet werden (
if
,for
,while
,switch
und mehr) - Ausgabeanweisungen, wie
print
undprintf
. - Zusammengesetzte Anweisungen, um andere Anweisungen zu gruppieren.,
- Eingabeanweisungen, um die Verarbeitung der Eingabe zu steuern.
- Löschanweisungen, um Array-Elemente zu entfernen.
Dieprint
– Anweisung ist wahrscheinlich die am häufigsten verwendete awk-Anweisung. Es druckt eine formatierte Ausgabe von Text, Datensätzen, Feldern und Variablen.
Wenn Sie mehrere Elemente drucken, müssen Sie sie durch Kommas trennen., Hier ist ein Beispiel:
awk '{ print $1, $3, $5 }' teams.txt
Die gedruckten Elemente sind durch einzelne Leerzeichen getrennt:
Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585
Wenn Sie keine Kommas verwenden, ist zwischen den Elementen kein Leerzeichen vorhanden:
awk '{ print $1 $3 $5 }' teams.txt
Die gedruckten Elemente sind verkettet:
Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585
Wenn print
ohne Argument verwendet wird, wird standardmäßig print $0
. Der aktuelle Datensatz wird gedruckt.,
Um einen benutzerdefinierten Text zu drucken, müssen Sie den Text mit doppelten Anführungszeichen zitieren:
awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers
Sie können auch Sonderzeichen wie newline drucken:
awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line
Die printf
Anweisung gibt Ihnen mehr Kontrolle über das Ausgabeformat., id=“aa8cfd3cbd“>
printf
erstellt nach jedem Datensatz keine neue Zeile, daher verwenden wir \n
:
1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585
Der folgende Befehl berechnet die Summe der im dritten Feld in jeder Zeile gespeicherten Werte:
awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
Hier ist ein weiteres Beispiel, das zeigt, wie man mit Ausdrücken und Steueranweisungen die Zahlenquadrate von 1 bis 5 druckt:
awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'
Square of 1 is 1Square of 2 is 4Square of 3 is 9Square of 4 is 16Square of 5 is 25
Einzeilige Befehle wie der obige sind schwieriger zu verstehen und zu warten., Wenn Sie längere Programme schreiben, sollten Sie eine separate Programmdatei erstellen:
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Führen Sie das Programm aus, indem Sie den Dateinamen an den awk
– Interpreter übergeben:
awk -f prg.awk
Sie können ein awk-Programm auch als ausführbare Datei ausführen, indem Sie die shebang-Direktive verwenden und die awk
interpreter:
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Speichern Sie die Datei und machen Sie sie ausführbar :
chmod +x prg.awk
Sie können das Programm jetzt ausführen, indem Sie Folgendes eingeben:
./prg.awk
Verwenden von Shell-Variablen in Awk-Programmen #
Wenn Sie die awk
Befehl In Shell-Skripten besteht die Möglichkeit, dass Sie eine Shell-Variable an das awk-Programm übergeben müssen. Eine Möglichkeit besteht darin, das Programm mit doppelten statt einfachen Anführungszeichen einzuschließen und die Variable im Programm zu ersetzen., Diese Option macht Ihr awk-Programm jedoch komplexer, da Sie den awk-Variablen entkommen müssen.
Die empfohlene Methode zur Verwendung von Shell-Variablen in awk-Programmen besteht darin, die Shell-Variable einer awk-Variablen zuzuweisen. Hier ist ein Beispiel:
num=51
awk -v n="$num" 'BEGIN {print n}'