So verwenden Sie den awk-Befehl unter Linux

Unter Linux, awk ist ein Dynamo zur Befehlszeilen-Textmanipulation sowie eine leistungsstarke Skriptsprache. Hier ist eine Einführung in einige seiner coolsten Funktionen.

10 grundlegende Linux-Befehle für Anfänger

Wie awk zu seinem Namen kam

Die awk Der Befehl wurde mit den Initialen der drei Personen benannt, die 1977 die Originalversion geschrieben haben: Alfred Aho, Peter Weinberger, und Brian Kernighan. Diese drei Männer waren aus dem legendären AT&T Bell-Labors Unix-Pantheon. Mit den Beiträgen vieler anderer seither awk hat sich weiter entwickelt.

Es ist eine vollständige Skriptsprache sowie ein vollständiges Toolkit zur Textbearbeitung für die Befehlszeile. Wenn dieser Artikel Appetit macht, können Sie Schau dir jedes Detail an Über awk und seine Funktionalität.

Regeln, Muster und Aktionen

awk arbeitet an Programmen, die Regeln enthalten, die aus Mustern und Aktionen bestehen. Die Aktion wird für den Text ausgeführt, der dem Muster entspricht. Muster sind in geschweifte Klammern eingeschlossen ({}). Ein Muster und eine Aktion bilden zusammen eine Regel. Das ganze awk Programm steht in einfachen Anführungszeichen (').

Werfen wir einen Blick auf die einfachste Art von awk Programm. Es hat kein Muster, also stimmt es mit jeder Textzeile überein, die in es eingegeben wird. Dies bedeutet, dass die Aktion in jeder Zeile ausgeführt wird. Brunnen Verwenden Sie es für die Ausgabe von das who Befehl.

Hier ist die Standardausgabe von who:

who


Vielleicht brauchen wir nicht all diese Informationen, sondern wollen nur die Namen auf den Konten sehen. Wir können die Ausgabe von weiterleiten who hinein awk, und dann erzähle awk um nur das erste Feld zu drucken.

Standardmäßig, awk betrachtet ein Feld als eine von Leerzeichen umgebene Zeichenfolge, den Anfang einer Zeile oder das Ende einer Zeile. Felder werden durch ein Dollarzeichen ($) und eine Zahl. So, $1 stellt das erste Feld dar, das wir mit dem verwenden werden print Aktion, um das erste Feld zu drucken.

Wir geben folgendes ein:

who | awk '{print $1}'

awk druckt das erste Feld und verwirft den Rest der Zeile.

Wir können beliebig viele Felder drucken. Wenn wir ein Komma als Trennzeichen hinzufügen, awk druckt ein Leerzeichen zwischen jedem Feld.

Wir geben Folgendes ein, um auch die Anmeldezeit der Person auszudrucken (Feld vier):

who | awk '{print $1,$4}'

Es gibt einige spezielle Feldbezeichner. Diese stellen die gesamte Textzeile und das letzte Feld in der Textzeile dar:

  • $0: Stellt die gesamte Textzeile dar.
  • $1: Stellt das erste Feld dar.
  • $ 2: Stellt das zweite Feld dar.
  • $7: Stellt das siebte Feld dar.
  • $45: Stellt das 45. Feld dar.
  • $NF: Steht für „Anzahl der Felder“ und repräsentiert das letzte Feld.


Wir geben Folgendes ein, um eine kleine Textdatei aufzurufen, die ein kurzes Zitat enthält, das zugeschrieben wird Dennis Ritchie:

cat dennis_ritchie.txt

Wir wollen awk um das erste, zweite und letzte Feld des Angebots zu drucken. Beachten Sie, dass es, obwohl es im Terminalfenster umbrochen ist, nur eine einzelne Textzeile ist.

Wir geben folgenden Befehl ein:

awk '{print $1,$2,$NF}' dennis_ritchie.txt

Wir kennen diese „Einfachheit“ nicht. ist das 18. Feld in der Textzeile, und das ist uns egal. Was wir wissen ist, dass es das letzte Feld ist und wir verwenden können $NF seinen Wert zu bekommen. Der Punkt wird nur als ein weiteres Zeichen im Feldkörper betrachtet.

Hinzufügen von Ausgabefeldtrennzeichen

Kann man auch sagen awk um ein bestimmtes Zeichen zwischen Feldern anstelle des Standard-Leerzeichens zu drucken. Die Standardausgabe des date Befehl ist etwas eigenartig weil die zeit mittendrin ist. Wir können jedoch Folgendes eingeben und verwenden awk um die gewünschten Felder zu extrahieren:

date
date | awk '{print $2,$3,$6}'

Wir werden die verwenden OFS (Ausgabefeldtrennzeichen) Variable, um ein Trennzeichen zwischen Monat, Tag und Jahr zu setzen. Beachten Sie, dass wir den Befehl unten in einfache Anführungszeichen ('), keine geschweiften Klammern ({}):

date | awk 'OFS="https://www.howtogeek.com/" {print$2,$3,$6}'
date | awk 'OFS="-" {print$2,$3,$6}'

Die BEGIN- und END-Regeln

EIN BEGIN Die Regel wird einmal ausgeführt, bevor die Textverarbeitung beginnt. Tatsächlich wurde es vorher ausgeführt awk liest sogar jeden Text. Ein END Die Regel wird ausgeführt, nachdem die gesamte Verarbeitung abgeschlossen ist. Sie können mehrere haben BEGIN und END Regeln, und sie werden der Reihe nach ausgeführt.


Für unser example von a BEGIN Regel drucken wir das gesamte Zitat aus der dennis_ritchie.txt Datei, die wir zuvor mit einem Titel darüber verwendet haben.

Dazu geben wir diesen Befehl ein:

awk 'BEGIN {print "Dennis Ritchie"} {print $0}' dennis_ritchie.txt

Beachten Sie das BEGIN Die Regel hat einen eigenen Satz von Aktionen, der in seine eigenen geschweiften Klammern eingeschlossen ist ({}).

Wir können dieselbe Technik mit dem Befehl verwenden, den wir zuvor verwendet haben, um die Ausgabe von weiterzuleiten who hinein awk. Dazu geben wir Folgendes ein:

who | awk 'BEGIN {print "Active Sessions"} {print $1,$4}'

Eingabefeldtrennzeichen

Falls Sie es wollen awk Um mit Text zu arbeiten, der keine Leerzeichen zum Trennen von Feldern verwendet, müssen Sie ihm mitteilen, welches Zeichen der Text als Feldtrennzeichen verwendet. Zum example, das /etc/passwd Datei verwendet einen Doppelpunkt (:) um Felder zu trennen.

Wir verwenden diese Datei und die -F (Trennzeichenfolge) Option zu sagen awk den Doppelpunkt verwenden (:) als Trennzeichen. Wir geben Folgendes ein, um es zu erzählen awk um den Namen des Benutzerkontos und des Home-Ordners auszudrucken:

awk -F: '{print $1,$6}' /etc/passwd

Die Ausgabe enthält den Namen des Benutzerkontos (oder den Namen der Anwendung oder des Daemons) und den Home-Ordner (oder den Speicherort der Anwendung).

Muster hinzufügen

Wenn wir nur an normalen Benutzerkonten interessiert sind, können wir unserer Druckaktion ein Muster hinzufügen, um alle anderen Einträge herauszufiltern. Weil Benutzeridentifikation Zahlen gleich oder größer als 1.000 sind, können wir unseren Filter auf diesen Informationen aufbauen.


Wir geben Folgendes ein, um unsere Druckaktion nur auszuführen, wenn das dritte Feld ($3) enthält einen Wert von 1.000 oder höher:

awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd

Das Muster sollte unmittelbar vor der Aktion stehen, mit der es verknüpft ist.

Wir können die nutzen BEGIN Regel, um unserem kleinen Bericht einen Titel zu geben. Wir geben Folgendes ein, indem wir die (n) Notation, um ein Newline-Zeichen in die Titelzeichenfolge einzufügen:

awk -F: 'BEGIN {print "User Accountsn-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd

Muster sind vollwertig Reguläre Ausdrücke, und sie sind eine der Herrlichkeiten von awk.

Nehmen wir an, wir möchten die universell eindeutigen Bezeichner (UUIDs) der eingehängten Dateisysteme sehen. Wenn wir die durchsuchen /etc/fstab Datei für das Vorkommen der Zeichenfolge “UUID”, sollte diese Informationen für uns zurückgegeben werden.

Wir verwenden das Suchmuster „/UUID/“ in unserem Befehl:

awk '/UUID/ {print $0}' /etc/fstab


Es findet alle Vorkommen von „UUID“ und gibt diese Zeilen aus. Ohne die hätten wir eigentlich das gleiche Ergebnis bekommen print action, da die Standardaktion die gesamte Textzeile druckt. Aus Gründen der Übersichtlichkeit ist es jedoch oft nützlich, explizit zu sein. Wenn Sie ein Skript oder Ihre Verlaufsdatei durchsehen, werden Sie froh sein, selbst Hinweise hinterlassen zu haben.

Die erste gefundene Zeile war eine Kommentarzeile, und obwohl die Zeichenfolge „UUID“ in der Mitte steht, awk habe es noch gefunden. Wir können den regulären Ausdruck optimieren und sagen awk um nur Zeilen zu verarbeiten, die mit „UUID“ beginnen. Dazu geben wir Folgendes ein, das das Start-of-Line-Token (^):

awk '/^UUID/ {print $0}' /etc/fstab

Das ist besser! Jetzt sehen wir nur echte Montageanleitungen. Um die Ausgabe noch weiter zu verfeinern, geben wir Folgendes ein und beschränken die Anzeige auf das erste Feld:

awk '/^UUID/ {print $1}' /etc/fstab

Wenn wir mehrere Dateisysteme auf diesem Computer gemountet hätten, würden wir eine übersichtliche Tabelle ihrer UUIDs erhalten.

Eingebaute Funktionen

awk hat viele Funktionen, die Sie in Ihren eigenen Programmen aufrufen und verwenden können, sowohl von der Befehlszeile als auch in Skripten. Wenn Sie etwas graben, werden Sie es sehr fruchtbar finden.

Um die allgemeine Technik zum Aufrufen einer Funktion zu demonstrieren, betrachten wir einige numerische. Zum example, das Folgende gibt die Quadratwurzel von 625 aus:

awk 'BEGIN { print sqrt(625)}'


Dieser Befehl gibt den Arkustangens von 0 (Null) und -1 (was zufällig die mathematische Konstante pi ist) aus:

awk 'BEGIN {print atan2(0, -1)}'

Im folgenden Befehl modifizieren wir das Ergebnis der atan2() Funktion, bevor wir sie drucken:

awk 'BEGIN {print atan2(0, -1)*100}'

Funktionen können Ausdrücke als Parameter akzeptieren. Zum example, hier ist eine komplizierte Methode, um nach der Quadratwurzel von 25 zu fragen:

awk 'BEGIN { print sqrt((2+3)*5)}'

awk-Skripte

Wenn Ihre Befehlszeile kompliziert wird oder Sie eine Routine entwickeln, von der Sie wissen, dass Sie sie wieder verwenden möchten, können Sie Ihre awk Befehl in ein Skript.

In unserer example Skript werden wir alle folgenden Schritte ausführen:

  • Teilen Sie der Shell mit, welche ausführbare Datei zum Ausführen des Skripts verwendet werden soll.
  • Vorbereiten awk um die zu benutzen FS Feldtrennvariable zum Lesen von Eingabetext mit durch Doppelpunkte getrennten Feldern (:).
  • Verwenden Sie die OFS Ausgabefeldtrennzeichen zu sagen awk Doppelpunkte verwenden (:), um Felder in der Ausgabe zu trennen.
  • Setzen Sie einen Zähler auf 0 (Null).
  • Setzen Sie das zweite Feld jeder Textzeile auf einen leeren Wert (es ist immer ein „x“, damit wir es nicht sehen müssen).
  • Drucken Sie die Zeile mit dem geänderten zweiten Feld.
  • Erhöhen Sie den Zähler.
  • Drucken Sie den Wert des Zählers.

Unser Skript ist unten gezeigt.

Beispiel für ein awk-Skript in einem Editor.

Die BEGIN Regel führt die vorbereitenden Schritte durch, während die END Regel zeigt den Zählerwert an. Die mittlere Regel (die weder einen Namen noch ein Muster hat, sodass sie zu jeder Zeile passt) modifiziert das zweite Feld, druckt die Zeile und erhöht den Zähler.


Die erste Zeile des Skripts teilt der Shell mit, welche ausführbare Datei verwendet werden soll (awk, in unserer example), um das Skript auszuführen. Es besteht auch die -f (Dateiname) Option zu awk, die ihm mitteilt, dass der zu verarbeitende Text aus einer Datei stammt. Wir übergeben den Dateinamen an das Skript, wenn wir es ausführen.

Wir haben das Skript unten als Text eingefügt, damit Sie es ausschneiden und einfügen können:

#!/usr/bin/awk -f

BEGIN {
  # set the input and output field separators
  FS=":"
  OFS=":"
  # zero the accounts counter
  accounts=0
}
{
  # set field 2 to nothing
  $2=""
  # print the entire line
  print $0
  # count another account
  accounts++
}
END {
  # print the results
  print accounts " accounts.n"
}

Speichern Sie dies in einer Datei namens omit.awk. Zu das Skript ausführbar machene, geben wir Folgendes ein mit chmod:

chmod +x omit.awk

Jetzt führen wir es aus und übergeben die /etc/passwd Datei zum Skript. Das ist die Datei awk wird für uns unter Verwendung der Regeln innerhalb des Skripts verarbeiten:

./omit.awk /etc/passwd

Die Datei wird verarbeitet und jede Zeile wird angezeigt, wie unten gezeigt.


Die „x“-Einträge im zweiten Feld wurden entfernt, aber beachten Sie, dass die Feldtrennzeichen noch vorhanden sind. Die Zeilen werden gezählt und die Summe wird unten in der Ausgabe angezeigt.

awk steht nicht für peinlich

awk steht nicht für peinlich; es steht für eleganz. Es wurde als Verarbeitungsfilter und Berichtschreiber beschrieben. Genauer gesagt handelt es sich um beides, oder besser gesagt um ein Werkzeug, das Sie für beide Aufgaben verwenden können. In nur wenigen Zeilen, awk erreicht, was umfangreiche Codierung in einer traditionellen Sprache erfordert.

Diese Macht wird durch das einfache Konzept von Regeln genutzt, die Muster enthalten, die den zu verarbeitenden Text auswählen und Aktionen, die die Verarbeitung definieren.

Linux-Befehle
DateienTeer · pv · Katze · tac · chmod · grep · unterschied · sed · Mit · Mann · geschoben · popd · fsck · Testdisk · seq · fd · pandoc · CD · $PFAD · awk · beitreten · jq · falten · einzigartig · journalctl · Schwanz · stat · ls · fstab · Echo · weniger · chgrp · chown · Rev · aussehen · Saiten · Typ · umbenennen · Postleitzahl · entpacken · montieren · ummount · Installieren · fdisk · mkfs · rm · rmdir · rsync · df · gpg · wir · Nano · mkdir · von · ln · Patch · Konvertieren · rclon · Fetzen · srm
Prozessealias · Bildschirm · oben · nett · renice · Fortschritt · strace · System · tmux · chsh · Geschichte · bei · Charge · kostenlos · welcher · dmesg · chfn · Benutzermod · ps · chroot · xargs · tty · kleiner Finger · lsof · vmstat · Auszeit · Mauer · Jawohl · töten · Schlaf · sudo · es ist · Zeit · groupadd · Benutzermod · Gruppen · lshw · abschalten · neustarten · Halt · ausschalten · passwd · lscpu · crontab · Datum · bg · fg
Vernetzungnetstat · Klingeln · Traceroute · ip · ss · Wer ist · fail2ban · bmon · Sie · Finger · nmap · ftp · curl · wget · Wer · Wer bin ich · w · iptables · ssh-keygen · ufw

Beste Linux-Laptops für Entwickler und Enthusiasten

Related Posts