Heim > php教程 > PHP开发 > Hauptteil

Verwendung des awk-Befehls in der Linux-Shell

高洛峰
Freigeben: 2016-12-15 11:35:05
Original
1684 Leute haben es durchsucht

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:

Verwendung des awk-Befehls in der Linux-Shell

Die Ergebnisse der Skriptausführung sind wie folgt:

Verwendung des awk-Befehls in der Linux-Shell

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

Verwendung des awk-Befehls in der Linux-Shell

Wenn nur das Konto von /etc/passwd und die dem Konto entsprechende Shell angezeigt werden und Konto und Shell durch die Tabulatortaste getrennt sind

Verwendung des awk-Befehls in der Linux-Shell

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

Verwendung des awk-Befehls in der Linux-Shell

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

Verwendung des awk-Befehls in der Linux-Shell

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“.

Verwendung des awk-Befehls in der Linux-Shell

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)

Verwendung des awk-Befehls in der Linux-Shell

Beispiel 4: Suche /etc/passwd für root Alle Zeilen des Schlüsselworts

Verwendung des awk-Befehls in der Linux-Shell

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:

Verwendung des awk-Befehls in der Linux-Shell

Suchen Sie nach allen Zeilen mit dem Root-Schlüsselwort in /etc/passwd und Zeigen Sie die entsprechende Shell an

Verwendung des awk-Befehls in der Linux-Shell

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:

Verwendung des awk-Befehls in der Linux-Shell

Verwenden Sie den Befehl awk, um Benutzernamen und IP-Bereichsdaten zu extrahieren

Verwendung des awk-Befehls in der Linux-Shell

oder

Verwendung des awk-Befehls in der Linux-Shell

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:

Verwendung des awk-Befehls in der Linux-Shell

Zeigt die Datensätze aller Konten mit ihrer Nummer an und drucke sie aus der Eingabedateiname im END-Abschnitt

Verwendung des awk-Befehls in der Linux-Shell

Zusätzlich zu den integrierten Variablen von awk kann awk auch Variablen anpassen


Beispiel 7: Anzahl der Konten in /etc/passwd zählen

Verwendung des awk-Befehls in der Linux-Shell

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:

Verwendung des awk-Befehls in der Linux-Shell

Beispiel 8: Statistiken unter a bestimmter Ordner Die Anzahl der von der Datei belegten Bytes

Verwendung des awk-Befehls in der Linux-Shell

Wenn in M ​​angezeigt:

Verwendung des awk-Befehls in der Linux-Shell

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:

Verwendung des awk-Befehls in der Linux-Shell

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage