Wie Verwenden Sie den awk-Befehl unter Linux

0
426
Fatmawati Achmad Zaenuri/Shutterstock

Auf Linux, awk ist ein command-line-text-manipulation dynamo, sowie eine leistungsstarke scripting-Sprache. Hier ist eine Einführung zu einigen der coolsten features.

Wie awk zu Seinem Namen Kam

Der awk-Befehl benannt wurde, mit den Initialen der drei Menschen, die schrieb die ursprüngliche version von 1977: Alfred Aho, Peter Weinberger und Brian Kernighan. Diese drei Männer wurden von den legendären AT&T Bell Labs Unix pantheon. Mit den Beiträgen von vielen anderen, da dann auch awk hat sich weiter entwickeln.

Es ist eine vollständige Skriptsprache, sowie eine komplette text-manipulation toolkit für die Kommandozeile. Wenn dieser Artikel Lust haben, können Sie überprüfen, jedes detail über awk und seine Funktionalität.

Regeln, Muster und Aktionen

awk arbeitet auf Programme, die Regeln enthalten, die aus mustern und Aktionen. Die Aktion wird ausgeführt, auf den text, der dem Muster entspricht. Muster sind in geschweifte Klammern eingeschlossen ({}). Zusammen, einem Muster und einer Aktion bilden eine Regel. Die gesamte awk-Programm ist eingeschlossen in einfache Anführungszeichen (‘).

Werfen wir einen Blick auf die einfachste Art der awk-Programm. Es hat kein Muster, so entspricht jede Zeile zugeführt es. Das bedeutet die Aktion wird ausgeführt, auf jeder Linie. Wir verwenden es auf der Ausgabe des who-Befehls.

Hier ist die standard-Ausgabe aus, die:

wer

Vielleicht brauchen wir nicht alle, dass Informationen, sondern wollen einfach nur, um zu sehen, die Namen auf den Konten. Wir können leiten Sie die Ausgabe aus, die in awk, und dann sagen awk zu drucken, wird nur das erste Feld.

Standardmäßig awk die Auffassung, dass ein Feld einen string von Zeichen umgeben von Leerzeichen am Anfang der Zeile oder das Ende einer Zeile. Felder sind gekennzeichnet durch ein dollar-Zeichen ($) und eine Zahl. So, $1 für das erste Feld, die wir verwenden werden, mit der Aktion drucken: drucken der ersten Bereich.

Wir geben Sie den folgenden:

who | awk ‘{print $1}’

awk druckt das erste Feld aus und löscht den rest der Zeile.

Wir drucken können so viele Felder, wie wir. Wenn wir fügen Sie ein Komma als Trennzeichen, awk druckt ein Leerzeichen zwischen jedem Feld.

Wir geben Sie den folgenden zu drucken, die Zeit, die person angemeldet (Feld vier):

who | awk ‘{print $1,$4}’

Es gibt ein paar spezielle Feld-IDS. Diese repräsentieren die gesamte Linie der text und das Letzte Feld in der Zeile der text:

  • $0: Repräsentiert die gesamte Linie der text.
  • $1: für das erste Feld.
  • $2: ist das zweite Feld.
  • $7: Repräsentiert die siebte Feld.
  • $45: Steht für den 45-Feld.
  • $NF: Steht für “Anzahl der Felder”, und stellt das Letzte Feld.

Wir werden geben Sie den folgenden, um eine kleine Textdatei, die enthält ein kurzes Zitat zugeschrieben Dennis Ritchie:

Katze dennis_ritchie.txt

Wir wollen awk zum drucken der ersten, zweiten und letzten Feld zitieren. Beachten Sie, dass obwohl es gewickelt in das terminal-Fenster, es ist nur eine einzige Zeile text.

Wir geben Sie den folgenden Befehl ein:

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

Wir wissen nicht, dass “Einfachheit.” ist dem 18-Feld in der Zeile des Textes, und wir don ‘ T care. Was wir wissen ist, dass dies das Letzte Feld, und wir können mit $NF zu erhalten seinen Wert. Die Frist ist nur als ein weiteres Zeichen in den Körper des Feldes.

Hinzufügen Ausgabe Feld-Trennzeichen

Man kann auch sagen, awk drucken wird ein bestimmtes Zeichen zwischen den Feldern, anstatt der Standard-Leerzeichen. Die Standard-Ausgabe aus dem Befehl “date” ist etwas eigenartig, denn die Zeit ist plonked rechts in der Mitte. Jedoch können wir geben Sie den folgenden und Verwendung awk extrahieren Sie die Felder, die wir wollen:

Datum
Datum | awk ‘{print $2,$3,$6}’

Wir verwenden die OFS (output field separator) variable setzen Sie ein Trennzeichen zwischen Tag, Monat und Jahr. Beachten Sie, dass wir unten schließen Sie den Befehl in einfache Anführungszeichen (‘), nicht die geschweiften Klammern ({}):

Datum | awk ‘OFS=”/” {print$2,$3,$6}’
Datum | awk ‘OFS=”-” {print$2,$3,$6}’

