awk-Befehl
awk ist auch ein Datenverarbeitungstool! Im Vergleich zu sed, das oft eine ganze Zeile verarbeitet, bevorzugt awk die Verarbeitung einer Zeile, die in mehrere Felder unterteilt ist.
Die grundlegendste Funktion der awk-Sprache besteht darin, Informationen basierend auf angegebenen Regeln in Dateien oder Zeichenfolgen zu zerlegen und zu extrahieren. Außerdem können Daten basierend auf angegebenen Regeln ausgegeben werden.
Es gibt drei Möglichkeiten, awk anzurufen
1. Befehlszeilenmodus
awk [-F Feldtrennzeichen] 'Befehle' Eingabedateien
Unter diesen ist [-F Feldtrennzeichen] optional, da awk standardmäßig Leerzeichen oder Tabulatortasten verwendet Domänentrennzeichen: Wenn Sie Text mit Leerzeichen zwischen Feldern durchsuchen möchten, müssen Sie diese Option nicht angeben. Wenn Sie eine Datei wie passwd durchsuchen möchten, in der Doppelpunkte als Trennzeichen für jede Domäne verwendet werden, müssen Sie -F angeben Option, wie zum Beispiel: awk -F: Eingabedatei „Befehle“.
Hinweis: Im Linux-System wird die Umgebungsvariable IFS zum Speichern des Trennzeichens verwendet, der Wert von IFS kann jedoch auch entsprechend der tatsächlichen Anwendung geändert werden
Zum Beispiel:
Die Ergebnisse der Skriptausführung sind wie folgt:
commands ist der eigentliche awk-Befehl, input-files ist die Datei, zu der verarbeitet werden.
iput_files kann eine Dateiliste mit mehr als einer Datei sein, und awk verarbeitet jede Datei in der Liste der Reihe nach.
In awk wird in jeder Zeile der Datei jedes durch ein Feldtrennzeichen getrennte Element als Feld bezeichnet. Ohne Angabe des Feldtrennzeichens -F ist das Standardfeldtrennzeichen normalerweise Leerzeichen oder Tabulator.
2. Die Shell-Skriptmethode
fügt alle awk-Befehle in eine Datei ein, macht das awk-Programm ausführbar und verwendet dann den awk-Befehlsinterpreter als erste Zeile des Skripts, das durch Eingabe des Skriptnamens aufgerufen wird.
entspricht der ersten Zeile des Shell-Skripts: #!/bin/sh kann ersetzt werden durch: #!/bin/awk
3 . Fügen Sie alle awk-Befehle in eine einzige Datei ein und rufen Sie dann auf:
Awk -f awk-script-file input-files
Unter anderem lädt die Option -f awk in awk-script- Datei Das Skript und die Eingabedateien sind die gleichen wie oben.
Muster und Aktionen von awk
Jede awk-Anweisung besteht aus Mustern und Aktionen (awk_pattern { Aktionen }) .
Ein awk-Skript kann viele Anweisungen enthalten.
Der Modusteil bestimmt, wann die Aktionsanweisung auslöst und löst das Ereignis aus. Unter Verarbeitung versteht man die an Daten ausgeführten Vorgänge. Wenn der Modusteil weggelassen wird, wird die Aktion jederzeit ausgeführt. Das heißt, wenn es weggelassen wird, werden die entsprechenden Aktionen ausgeführt, ohne dass die Eingabedatensätze abgeglichen und verglichen werden.
Das Muster kann eine beliebige bedingte Anweisung oder ein regulärer Ausdruck usw. sein. awk_pattern kann von den folgenden Typen sein:
1) Regulärer Ausdruck wird als awk_pattern:/regexp/ verwendet.
Zum Beispiel: awk '/^[a-z ] /' input_file
2) Boolescher Ausdruck wird als awk_pattern verwendet. Wenn der Ausdruck erstellt wird, wird die Ausführung entsprechender Aktionen ausgelöst.
① Sie können Variablen (z. B. Feldvariablen $1, $2 usw.) und /regexp/
② Operatoren in booleschen Ausdrücken verwenden:
Relationaler Operator: = == !=
Passender Operator: Wert ~ /regexp/ Wenn der Wert mit /regexp/ übereinstimmt, gebe true zurück
Wert !~ /regexp/ Wenn der Wert nicht mit /regexp/ übereinstimmt, geben Sie true zurück
Zum Beispiel: awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/ {print"ok "}' input_file
③ && (und) und || (oder) können zwei /regexp/ oder boolesche Ausdrücke verbinden, um einen gemischten Ausdruck zu bilden. !(not) kann in booleschen Ausdrücken oder vor /regexp/ verwendet werden.
Zum Beispiel: awk '($1 10) {print "ok"}' input_file
awk '/^d/ |. |. /x$/ {print "ok"}' input_file
Muster enthält zwei spezielle Felder BEGIN und END. Verwenden Sie die BEGIN-Anweisung, um die Anzahl und den Druckkopf festzulegen. Die BEGIN-Anweisung wird vor jeder Text-Browsing-Aktion verwendet, wonach die Text-Browsing-Aktion basierend auf dem Eingabetext ausgeführt wird. Die END-Anweisung wird verwendet, um die Gesamtzahl der Texte und das Endstatus-Flag auszudrucken, nachdem awk die Textdurchsuchungsaktion abgeschlossen hat.
Die eigentliche Aktion wird in geschweiften Klammern { } angegeben. Zum Drucken werden meist Aktionen verwendet, es gibt aber auch längere Codes wie if- und Loop-Anweisungen sowie Loop-Exit-Strukturen. Wenn keine Aktion angegeben ist, druckt awk alle durchsuchten Datensätze aus.
Wenn awk ausgeführt wird, wird seine Browserdomäne als $1, $2...$n markiert. Diese Methode wird als Domänenidentifizierung bezeichnet. Die Verwendung dieser Domänenkennungen erleichtert die weitere Bearbeitung der Domäne.
Verwenden Sie $1 und $3, um auf das 1. und 3. Feld zu verweisen. Beachten Sie, dass Kommas zur Trennung der Felder verwendet werden. Wenn Sie alle Felder eines Datensatzes mit 5 Feldern
drucken möchten, müssen Sie nicht $1, $2, $3, $4, $5 angeben. Sie können $0 verwenden, was alle Felder bedeutet.
Um ein Feld oder alle Felder zu drucken, verwenden Sie den Druckbefehl. Dies ist eine awk-Aktion
Der laufende Prozess von awk:
① Wenn der BEGIN-Block vorhanden ist, führt awk die von ihm angegebenen Aktionen aus.
② awk liest eine Zeile aus der Eingabedatei, die als Eingabedatensatz bezeichnet wird. (Wenn die Eingabedatei weggelassen wird, wird sie aus der Standardeingabe gelesen)
③ awk teilt den gelesenen Datensatz in Felder auf, fügt das erste Feld in die Variable $1, das zweite Feld in $2 usw. ein An. $0 repräsentiert den gesamten Datensatz.
④ Vergleichen Sie den aktuellen Eingabedatensatz mit dem awk_pattern in jedem awk_cmd, um zu sehen, ob er übereinstimmt. Wenn er übereinstimmt, führen Sie die entsprechenden Aktionen aus. Wenn keine Übereinstimmung vorliegt, werden die entsprechenden Aktionen übersprungen, bis alle awk_cmds verglichen wurden.
⑤ Wenn ein Eingabedatensatz alle awk_cmd vergleicht, liest awk die nächste Zeile der Eingabe und wiederholt die Schritte ③ und ④. Dieser Vorgang wird fortgesetzt, bis awk das Ende der Datei liest.
⑥Nachdem awk alle Eingabezeilen gelesen hat und END vorhanden ist, werden die entsprechenden Aktionen ausgeführt.
Beispiel für den ersten Schritt:
Beispiel 1: Benutzernamen und Anmeldeshell in der Datei /etc/passwd anzeigen
Wenn nur das Konto von /etc/passwd und die dem Konto entsprechende Shell angezeigt werden und Konto und Shell durch die Tabulatortaste getrennt sind
Wenn nur /etc/ angezeigt wird. Der Benutzername und die Login-Shell in der passwd-Datei sowie das Konto und die Shell werden durch Kommas getrennt
Hinweis: awk gibt immer an die aus Standardausgabe: Wenn Sie möchten, dass awk in Dateien ausgibt, können Sie die Umleitung verwenden.
Beispiel 2: Zeigen Sie die Benutzernamen und Anmeldeshells aller Benutzer mit einer UID größer als 500 in der Datei /etc/passwd an
Beispiel 3: Wenn nur die Benutzernamen und Anmelde-Shells mit UID größer als 500 in der Datei /etc/passwd angezeigt werden, die Konten und Shells durch Kommas getrennt sind und die Spaltennamen Name und Shell hinzugefügt werden alle Zeilen und „blue,/bin/nosh“.
Hinweis:
1.awk wird von zwei einfachen Anführungszeichen und geschweiften Klammern {} gefolgt, um die Verarbeitungsaktion festzulegen, die Sie für die Daten ausführen möchten
2.awk-Workflow ist wie folgt: Führen Sie zuerst BEGING aus, lesen Sie dann die Datei, lesen Sie einen durch n Zeilenumbrüche getrennten Datensatz, teilen Sie den Datensatz dann entsprechend dem angegebenen Feldtrennzeichen in Felder auf und füllen Sie die Felder aus, die $0 darstellt Alle Domänen, $ 1 stellt die erste Domäne dar, $ n stellt die n-te Domäne dar und beginnt dann mit der Ausführung der dem Muster entsprechenden Aktion. Beginnen Sie dann mit dem Lesen des zweiten Datensatzes ... bis alle Datensätze gelesen sind, und führen Sie schließlich die END-Operation aus.
Denkfrage: So drucken Sie alle Datensätze (nehmen Sie den Inhalt in /etc/passwd als Beispiel)
Beispiel 4: Suche /etc/passwd für root Alle Zeilen des Schlüsselworts
sind Beispiele für die Verwendung von Muster. Nur Zeilen, die mit dem Muster übereinstimmen (hier root), führen eine Aktion aus (keine Aktion angegeben). Der Inhalt jeder Zeile wird standardmäßig ausgegeben).
Suche unterstützt reguläre Ausdrücke, zum Beispiel die Suche nach solchen, die mit root beginnen:
Suchen Sie nach allen Zeilen mit dem Root-Schlüsselwort in /etc/passwd und Zeigen Sie die entsprechende Shell an
Die hier angegebene Aktion ist {print $7}
Beispiel 5: Zeigen Sie die 5 am häufigsten an Letzte Anmeldungen am System Benutzerinformationen, nur Benutzername und IP-Adresse werden angezeigt
Verwenden Sie den letzten Befehl, um die zuletzt angemeldeten Benutzerinformationen anzuzeigen. Wie in der folgenden Abbildung gezeigt:
Verwenden Sie den Befehl awk, um Benutzernamen und IP-Bereichsdaten zu extrahieren
oder
Integrierte Awk-Variablen
Awk verfügt über viele integrierte Variablen zum Festlegen von Umgebungsinformationen. Nachfolgend sind einige der am häufigsten verwendeten Variablen aufgeführt.
DATEINAME Von awk durchsuchter Dateiname
FS Legen Sie das Trennzeichen für die Eingabedomäne fest, äquivalent zur Befehlszeilenoption -F
NF Anzahl der durchsuchten Domänen (jede Zeile ( $0) Gesamtzahl der besessenen Felder)
NR Anzahl der gelesenen Datensätze (welche Datenzeile von awk verarbeitet wird)
Beispiel 6: Statistics/etc/passwd : Dateiname, Zeilennummer jeder Zeile, Anzahl der Spalten jeder Zeile, entsprechender vollständiger Zeileninhalt:
Zeigt die Datensätze aller Konten mit ihrer Nummer an und drucke sie aus der Eingabedateiname im END-Abschnitt
Zusätzlich zu den integrierten Variablen von awk kann awk auch Variablen anpassen
Beispiel 7: Anzahl der Konten in /etc/passwd zählen
count ist eine benutzerdefinierte Variable. In der vorherigen Aktion {} gab es nur einen Druck. Tatsächlich ist print nur eine Anweisung, und Aktion {} kann mehrere Anweisungen enthalten, die durch ; getrennt sind.
Hier gibt es keine Initialisierung der Anzahl, obwohl der Standardwert 0 ist, ist es angemessen, ihn auf 0 zu initialisieren:
Beispiel 8: Statistiken unter a bestimmter Ordner Die Anzahl der von der Datei belegten Bytes
Wenn in M angezeigt:
Hinweis: Die obigen Statistiken Fügen Sie keine Unterdateien in das Verzeichnis ein.
Wenn Sie schnell die Länge aller Dateien und deren Summe sehen, aber Unterverzeichnisse ausschließen möchten, gehen Sie wie folgt vor: