gawk ist die GNU-Implementierung der Programmiersprache Awk, die erstmals in den 1970er Jahren für das Betriebssystem UNIX entwickelt wurde. Die Programmiersprache Awk ist spezialisiert auf die Datenformatierung in Textdateien, insbesondere in Spalten organisierte Textdaten.
Mit der Programmiersprache Awk können Sie mit großer Flexibilität Daten manipulieren oder extrahieren, Berichte erstellen, Muster abgleichen, Berechnungen durchführen und vieles mehr. Awk ermöglicht es Ihnen, etwas schwierige Aufgaben mit einer einzigen Codezeile zu erledigen. Um die gleichen Ergebnisse mit herkömmlichen Programmiersprachen wie C oder Python zu erzielen, wären zusätzlicher Aufwand und viele Codezeilen erforderlich.
gawk
bezieht sich auch auf das Befehlszeilendienstprogramm, das standardmäßig bei den meisten Linux-Distributionen verfügbar ist. Die meisten Distributionen bieten auch einen symbolischen Link für awk
zeigt auf gawk
. Der Einfachheit halber bezeichnen wir das Dienstprogramm ab jetzt nur noch als awk
.
awk
verarbeitet Daten direkt aus der Standardeingabe - STDIN. Ein gängiges Muster besteht darin, die Ausgabe anderer Programme in awk
zu leiten zum Extrahieren und Drucken von Daten, aber awk
kann auch Daten aus Dateien verarbeiten.
In diesem Artikel verwenden Sie awk
um Daten aus einer Datei mit durch Leerzeichen getrennten Spalten zu analysieren. Sehen wir uns zunächst die Beispieldaten an.
Beispieldaten
Für die Beispiele in diesem Handbuch verwenden wir die Ausgabe des Befehls ps ux
in der Datei psux.out
gespeichert . Hier ist ein Beispiel der Daten in der Datei:
$ head psux.out
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ricardo 1446 0.0 0.2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --user
ricardo 1448 0.0 0.1 49212 5848 ? S Sep10 0:00 (sd-pam)
ricardo 1459 0.0 0.1 447560 7148 ? Sl Sep10 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
ricardo 1467 0.0 0.1 369144 6080 tty2 Ssl+ Sep10 0:00 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
ricardo 1469 0.0 0.1 277692 4112 ? Ss Sep10 0:00 /usr/bin/dbus-broker-launch --scope user
ricardo 1471 0.0 0.1 6836 4408 ? S Sep10 0:00 dbus-broker --log 4 --controller 11 --machine-id 16355057c7274843823dd747f8e2978b --max-bytes 100000000000000 --max-fds 25000000000000 --max-matches 5000000000
ricardo 1474 0.0 0.3 467744 14132 tty2 Sl+ Sep10 0:00 /usr/libexec/gnome-session-binary
ricardo 1531 0.0 0.1 297456 4280 ? Ssl Sep10 0:00 /usr/libexec/gnome-session-ctl --monitor
ricardo 1532 0.0 0.3 1230908 12920 ? S<sl Sep10 0:01 /usr/bin/pulseaudio --daemonize=no
Sie können die vollständige Datei hier herunterladen, indem Sie diesen Befehl verwenden:
$ curl -o psux.out https://gitlab.com/-/snippets/2013935/raw\?inline\=false
Wenn Sie sich entscheiden, die Ausgabe von ps ux
zu verwenden Passen Sie auf Ihrem System die in den Beispielen gezeigten Werte an Ihre Ergebnisse an.
Als nächstes verwenden wir awk
um Daten aus der Beispieldatei anzuzeigen.
Grundlegende Verwendung
Ein einfaches awk
Programm besteht aus einem Muster, gefolgt von einer Aktion, die in geschweiften Klammern eingeschlossen ist. Sie können dem awk
ein Programm zur Verfügung stellen Dienstprogramm inline, indem Sie es wie folgt in einfache Anführungszeichen setzen:
$ awk 'pattern { action }'
awk
verarbeitet die Eingabedaten – Standardeingabe oder Datei – Zeile für Zeile und führt die angegebene Aktion für jede Zeile – oder jeden Datensatz – aus, die dem Muster entspricht. Wenn das Muster weggelassen wird, awk
führt die Aktion für alle Datensätze aus. Eine Aktion kann so einfach wie das Drucken von Daten aus der Linie oder so komplex wie ein vollständiges Programm sein. Um beispielsweise alle Zeilen aus der Beispieldatei zu drucken, verwenden Sie diesen Befehl:
$ awk '{ print }' psux.out
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ricardo 1446 0.0 0.2 21644 11536 ? Ss Sep10 0:00 /usr/lib/systemd/systemd --user
.... OUTPUT TRUNCATED ....
Obwohl dieses Beispiel nicht wirklich nützlich ist, veranschaulicht es das awk
Grundauslastung des Befehls.
Wenn Sie den Befehl ps ux
verwenden auf Ihrem Rechner können Sie dessen Ausgabe direkt in awk
leiten , anstatt den Namen der Eingabedatei anzugeben:
$ ps ux | awk '{ print }'
Als nächstes verwenden wir awk
Spaltenverarbeitungsfunktionen, um einen Teil der Daten aus der Beispieldatei zu extrahieren.
Druckfelder
Die Kraft von awk
wird offensichtlich, wenn Sie die Spaltenverarbeitungsfunktionen verwenden. awk
teilt jede Zeile – oder jeden Datensatz – automatisch in Felder auf. Standardmäßig wird das Leerzeichen verwendet Zeichen, um jedes Feld zu trennen, aber Sie können dies ändern, indem Sie den Befehlszeilenparameter -F
angeben gefolgt vom gewünschten Trennzeichen.
Nach dem Teilen awk
weist jedem Feld eine nummerierte Variable zu, beginnend mit dem Zeichen $
. Das erste Feld ist beispielsweise $1
, die zweite $2
, und so weiter. Die spezielle Variable $0
enthält den gesamten Datensatz vor dem Teilen.
Durch die Verwendung der Feldvariablen können Sie Daten aus der Eingabe extrahieren. Um beispielsweise nur den Befehlsnamen aus der Beispieldatei zu drucken, verwenden Sie die Variable $11
denn der Befehlsname ist die elfte Spalte in jeder Zeile:
$ awk '{ print $11 }' psux.out
COMMAND
/usr/lib/systemd/systemd
(sd-pam)
/usr/bin/gnome-keyring-daemon
.... OUTPUT TRUNCATED ....
Sie können auch mehrere Felder drucken, indem Sie sie durch Kommas trennen. Um beispielsweise den Befehlsnamen und die CPU-Auslastung in Spalte drei auszugeben, verwenden Sie diesen Befehl:
$ awk '{ print $11, $3 }' psux.out
COMMAND %CPU
/usr/lib/systemd/systemd 0.0
(sd-pam) 0.0
/usr/bin/gnome-keyring-daemon 0.0
.... OUTPUT TRUNCATED ....
Verwenden Sie schließlich das eingebaute printf
Funktion, um die Ausgabe zu formatieren und die Spalten auszurichten. Stellen Sie rechts neben den ersten Spalten eine Auffüllung mit 40 Zeichen bereit, um längere Befehlsnamen aufzunehmen:
$ awk '{ printf("%-40s %s\n", $11, $3) }' psux.out
COMMAND %CPU
/usr/lib/systemd/systemd 0.0
(sd-pam) 0.0
/usr/bin/gnome-keyring-daemon 0.0
/usr/libexec/gdm-wayland-session 0.0
.... OUTPUT TRUNCATED ....
Da Sie nun einzelne Felder aus jedem Datensatz manipulieren und extrahieren können, wenden wir die Musterfunktion an, um die Datensätze zu filtern.
[ Das könnte Ihnen auch gefallen: Manipulieren von Text in der Befehlszeile mit sed ]
Musterabgleich
Zusätzlich zum Bearbeiten von Feldern bietet awk
ermöglicht es Ihnen, mithilfe einer leistungsstarken Musterabgleichsfunktion zu filtern, für welche Datensätze Aktionen ausgeführt werden sollen. Geben Sie in seiner einfachsten Verwendung einen regulären Ausdruck an, der von Schrägstrich /
eingeschlossen ist Zeichen, um Datensätze abzugleichen. Zum Beispiel, um nach Datensätzen zu filtern, die mit firefox übereinstimmen , verwenden Sie /firefox/
:
$ awk '/firefox/ { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
Sie können auch Felder und einen Vergleichsausdruck als Kriterien für den Musterabgleich verwenden. Um beispielsweise Daten aus dem Prozess zu drucken, die mit PID 6685 übereinstimmen, vergleichen Sie das Feld $2
, etwa so:
$ awk '$2==6685 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 0.0
awk
ist intelligent genug, um numerische Felder zu verstehen, sodass Sie relative Vergleiche wie „größer als“ oder „kleiner als“ verwenden können. Zum Beispiel, um alle Prozesse anzuzeigen, die über 5 % CPU verbrauchen , verwenden Sie $3 > 5
:
$ awk '$3 > 5 { print $11, $3 }' psux.out
/usr/bin/gnome-shell 5.1
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
Sie können Muster mit Operatoren kombinieren. Zum Beispiel, um alle Prozesse anzuzeigen, die mit firefox übereinstimmen und verbrauchen über 5 % CPU , kombinieren Sie beide Muster mit dem &&
Operator für ein logisches AND
:
$ awk '/firefox/ && $3 > 5 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
Schließlich, weil Sie den Musterabgleich verwenden, awk
druckt die Kopfzeile nicht mehr. Sie können Ihre eigene Kopfzeile hinzufügen, indem Sie BEGIN
verwenden Muster, um eine einzelne Aktion auszuführen, bevor Datensätze verarbeitet werden:
$ awk 'BEGIN { printf("%-26s %s\n", "Command", "CPU%")} $3 > 10 { print $11, $3 }' psux.out
Command CPU%
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
Bearbeiten wir als Nächstes die Daten in einzelnen Feldern.
Feldmanipulation
Wie wir im vorherigen Abschnitt besprochen haben, ist awk
versteht numerische Felder. Auf diese Weise können Sie Daten manipulieren, einschließlich numerischer Berechnungen. Ziehen Sie beispielsweise in Betracht, die Speicherauslastung in Spalte sechs für alle Firefox auszugeben Prozesse:
$ awk '/firefox/ { print $11, $6 }' psux.out
/usr/lib64/firefox/firefox 301212
/usr/lib64/firefox/firefox 118220
/usr/lib64/firefox/firefox 168468
/usr/lib64/firefox/firefox 101520
/usr/lib64/firefox/firefox 194336
/usr/lib64/firefox/firefox 111864
/usr/lib64/firefox/firefox 163440
/usr/lib64/firefox/firefox 38496
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 37264
/usr/lib64/firefox/firefox 30608
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 174660
Der Befehl ps ux
zeigt die schwer lesbare Speicherauslastung in Kilobyte an. Konvertieren wir es in Megabyte, indem wir den Feldwert um 1024 dividieren:
$ awk '/firefox/ { print $11, $6/1024 }' psux.out
/usr/lib64/firefox/firefox 294.152
/usr/lib64/firefox/firefox 115.449
/usr/lib64/firefox/firefox 164.52
/usr/lib64/firefox/firefox 99.1406
/usr/lib64/firefox/firefox 189.781
/usr/lib64/firefox/firefox 109.242
/usr/lib64/firefox/firefox 159.609
/usr/lib64/firefox/firefox 37.5938
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 36.3906
/usr/lib64/firefox/firefox 29.8906
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 170.566
Sie können Zahlen auch aufrunden und das Suffix MB hinzufügen mit printf
um die Lesbarkeit zu verbessern:
$ awk '/firefox/ { printf("%s %4.0f MB\n", $11, $6/1024) }' psux.out
/usr/lib64/firefox/firefox 294 MB
/usr/lib64/firefox/firefox 115 MB
/usr/lib64/firefox/firefox 165 MB
/usr/lib64/firefox/firefox 99 MB
/usr/lib64/firefox/firefox 190 MB
/usr/lib64/firefox/firefox 109 MB
/usr/lib64/firefox/firefox 160 MB
/usr/lib64/firefox/firefox 38 MB
/usr/lib64/firefox/firefox 171 MB
/usr/lib64/firefox/firefox 36 MB
/usr/lib64/firefox/firefox 30 MB
/usr/lib64/firefox/firefox 171 MB
/usr/lib64/firefox/firefox 171 MB
Kombinieren Sie diese Idee schließlich mit dem BEGIN
und END
Muster, um eine erweiterte Datenmanipulation durchzuführen. Lassen Sie uns zum Beispiel die Gesamtspeicherauslastung für alle Firefox berechnen Prozesse durch die Definition einer Variablen Summe im BEGIN
Aktion, indem Sie den Wert der sechsten Spalte $6
hinzufügen für jede Zeile, die firefox entspricht zur Summe Variable, und druckt sie dann mit dem END
aus Aktion in Megabyte:
$ awk 'BEGIN { sum=0 } /firefox/ { sum+=$6 } END { printf("Total Firefox memory: %.0f MB\n", sum/1024) }' psux.out
Total Firefox memory: 1747 MB
[ Jetzt herunterladen:Eine Anleitung für Systemadministratoren zum Bash-Skripting. ]
Was kommt als nächstes?
gawk
ist ein leistungsstarkes und flexibles Werkzeug zur Verarbeitung von Textdaten, insbesondere von Daten, die in Spalten angeordnet sind. Dieser Artikel enthält einige nützliche Beispiele für die Verwendung dieses Tools zum Extrahieren und Bearbeiten von Daten, aber gawk
kann noch viel mehr. Für zusätzliche Informationen über gawk
, konsultieren Sie die Handbuchseiten Ihrer Linux-Distribution.
Die Awk-Sprache hat viel mehr Ressourcen als das, was wir in diesem Handbuch untersucht haben. Detaillierte Informationen dazu finden Sie im offiziellen GNU Awk User's Guide.