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

Eine praktische Anleitung zum Erlernen von awk

Von allen Linux-Befehlen da draußen (und es gibt viele) scheinen die drei grundlegendsten sed zu sein , awk , und grep . Vielleicht ist es der obskure Klang ihrer Namen oder die Breite ihrer möglichen Verwendung oder einfach ihr Alter, aber wenn jemand ein Beispiel für einen „Linuxy“-Befehl gibt, ist es normalerweise einer dieser drei. Und während sed und grep haben mehrere einfache einzeilige Standards, den weniger prestigeträchtigen awk bleibt hartnäckig prominent, weil es besonders rätselhaft ist.

Wahrscheinlich verwenden Sie sed für einen schnellen String-Ersatz oder grep um täglich nach einem Muster zu filtern. Es ist viel unwahrscheinlicher, dass Sie ein awk verfassen Befehl. Ich frage mich oft, warum das so ist, und ich führe es auf einige Dinge zurück. Zunächst einmal verwenden viele von uns kaum sed und grep für alles andere als eine Variation dieser beiden Befehle:

$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Auch wenn Sie sich mit sed vielleicht wohler fühlen und grep , können Sie möglicherweise nicht ihr volles Potenzial nutzen. Natürlich besteht keine Verpflichtung, mehr über sed zu erfahren oder grep , aber manchmal frage ich mich, wie ich Befehle "lerne". Anstatt wie zu lernen ein Befehl funktioniert, lerne ich oft eine bestimmte Beschwörung, die einen Befehl enthält. Dadurch fühle ich mich oft falsch vertraut mit dem Befehl. Ich glaube, ich kenne einen Befehl, weil ich drei oder vier Optionen aus dem Kopf benennen kann, obwohl ich nicht weiß, was die Optionen bewirken, und die Syntax nicht genau bestimmen kann.

Und das ist, glaube ich, das Problem, dem viele Leute gegenüberstehen, wenn sie mit der Leistungsfähigkeit und Flexibilität von awk konfrontiert werden .

awk lernen, awk zu verwenden

Die Grundlagen von awk sind überraschend einfach. Es wird oft darauf hingewiesen, dass awk ist eine Programmiersprache, und obwohl sie relativ einfach ist, ist sie wahr. Das heißt, Sie können awk lernen Genauso lernen Sie eine neue Programmiersprache:Lernen Sie ihre Syntax mit einigen grundlegenden Befehlen, lernen Sie ihr Vokabular, damit Sie komplexe Aktionen aufbauen können, und üben Sie dann, üben, üben.

Wie awk Eingaben parst

Awk sieht die Eingabe im Wesentlichen als ein Array. Wenn awk über eine Textdatei scannt, behandelt es jede Zeile einzeln und nacheinander als Datensatz . Jeder Datensatz ist in Felder unterteilt . Natürlich awk müssen diese Informationen im Auge behalten, und Sie können diese Daten mit dem NR sehen (Anzahl Datensätze) und NF (Anzahl der Felder) eingebaute Variablen. So erhalten Sie beispielsweise die Zeilenanzahl einer Datei:

$ awk 'END { print NR;}' example.txt
36

Das verrät auch etwas über awk Syntax. Ob Sie awk schreiben als Einzeiler oder als eigenständiges Skript, die Struktur eines awk Anweisung ist:

pattern or keyword { actions }

In diesem Beispiel das Wort END ist eher ein spezielles, reserviertes Schlüsselwort als ein Muster. Ein ähnliches Schlüsselwort ist BEGIN . Mit diesen beiden Schlüsselwörtern awk führt nur die Aktion in geschweiften Klammern am Anfang oder Ende der Analyse von Daten aus.

Sie können ein Muster verwenden als Filter oder Qualifizierer, sodass awk führt eine bestimmte Aktion nur aus, wenn es Ihr Muster mit dem aktuellen Datensatz abgleichen kann. Angenommen, Sie möchten awk verwenden , ähnlich wie Sie es mit grep tun würden , um das Wort Linux zu finden in einer Textdatei:

$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)

Für awk , jede Zeile in der Datei ist ein Datensatz und jedes Wort in einem Datensatz ist ein Feld. Standardmäßig werden Felder durch ein Leerzeichen getrennt. Das können Sie mit dem --field-separator ändern Option, die den FS setzt (Feldtrennzeichen)-Variable zu dem, was Sie wollen:

$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt 
 CentOS Linux (10.1.1.8)
 CentOS Linux (10.1.1.9)
 Red Hat Enterprise Linux (RHEL) (10.1.1.11)
 Elementary Linux (10.1.2.4)
 Elementary Linux (10.1.2.5)
 Elementary Linux (10.1.2.6)

In diesem Beispiel steht vor jedem Eintrag ein Leerzeichen, da nach jedem Doppelpunkt ein Leerzeichen steht (: ) im Quelltext. Das ist nicht cut , sodass das Feldtrennzeichen nicht auf ein Zeichen beschränkt sein muss:

$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt 
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)

Funktionen in awk

Sie können Ihre eigenen Funktionen in awk bauen mit dieser Syntax:

name(parameters) { actions }

Funktionen sind wichtig, weil sie es Ihnen ermöglichen, Code einmal zu schreiben und ihn während Ihrer gesamten Arbeit wiederzuverwenden. Beim Erstellen von Einzeilern sind benutzerdefinierte Funktionen etwas weniger nützlich als in Skripten, aber awk definiert bereits viele Funktionen für Sie. Sie funktionieren im Grunde genauso wie jede Funktion in jeder anderen Sprache oder Tabellenkalkulation:Sie lernen die Reihenfolge, in der die Funktion Informationen von Ihnen benötigt, und Sie können sie mit allem füttern, was Sie möchten, um die Ergebnisse zu erhalten.

Es gibt Funktionen, um mathematische Operationen und String-Verarbeitung durchzuführen. Die mathematischen sind oft ziemlich einfach. Du gibst eine Zahl an und es knirscht sie:

$ awk 'BEGIN { print sqrt(1764); }'
42

Zeichenfolgenfunktionen können komplexer sein, sind aber im GNU awk-Handbuch gut dokumentiert. Zum Beispiel split Die Funktion übernimmt eine Entität, die awk ist Ansichten als einzelnes Feld und teilt es in verschiedene Teile auf. Es erfordert ein Feld, eine Variable, die als Array verwendet werden kann und jeden Teil der Teilung enthält, und das Zeichen, das Sie als Trennzeichen verwenden möchten.

Anhand der Ausgabe der vorherigen Beispiele weiß ich, dass am Ende jedes Datensatzes eine IP-Adresse steht. In diesem Fall kann ich nur das letzte Feld eines Datensatzes an split senden Funktion durch Verweis auf die Variable NF weil es die Anzahl der Felder enthält (und das letzte Feld muss die höchste Zahl sein):

$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2

Es gibt noch viel mehr Funktionen, und es gibt keinen Grund, sich auf eine pro Block von awk zu beschränken Code. Mit awk können Sie komplexe Pipelines konstruieren in Ihrem Terminal, oder Sie können awk schreiben Skripte zum Definieren und Verwenden eigener Funktionen.

Laden Sie das eBook herunter

awk lernen ist hauptsächlich eine Frage der Verwendung von awk . Verwenden Sie es, selbst wenn es bedeutet, dass Sie bereits vorhandene Funktionen mit sed duplizieren oder grep oder cut oder tr oder andere vollkommen gültige Befehle. Sobald Sie sich damit vertraut gemacht haben, können Sie Bash-Funktionen schreiben, die Ihr benutzerdefiniertes awk aufrufen Befehle für eine einfachere Verwendung. Und schließlich werden Sie in der Lage sein, Skripte zu schreiben, um komplexe Datensätze zu parsen.

Laden Sie unsere herunter eBook  um alles zu erfahren, was Sie über awk wissen müssen , und verwenden Sie es noch heute.


Linux
  1. Eine Anleitung zur Installation von Anwendungen unter Linux

  2. Systemd lieben lernen

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

  4. Eine Anleitung für Anfänger zum gawk

  5. Meine 8 beliebtesten praktischen Linux-Befehle

Vollständiges Handbuch zur Linux-Protokollierung

16 Praktische Beispiele für den Traceroute-Befehl unter Linux

20 praktische Beispiele für den Chown-Befehl unter Linux

12 praktische Beispiele für In Command unter Linux

40 Praktischer und nützlicher awk-Befehl in Linux und BSD

Ein praktischer Leitfaden für den Chroot-Befehl unter Linux