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.