Die BEGIN-und ENDE-Regeln

Einer BEGIN-Regel, die ausgeführt wird, sobald vor jeder text beginnt die Verarbeitung. In der Tat, es ist ausgeführt, bevor awk liest sogar jeden text. Eine ENDE-Regel wird ausgeführt, nachdem alle die Bearbeitung abgeschlossen ist. Sie können mehrere BEGIN-und END-Regeln, und Sie werden ausführen, um.

Für unser Beispiel von einer BEGIN-Regel, drucken wir das gesamte Zitat aus dem dennis_ritchie.txt Datei, die wir zuvor verwendet, mit einem Titel oben es.

Dazu geben wir diesen Befehl ein:

awk ‘BEGIN {print “Dennis Ritchie”} {print $0}’ dennis_ritchie.txt

Hinweis: die BEGIN-Regel hat seinen eigenen Satz von Aktionen, eingeschlossen in seinen eigenen Satz von geschweiften Klammern ({}).

Wir können diese gleiche Technik, mit dem Befehl, den wir zuvor verwendet, um Rohr-Ausgang aus, die in awk. Dazu geben wir die folgenden:

who | awk ‘BEGIN {print “Aktive Sitzungen”} {print $1,$4}’

Input Feld-Separatoren

Wenn Sie möchten, awk, um die Arbeit mit text, der keine Leerzeichen zum trennen der Felder, man muss es sagen, welchen Charakter der text verwendet, der im Feld Trennzeichen. Zum Beispiel, das /etc/passwd-Datei verwendet einen Doppelpunkt (:) getrennte Felder.

Wir werden diese Datei verwenden, und die -F (Trennzeichen) option zu sagen, awk zu verwenden den Doppelpunkt (:) als Trennzeichen. Wir geben das folgende zu sagen awk drucken den Namen des Benutzerkontos und der des home-Ordners:

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

Die Ausgabe enthält den Namen des Benutzerkontos (oder Anwendung oder daemon-Namen) und die home-Ordner (oder den Ort der Anwendung).

Hinzufügen Muster

Wenn wir interessiert sind, sind regelmäßige Benutzerkonten können wir ein Muster-mit unseren print-Aktion, um herauszufiltern, alle anderen Einträge. Da Benutzer-ID-Nummern sind gleich, oder größer als 1.000 ist, können wir unsere filter auf diese Informationen.

Wir geben Sie den folgenden zur Ausführung unserer print-Aktion nur dann, wenn das Dritte Feld ($3) enthält, die einen Wert von 1.000 oder größer:

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

Das Muster sollte unmittelbar vor der Handlung, mit der Sie verbunden ist.

Wir können die BEGIN-Regel, geben Sie einen Titel für unseren kleinen Bericht. Wir geben Sie den folgenden, mit (n) – notation zum einfügen einer neue-Zeile-Zeichen in den Titel-string:

awk -F: ‘BEGIN {print “User Accountsn————-“} $3 >= 1000 {print $1,$6}’ /etc/passwd

Muster sind vollwertige reguläre Ausdrücke, und Sie sind eine der Herrlichkeiten von awk.

Sagen wir, wir wollen, um zu sehen, die universally unique identifiers (UUIDs) der gemounteten Dateisysteme. Wenn wir uns auf die Suche durch die Datei /etc/fstab für das vorkommen der Zeichenfolge “UUID” es sollte zurückgeben, dass Informationen für uns.

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

awk ‘/UUID/ {print $0}’ /etc/fstab

Es findet alle vorkommen von “UUID” und druckt diese Zeilen. Wir eigentlich hätten bekommen das gleiche Ergebnis, ohne die print-Aktion, weil die default-Aktion druckt die gesamte Linie der text. Für Klarheit, obwohl, ist es oft nützlich zu explizit sein. Beim Blick durch ein Skript oder Ihre history-Datei, werden Sie froh, dass Sie Links die Hinweise für sich selbst.

Die erste Zeile fand, war ein Kommentar, und zwar die “UUID” string ist in der Mitte, awk fand es aber trotzdem. Wir optimieren können, die dem regulären Ausdruck und sagen awk verarbeitet nur Zeilen, die beginnen mit “UUID.” Dazu geben wir das folgende, das umfassen die start-of-line-token (^):

awk ‘/^ – UUID/ {print $0}’ /etc/fstab

Das ist besser!! Jetzt sehen wir nur echte mount-Anweisungen. Verfeinern Sie die Ausgabe noch weiter, wir geben Sie Folgendes ein, und beschränken Sie die Anzeige auf das erste Feld:

awk ‘/^ – UUID/ {print $1}’ /etc/fstab

Wenn wir hatten mehrere Datei-Systeme montiert, die auf dieser Maschine, wir bekommen würde, eine ordentliche Tabelle Ihrer UUIDs.

Built-In-Funktionen

