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

Eine Anleitung für Anfänger zum gawk

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.


Linux
  1. Eine praktische Anleitung zum Erlernen von awk

  2. Linux-Grundlagen:Ein Anfängerleitfaden zur Textbearbeitung mit vim

  3. Eine Anleitung für Anfänger zu firewalld unter Linux

  4. Der vollständige Leitfaden für Anfänger zu LVM unter Linux

  5. AWK gegen NAWK gegen GAWK

So verwenden Sie AppImage unter Linux (Anfängerhandbuch)

Anfängerleitfaden zur Docker-Neustartrichtlinie

50 nützliche Raspberry Pi-Befehle – Ein Leitfaden für Anfänger

Anfängerhandbuch zum Analysieren von Protokollen unter Linux mit dem Befehl journalctl

Anfängerleitfaden für Syslogs unter Linux

PowerShell unter Linux nutzen:Ein Leitfaden für Anfänger