awk hat viele Funktionen können Sie aufrufen und verwenden in eigenen Programmen, die beide von der Befehlszeile und in scripts. Wenn Sie einige Graben, werden Sie finden es sehr fruchtbar.

Zum Nachweis der Allgemeinen Technik eine Funktion aufrufen, sehen wir uns einige numerische lieben. Zum Beispiel, die folgenden druckt die Quadratwurzel von 625:

awk ‘BEGIN { print sqrt(625)}’

Dieses Kommando gibt den Arkustangens von 0 (null) und -1 (das passiert zu sein, die mathematische Konstante, pi):

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

In den folgenden Befehl ein, wir ändern das Ergebnis von atan2 () – Funktion, bevor wir es drucken:

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

Funktionen annehmen können Ausdrücke als Parameter verwendet werden. Zum Beispiel, hier ist eine verwickelte Weise zu Fragen, für die Quadratwurzel von 25:

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

awk-Skripten

Wenn Ihre Kommandozeile kompliziert, oder entwickeln Sie eine routine, die Sie wissen, werden Sie wollen, wieder verwenden, übertragen Sie Ihre awk-Befehl in einem Skript.

In unserem Beispiel-Skript, das werden wir auch tun alle der folgenden:

  • Sagen die shell die ausführbare Datei zu verwenden, um das Skript auszuführen.
  • Bereiten awk verwenden Sie die FS-field separator variable zu Lesen Sie die Eingabe von text mit Feldern, getrennt durch Doppelpunkte (:).
  • Verwenden des OFS-output field separator zu sagen, awk zu verwenden, Doppelpunkte (:) zum trennen der Felder in der Ausgabe.
  • Setzen Sie einen Zähler auf 0 (null).
  • Legen Sie das zweite Feld jeder Zeile des Textes einen leeren Wert (es ist immer ein “x”, so dass wir nicht brauchen, um es zu sehen).
  • Drucken Sie die Zeile mit dem modifizierten zweiten Bereich.
  • Inkrementieren Sie den Zähler.
  • Drucken Sie den Wert des Zählers.

Unser Skript ist unten gezeigt.

Die BEGIN-Regel führt die vorbereitenden Schritte, während der ENDE-Regel zeigt der Zähler Wert. Die Mitte-Regel (die keine Namen, noch Muster, so entspricht jede Zeile) ändert das zweite Feld, druckt die Zeile und erhöht den Zähler.

Die erste Zeile des Skripts teilt der shell die ausführbare Datei zu verwenden (awk, in unserem Beispiel), um das Skript auszuführen. Es geht auch das -f (filename) option, awk, die informiert es den text, es wird zum Prozess kommen aus einer Datei. Wir übergeben den Dateinamen, um das Skript aus, wenn wir es ausführen.

Wir haben das script unten als text, so dass Sie schneiden kann und einfügen:

#!/usr/bin/awk -f

BEGIN {
# stellen Sie die input-und output-Feld-Separatoren
FS=”:”
OFS=”:”
# null die Konten Zähler
Konten=0
}
{
# set Feld 2 um nichts
$2=””
# drucken Sie die gesamte Zeile
print $0
# count ein anderes Konto
Konten++
}
END {
# drucken Sie die Ergebnisse
Konten drucken ” – Konto.n”
}

Speichern Sie diese in einer Datei namens weglassen.awk. Machen Sie das Skript ausführbar ist, geben wir im folgenden mit chmod:

chmod +x weglassen.awk

Nun, wir werden es ausführen, und übergeben Sie die /etc/passwd-Datei zu dem Skript. Dies ist die Datei awk-Prozess für uns, über die Regeln innerhalb der script:

./weglassen.awk /etc/passwd

Die Datei wird bearbeitet und jede Zeile wird angezeigt, wie unten dargestellt.

Die “x” – Einträge in das zweite Feld entfernt wurden, aber beachten Sie die Feld-Separatoren sind noch vorhanden. Die Zeilen werden gezählt und die Summe ist unten der Ausgang.

awk Stand nicht für Ungeschickt

awk nicht besonders schwer, es steht für Eleganz. Es ist beschrieben worden, als processing-filter und report-writer. Genauer gesagt, es ist beides, oder besser gesagt, ein Werkzeug, das Sie verwenden können, für diese beiden Aufgaben. In nur ein paar Zeilen awk erreicht, was erfordert aufwändige Programmierung in einer traditionellen Sprache.

Diese Kraft wird genutzt, indem das einfache Konzept von Regeln, enthalten Muster, das Sie wählen den text zu verarbeiten, und die Aktionen definieren, die Verarbeitung.

LESEN SIE WEITER

  • › Wie zu Erkunden Städten in Apple Maps Mit Schauen Sie sich Um
  • › Wird die EU Apple Loswerden Blitz auf dem iPhone?
  • › Wie Finden Sie Alle Ihre Gespeicherten WLAN-Passwörter auf macOS
  • “Was Bedeutet “NGL” Bedeuten, und Wie Verwenden Sie Es?
  • › Wie Benutze ich Google Chrome die Neue Deep-Linking-Funktion