Was ist awk? Ausführlichere Artikel zu AWK-Befehlen finden Sie auf der chinesischen PHP-Website!
Sie sind vielleicht mit UNIX vertraut, aber Sie sind vielleicht nicht mit awk vertraut. Das ist überhaupt nicht überraschend, verglichen mit seinen hervorragenden Funktionen Etwas Beliebtheit sein. Was ist awk? Im Gegensatz zu den meisten anderen UNIX-Befehlen ist es unmöglich, die Funktion von awk anhand seines Namens zu erkennen: Es handelt sich weder um ein englisches Wort mit eigenständiger Bedeutung noch um eine Abkürzung mehrerer verwandter Wörter. Tatsächlich ist awk die Abkürzung für die Namen dreier Personen: Aho, (Peter) Weinberg und (Brain) Kernighan. Es waren diese drei Leute, die awk entwickelt haben – ein hervorragendes Tool zum Scannen und Verarbeiten von Stilen.
Welche Funktionen hat AWK? Ähnlich wie sed und grep ist awk ein Werkzeug zum Scannen und Verarbeiten von Mustern. Aber seine Funktion ist viel stärker als die von sed und grep. Awk bietet äußerst leistungsstarke Funktionen: Es kann fast die gesamte Arbeit erledigen, die grep und sed leisten können. Gleichzeitig kann es auch Stilladungen, Flusskontrolle, mathematische Operatoren, Prozesskontrollanweisungen und sogar integrierte Variablen und Funktionen ausführen. . Es verfügt über fast alle schönen Funktionen, die eine vollständige Sprache haben sollte. Tatsächlich hat awk eine eigene Sprache: die Programmiersprache awk. Die drei Schöpfer von awk haben sie offiziell definiert als: Sprache zum Scannen und Verarbeiten von Stilen.
Warum awk verwenden?
Trotzdem fragen Sie sich vielleicht immer noch, warum ich awk verwenden sollte.
Der erste Grund, awk zu verwenden, ist das Scannen und Verarbeiten von Texten ist das, was wir oft tun. Die Arbeit von awk ähnelt einer Datenbank, aber im Gegensatz zu einer Datenbank haben diese Dateien kein spezielles Speicherformat und normale Leute können sie bearbeiten, lesen und verstehen sie verarbeiten. Datenbankdateien haben häufig spezielle Speicherformate, die den Einsatz eines Datenbankverarbeitungsprogramms zur Verarbeitung erforderlich machen. Da wir häufig auf diese Art von datenbankähnlicher Verarbeitungsarbeit stoßen, sollten wir einfache und unkomplizierte Möglichkeiten finden, damit umzugehen. UNIX verfügt in diesem Bereich über viele Tools wie sed, grep, sort, find usw., darunter auch awk Ein sehr ausgezeichnetes.
Der zweite Grund für die Verwendung von awk ist, dass awk ein einfaches Tool ist. Dies hängt natürlich mit seinen leistungsstarken Funktionen zusammen. Tatsächlich verfügt UNIX über viele hervorragende Tools. Beispielsweise sind das natürliche Entwicklungstool C und seine Fortsetzung C++ sehr hervorragend. Aber im Vergleich zu ihnen ist es mit awk viel bequemer und einfacher, dieselbe Funktion auszuführen. Dies liegt vor allem daran, dass awk Lösungen für eine Vielzahl von Anforderungen bietet: von der awk-Befehlszeile zur Lösung einfacher Probleme bis hin zur komplexen und exquisiten awk-Programmiersprache. Der Vorteil davon besteht darin, dass Sie zur Lösung keine komplizierten Methoden verwenden müssen Ansonsten sehr komplexe Probleme. Sie können beispielsweise eine Befehlszeile verwenden, um einfache Probleme zu lösen, C jedoch nicht. Selbst für ein einfaches Programm muss die C-Sprache den gesamten Prozess des Schreibens und Kompilierens durchlaufen. Zweitens wird awk selbst interpretiert und ausgeführt, was bedeutet, dass das awk-Programm den Kompilierungsprozess nicht durchlaufen muss. Gleichzeitig passt es dadurch auch gut zum Shell-Skriptprogramm. Schließlich ist awk selbst einfacher als die C-Sprache. Obwohl awk viele hervorragende Elemente der C-Sprache aufnimmt, wird es beim Erlernen von awk eine große Hilfe sein, mit der C-Sprache vertraut zu sein, aber awk selbst muss nicht die C-Sprache verwenden leistungsstarke, aber notwendige Entwicklungstools, deren Beherrschung viel Zeit in Anspruch nimmt.
Der dritte Grund für die Verwendung von awk ist, dass awk ein leicht verfügbares Tool ist. Im Gegensatz zu den Sprachen C und C++ verfügt awk nur über eine Datei (/bin/awk) und fast jede Version von UNIX bietet eine eigene Version von awk. Sie müssen sich keine Gedanken darüber machen, wie Sie an awk gelangen. Dies ist jedoch bei der C-Sprache nicht der Fall. Obwohl die C-Sprache ein natürliches Entwicklungstool für UNIX ist, wird dieses Entwicklungstool separat veröffentlicht. Mit anderen Worten: Sie müssen für Ihre UNIX-Version des C-Sprachentwicklungstools separat bezahlen für diejenigen, die natürlich die D-Version verwenden) ), besorgen Sie sich diese und installieren Sie sie, bevor Sie sie verwenden können.
Aufgrund der oben genannten Gründe, gepaart mit den leistungsstarken Funktionen von awk, haben wir Grund zu der Annahme, dass awk Ihre erste Wahl sein sollte, wenn Sie sich mit Arbeiten im Zusammenhang mit dem Scannen von Textstilen befassen möchten. Hier gilt ein allgemeiner Grundsatz: Wenn Sie Schwierigkeiten mit der Verwendung gewöhnlicher Shell-Tools oder Shell-Skripte haben, versuchen Sie es mit awk. Wenn awk das Problem immer noch nicht lösen kann, verwenden Sie die Sprache C. Wenn die Sprache C immer noch fehlschlägt, wechseln Sie zu C++.
So rufen Sie awk auf
Wie bereits erwähnt, bietet awk verschiedene Lösungen für verschiedene Anforderungen:
1. Sie können awk wie gewohnt verwenden Sie können die Programmiersprache awk auch in der Befehlszeile verwenden, es ist jedoch schwierig, eine lange Befehlszeile einzugeben und sicherzustellen, dass sie korrekt ist einfache Probleme lösen. Natürlich können Sie auch auf die awk-Befehlszeile oder sogar auf das awk-Programmskript im Shell-Skriptprogramm verweisen.
2. Verwenden Sie die Option -f, um das awk-Programm aufzurufen. Mit Awk können Sie ein Awk-Programm in eine Textdatei schreiben und dieses Programm dann mit der Option -f in der Awk-Befehlszeile aufrufen und ausführen. Die spezifische Methode wird später in der awk-Syntax erläutert.
3. Verwenden Sie den Befehlsinterpreter, um das awk-Programm aufzurufen: Mit der von UNIX unterstützten Befehlsinterpreterfunktion können wir ein awk-Programm in eine Textdatei schreiben und dann Folgendes hinzufügen:
zu seiner ersten Zeile#!/bin/awk -f
Und erteilen Sie dieser Textdatei die Ausführungsberechtigung. Anschließend können Sie dieses awk-Programm auf ähnliche Weise wie folgt über die Befehlszeile aufrufen und ausführen.
$awk-Skripttextname, der verarbeitet werden soll
Awk-Syntax:
Awk hat wie andere UNIX-Befehle seine eigene Syntax:
awk [ - F re] [parameter...] ['prog'] [-f progfile][in_file...]
Parameterbeschreibung:
-F re: Erlaube awk, seine Felder zu ändern Separator.
Parameter: Dieser Parameter hilft bei der Zuweisung von Werten zu verschiedenen Variablen.
'prog': awk-Programmanweisungssegment. Dieses Anweisungssegment muss in einzelne Erweiterungssymbole eingeschlossen werden: ' und ', um zu verhindern, dass es von der Shell interpretiert wird. Die Standardform dieses Programmanweisungssegments ist:
'pattern {action}'
Der Musterparameter kann jeder der regulären Egrep-Ausdrücke sein und kann mit der Syntax / hinzugefügt werden. re/ Besteht aus einigen Stilanpassungstechniken. Ähnlich wie bei sed können Sie auch "," verwenden, um zwei Stile zu trennen und einen Bereich auszuwählen. Einzelheiten zum Abgleich finden Sie im Anhang. Wenn Sie immer noch nicht verstehen, finden Sie ein UNIX-Buch zum Erlernen von grep und sed (ich habe die Matching-Technologie während meines Studiums beherrscht). Der Aktionsparameter ist immer in geschweifte Klammern eingeschlossen. Er besteht aus einer System-awk-Anweisung, getrennt durch „;“. awk interpretiert sie und führt seine Operationen an Datensätzen aus, die dem durch Muster angegebenen Muster entsprechen. Ähnlich wie bei der Shell können Sie auch „#“ als Kommentarzeichen verwenden, wodurch der Inhalt von „#“ bis zum Zeilenende zu einem Kommentar wird und bei der Interpretation und Ausführung ignoriert wird. Sie können entweder Muster oder Aktion weglassen, aber nicht beides gleichzeitig. Wenn Muster weggelassen wird, erfolgt kein Musterabgleich, was bedeutet, dass die Operation für alle Zeilen (Datensätze) ausgeführt wird durchgeführt - wird auf der Standardausgabe angezeigt.
-f progfile: Ermöglicht awk, die durch progfile angegebene Programmdatei aufzurufen und auszuführen. progfile ist eine Textdatei und muss der Syntax von awk entsprechen.
in_file: awk-Eingabedatei, awk ermöglicht die Verarbeitung mehrerer Eingabedateien. Es ist erwähnenswert, dass awk Eingabedateien nicht ändert. Wenn keine Eingabedatei angegeben ist, akzeptiert awk die Standardeingabe und zeigt die Ergebnisse auf der Standardausgabe an. awk unterstützt die Eingabe- und Ausgabeumleitung.
Datensätze, Felder und integrierte Variablen von Awk:
Wie bereits erwähnt, ähnelt die Verarbeitungsarbeit von awk der Verarbeitungsmethode der Datenbank. Eine der Ähnlichkeiten besteht darin, dass awk die Verarbeitung unterstützt von Datensätzen und Feldverarbeitung, die mit grep und sed nicht erreicht werden kann, ist einer der Gründe, warum awk besser ist als beide. In awk wird eine Zeile in einer Textdatei standardmäßig immer als Datensatz betrachtet und ein bestimmter Teil einer Zeile wird als Feld im Datensatz behandelt. Um diese verschiedenen Felder zu bedienen, leiht sich awk die Methode der Shell und verwendet $1, $2, $3 ..., um verschiedene Felder in der Zeile (im Datensatz) nacheinander darzustellen. Insbesondere verwendet awk $0, um die gesamte Zeile (Datensatz) darzustellen. Verschiedene Felder werden durch Zeichen, sogenannte Trennzeichen, getrennt. Das Standardtrennzeichen des Systems ist Leerzeichen. Mit Awk können Sie dieses Trennzeichen mithilfe der Form -F re in der Befehlszeile ändern. Tatsächlich verwendet awk eine integrierte Variable FS, um sich dieses Trennzeichen zu merken. Es gibt mehrere solcher integrierten Variablen in awk, wie z. B. die Datensatztrennvariable RS, die Anzahl der derzeit bearbeiteten Datensätze NR usw. Im Anhang am Ende dieses Artikels sind alle integrierten Variablen aufgeführt. Diese integrierten Variablen können im awk-Programm referenziert oder geändert werden. Sie können beispielsweise die Variable NR verwenden, um den Arbeitsbereich beim Mustervergleich anzugeben, oder Sie können das Datensatztrennzeichen RS ändern, um ein Sonderzeichen anstelle eines Zeilenumbruchs zu verwenden Zeichen als Datensatztrennzeichen.
Beispiel: Zeigen Sie das erste Feld, das dritte Feld und das siebte Feld getrennt durch das Zeichen % in der siebten bis fünfzehnten Zeile der Textdatei myfile an:
awk -F % ' NR ==7,NR==15 {printf $1 $3 $7}'
Die integrierten Funktionen von Awk
Einer der Gründe, warum awk zu einer hervorragenden Programmiersprache wird, ist, dass es absorbiert. Es gibt viele Vorteile einiger hervorragender Programmiersprachen wie C. Einer dieser Vorteile ist die Verwendung integrierter Funktionen. Durch die Verwendung dieser Funktionen sind die von awk bereitgestellten Funktionen vollständiger und leistungsfähiger Reihe integrierter String-Verarbeitungsfunktionen (diese Funktionen ähneln den String-Verarbeitungsfunktionen der C-Sprache und ihre Verwendung ähnelt den Funktionen in der C-Sprache). In Funktionen ist die Funktion von awk zur Verarbeitung von Zeichenfolgen leistungsfähiger. Der Anhang am Ende dieses Artikels listet die integrierten Funktionen von awk auf. Diese integrierten Funktionen können sich etwas von Ihrer Version von awk unterscheiden. Lesen Sie daher am besten die Online-Hilfe in Ihr System.
Als Beispiel für eine integrierte Funktion stellen wir hier die printf-Funktion von awk vor, die die Ausgabe von awk mit der C-Sprache konsistent macht. Tatsächlich sind viele Referenzformen in awk der C-Sprache entlehnt. Wenn Sie mit der C-Sprache vertraut sind, erinnern Sie sich vielleicht an die printf-Funktion. Die leistungsstarke Formatausgabefunktion hat uns viel Komfort gebracht. Zum Glück haben wir es in awk wieder getroffen. Printf in awk ist fast dasselbe wie in der C-Sprache. Wenn Sie mit der C-Sprache vertraut sind, können Sie printf in awk nach dem Muster der C-Sprache verwenden. Daher geben wir hier nur ein Beispiel. Wenn Sie damit nicht vertraut sind, suchen Sie sich bitte ein Einführungsbuch zur C-Sprache und lesen Sie es.
Beispiel: Zeilennummer und Feld 3 in der Datei myfile anzeigen:
$awk '{printf"%03d%s",NR,$1}' myfile
Verwenden von awk in der Befehlszeile
Der Reihe nach sollten wir den Inhalt der awk-Programmierung erläutern, aber bevor wir es erklären, werden wir einige Beispiele verwenden, um das Vorwissen zu überprüfen. Diese Beispiele werden alle in der Befehlszeile verwendet Dadurch können wir erkennen, wie praktisch es ist, awk in der Befehlszeile zu verwenden. Der Grund dafür ist einerseits, den Weg für die folgenden Inhalte zu ebnen, und andererseits, einige Methoden zur Lösung einfacher Probleme vorzustellen. Es besteht für uns keine Notwendigkeit, komplizierte Methoden zur Lösung einfacher Probleme zu verwenden – da awk dies bereitstellt eine relativ einfache Methode.
Beispiel: Alle Zeilen der Textdatei mydoc anzeigen, die mit der Zeichenfolge „sun“ übereinstimmen (sie enthalten).
$awk '/sun/{print}' mydoc
Da die Anzeige des gesamten Datensatzes (vollständige Zeile) die Standardaktion von awk ist, kann das Aktionselement weggelassen werden.
$awk '/sun/' mydoc
Beispiel: Das Folgende ist ein komplexeres Matching-Beispiel:
$awk '/[Ss]un/,/[ Mm ]oon/ {print}' myfile
Es werden die Zeilen zwischen der ersten Zeile, die Sonne oder Sonne entspricht, und der ersten Zeile, die Mond oder Mond entspricht, in der Standardausgabe angezeigt.
Beispiel: Das folgende Beispiel zeigt die Verwendung der integrierten Variablen und der integrierten Funktion length():
$awk 'length($0)>80 {print NR}' myfile
Diese Befehlszeile zeigt alle Zeilennummern in der Textdatei an, die 80 Zeichen überschreiten. Hier wird $0 verwendet, um den gesamten Datensatz (Zeile) darzustellen, die integrierte Variable NR jedoch nicht Verwenden Sie den Bezeichner „$“.
Beispiel: Als praktischeres Beispiel gehen wir davon aus, dass wir Sicherheitsüberprüfungen für Benutzer in UNIX durchführen möchten, indem wir die passwd-Datei unter /etc inspizieren und prüfen, ob das passwd-Feld (zweites Feld) „*“ ist. Wenn es nicht „*“ ist, bedeutet dies, dass der Benutzer kein Passwort festgelegt hat und diese Benutzernamen angezeigt werden (erstes Feld). Wir können die folgende Anweisung verwenden, um Folgendes zu erreichen:
#awk -F: '$2=="" {printf("%s kein Passwort!",$1' /etc/passwd
In In diesem Beispiel ist das Feldtrennzeichen der passwd-Datei „:“, daher muss -F: verwendet werden, um das Standardfeldtrennzeichen zu ändern. Dieses Beispiel beinhaltet auch die Verwendung der integrierten Funktion printf
awk Variable <.>
Wie andere Programmiersprachen ermöglicht awk das Festlegen von Variablen in der Programmiersprache. Tatsächlich ist die Bereitstellung der Funktion von Variablen eine wesentliche Anforderung der Programmiersprache
Awk stellt zwei Arten von Variablen bereit. Wir haben dies bereits erwähnt Auf integrierte Variablen muss nicht der Bezeichner „$“ verwendet werden (erinnern Sie sich an die zuvor erwähnte Verwendung von NR). Mit awk können Benutzer ihre Variablen definieren und aufrufen Eigene Variablen in awk-Programmanweisungen können nicht mit den integrierten Variablen und anderen reservierten awk-Variablen identisch sein In der C-Sprache muss awk den spezifischen Datentyp nicht anhand seines ersten Auftretens in awk bestimmen. Wenn der Variablentyp unsicher ist, verwendet awk standardmäßig den String-Typ Um den klaren Typ der verwendeten Variablen zu kennen, sollten Sie ihr im Programm einen Anfangswert zuweisen. In den folgenden Beispielen verwenden wir diese Technik:
Als eine der Eigenschaften einer Programmiersprache awk unterstützt eine Vielzahl von Operationen, die mit denen der C-Sprache identisch sind: wie +, -, *, /, %, usw. Gleichzeitig unterstützt awk auch C-Funktionen wie ++, -- , +=, -=, =+, =- in der Sprache bieten Benutzern, die mit der C-Sprache vertraut sind, beim Schreiben von awk-Programmen großen Komfort. Als Erweiterung bietet awk auch eine Reihe integrierter Betriebsfunktionen (z. B. log). , sqr, cos, sin usw.) und einige Funktionen für Operationen (Operationen) an Zeichenfolgen (wie Länge, Teilstr usw.) Die Referenz verbessert die Rechenfunktion von awk erheblich
.Als Teil der bedingten Übertragungsanweisungen ist die relationale Beurteilung eine Funktion, die jede Programmiersprache hat, und awk ist da keine Ausnahme. In awk sind verschiedene Tests zulässig, beispielsweise der häufig verwendete == (equal),! = (ungleich), > (größer als), < (kleiner als), >= (größer oder gleich), >= (kleiner als oder gleich) usw. Als Stilanpassung wird auch ~ (passt in) bereitgestellt und! ~ (stimmt nicht überein) Urteil.
Als Erweiterung zum Testen unterstützt awk auch mehrere Urteile mit logischen Operatoren:! (nicht), && (und), || (oder) und Klammern (), was die awk-Funktion erheblich verbessert. Im Anhang dieses Artikels sind die von awk zulässigen Operationen, Beurteilungen und Bedienerprioritäten aufgeführt.
Awks Flusskontrolle
Flusskontrollanweisungen sind ein unverzichtbarer Bestandteil jeder Programmiersprache. Jede gute Sprache verfügt über einige Anweisungen, die eine Flusskontrolle durchführen. Die von awk bereitgestellten vollständigen Flusskontrollanweisungen ähneln der C-Sprache, was unserer Programmierung großen Komfort verleiht.
1. BEGIN und END:
Es gibt zwei spezielle Ausdrücke in awk, BEGIN und END, die beide im Muster verwendet werden können (siehe die vorherige awk-Syntax) und BEGIN bereitstellen Die Funktion von END besteht darin, dem Programm einen Anfangszustand zu geben und nach Programmende einige Abschlussarbeiten durchzuführen. Alle nach BEGIN (innerhalb von {}) aufgeführten Vorgänge werden ausgeführt, bevor awk mit dem Scannen der Eingabe beginnt, während nach END aufgeführte Vorgänge ausgeführt werden, nachdem alle Eingaben gescannt wurden. Daher wird BEGIN normalerweise zum Anzeigen von Variablen und voreingestellten (initialisierten) Variablen verwendet, und END wird zum Ausgeben des Endergebnisses verwendet.
Beispiel: Kumulierter Verkaufsbetrag in der Verkaufsdatei xs (vorausgesetzt, der Verkaufsbetrag befindet sich im dritten Feld des Datensatzes):
$awk
>'BEGIN { FS=": "; print "Statistischer Verkaufsbetrag";total=0}
>{print $3;total=total+$3;}
>END {printf "Gesamtverkaufsbetrag: %.2f",total}' sx
(Hinweis: > ist die zweite von der Shell bereitgestellte Eingabeaufforderung. Wenn Sie die Zeile in der awk-Anweisung und der awk-Sprache des Shell-Programms umbrechen möchten, müssen Sie am Ende der Zeile einen Backslash hinzufügen)
Hier ist BEGIN voreingestellt. Die interne Variable FS (Feldtrennzeichen) und die benutzerdefinierte Variablensumme werden addiert und die Kopfzeile der Ausgabezeile wird vor dem Scannen angezeigt. Und END druckt die Gesamtsumme aus, nachdem der Scan abgeschlossen ist.
2. Prozesskontrollanweisung
awk stellt eine vollständige Prozesskontrollanweisung bereit, deren Verwendung der der C-Sprache ähnelt. Lassen Sie uns sie unten einzeln erklären:
2.1, if...else-Anweisung:
Format:
if (Ausdruck)
Anweisung 1
else
Aussage 2
„Aussage 1“ im Format kann aus mehreren Aussagen bestehen. Wenn Sie die Beurteilung von awk und Ihre eigene Lektüre erleichtern möchten, schließen Sie mehrere Aussagen besser mit {} ein. Die awk-Zweigstruktur ermöglicht eine Verschachtelung und ihr Format ist:
if (expression 1)
{if (expression 2)
Anweisung 1
else
Anweisung 2
}
Anweisung 3
else {if (Ausdruck 3)
Anweisung 4
else
Anweisung 5
}
Anweisung 6
Natürlich ist die eigentliche Operation Sie Dabei darf keine so komplizierte Verzweigungsstruktur verwendet werden, dies dient lediglich der Stilisierung.
2.2. while-Anweisung
while (Ausdruck)
2.3. do-while-Anweisung
Das Format ist:
do
{
Statement
}while (bedingte Urteilsaussage)
2.4, für Statement
Das Format ist:
for (Anfangsausdruck; Beendigungsbedingung; Schrittausdruck)
{Anweisung}
Die Anweisungen break und continue sind in den Anweisungen while, do-while und for von awk zulässig. Steuern Sie den Ablauf des Prozesses und ermöglichen auch die Verwendung von Anweisungen wie Exit-to-Exit. break unterbricht die aktuell ausgeführte Schleife und springt aus der Schleife, um die nächste Anweisung auszuführen. continue springt zur Ausführung von der aktuellen Position zum Anfang der Schleife. Es gibt zwei Situationen für die Ausführung von Exit: Wenn die Exit-Anweisung nicht in END steht, verhält sich der Exit-Befehl in jeder Operation so, als ob er das Ende der Datei erreicht hätte, alle Modi oder die Operationsausführung werden angehalten und die Operationen in END Modus ausgeführt werden. Ein in END erscheinender Exit führt zum Beenden des Programms.
Beispiel: Für
Benutzerdefinierte Funktionen in awk
Definieren und Aufrufen der eigenen Funktionen des Benutzers sind Funktionen fast jeder Hochsprache, und awk ist keine Ausnahme Das ursprüngliche awk bietet keine Funktionsfunktionen und Funktionen können nur in nawk oder neueren awk-Versionen hinzugefügt werden.
Die Verwendung von Funktionen umfasst zwei Teile: Funktionsdefinition und Funktionsaufruf. Die Funktionsdefinition umfasst den auszuführenden Code (die Funktion selbst) und den temporären Aufruf, der vom Hauptprogrammcode an die Funktion übergeben wird.
Die awk-Funktion ist wie folgt definiert:
Funktionsname (Parameterliste) {
Funktionskörper
}
Es ist erlaubt, die Funktion func in gawk wegzulassen, andere Versionen von awk erlauben dies jedoch nicht. Der Funktionsname muss ein zulässiger Bezeichner sein. In der Parameterliste dürfen keine Parameter angegeben werden (ein Klammerpaar nach dem Funktionsnamen ist jedoch beim Aufruf der Funktion weiterhin erforderlich), oder es können ein oder mehrere Parameter angegeben werden. Ähnlich wie in der C-Sprache werden auch awk-Parameter als Wert übergeben.
Das Aufrufen von Funktionen in awk ist relativ einfach. Die Methode ähnelt der C-Sprache, ist jedoch flexibler als die C-Sprache. Es führt keine Parametergültigkeitsprüfung durch. Mit anderen Worten: Wenn Sie eine Funktion aufrufen, können Sie mehr oder weniger Parameter auflisten, als die Funktion erwartet (in der Funktionsdefinition angegeben). Die zusätzlichen Parameter werden von awk ignoriert und die unzureichenden Parameter werden von awk als Standard festgelegt. Wert 0 oder eine leere Zeichenfolge, je nachdem, wie der Parameter verwendet wird.
Die awk-Funktion verfügt über zwei Rückgabemethoden: implizite Rückgabe und explizite Rückgabe. Wenn awk bis zum Ende der Funktion ausgeführt wird, kehrt es automatisch zum aufrufenden Programm zurück, weshalb die Funktion implizit zurückkehrt. Wenn Sie eine Funktion vor ihrem Ende beenden müssen, können Sie explizit eine Return-Anweisung verwenden, um sie vorzeitig zu beenden. Die Methode besteht darin, eine Anweisung im Rückgabeformat in der Funktion zu verwenden.
Beispiel: Das folgende Beispiel demonstriert die Verwendung von Funktionen. In diesem Beispiel wird eine Funktion namens print_header definiert, die zwei Parameter aufruft: FileName und PageNum. Der Parameter FileName wird an den Dateinamen übergeben, der aktuell von der Funktion verwendet wird, und der Parameter PageNum ist die Seitennummer der aktuellen Seite. Die Funktion dieser Funktion besteht darin, den Dateinamen der aktuellen Datei und die Seitennummer der aktuellen Seite zu drucken (anzuzeigen). Nach Abschluss dieser Funktion gibt diese Funktion die Seitenzahl der nächsten Seite zurück.
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file, pageno); #Call function print_header
>printf("Aktuelle Seite Die Seitenzahl ist: %d",pageno);
>}
>#Define function print_header
>function print_header(FileName,PageNum){
>printf( " %s %d",FileName,PageNum); >PageNum++;return PageNUm;}
>}' myfile
Beim Ausführen dieses Programms wird der folgende Inhalt angezeigt:
myfile 1
Die aktuelle Seitenzahl ist: 2
awk erweiterte Eingabe und Ausgabe
1. Lesen Sie den nächsten Datensatz:
Die nächste Anweisung von awk bewirkt, dass awk den nächsten Datensatz liest, den Mustervergleich abschließt und dann sofort den entsprechenden Vorgang ausführt. Normalerweise wird der Code in der Operation mit einem passenden Muster ausgeführt. next bewirkt, dass alle zusätzlichen Übereinstimmungsmuster für diesen Datensatz ignoriert werden.
2. Einfach einen Datensatz lesen
awks getline-Anweisung wird verwendet, um einfach einen Datensatz zu lesen. Getline ist besonders nützlich, wenn der Benutzer über einen Datensatz verfügt, der zwei physischen Datensätzen ähnelt. Es vervollständigt die Trennung allgemeiner Felder (Feldvariablen $0 FNR NF NR festlegen). Gibt 1 bei Erfolg zurück, 0 bei Fehler (Ende der Datei erreicht). Wenn Sie einfach eine Datei lesen müssen, können Sie den folgenden Code schreiben:
Beispiel: Beispiel für die Verwendung von getline
{while(getline==1)
{
#verarbeiten Sie die eingegebenen Felder
}
}
kann getline auch aktivieren, um die Eingabedaten in einem Feld zu speichern, anstatt allgemeine Felder mithilfe der getline-Variablen zu verarbeiten. Bei Verwendung dieser Methode wird NF auf 0 gesetzt und FNR und NR werden erhöht.
Benutzer können auch getline<"filename" verwenden, um Daten aus einer bestimmten Datei einzugeben, anstatt Daten aus dem in der Befehlszeile aufgeführten Inhalt einzugeben. An diesem Punkt schließt getline die allgemeine Feldtrennung ab (Festlegen der Feldvariablen $0 und NF). Wenn die Datei nicht vorhanden ist, wird -1 für Erfolg, 1 für Fehler und 0 für Fehler zurückgegeben. Der Benutzer kann Daten aus einer bestimmten Datei in eine Variable einlesen oder den Dateinamen durch stdin (Standardeingabegerät) oder eine Variable ersetzen, die den Dateinamen enthält. Es ist zu beachten, dass FNR und NR bei Verwendung dieser Methode nicht verändert werden.
Eine andere Möglichkeit, die getline-Anweisung zu verwenden, besteht darin, Eingaben von einem UNIX-Befehl zu akzeptieren, wie im folgenden Beispiel:
Beispiel: Beispiel zum Akzeptieren von Eingaben von einem UNIX-Befehl
{while(" who -u"|getline)
{
#verarbeiten Sie jede Zeile aus dem Who-Befehl
}
}
Natürlich können Sie auch das folgende Formular verwenden :
„Befehl“ |. getline-Variable
3. Schließen Sie die Datei:
awk ermöglicht es Ihnen, eine Eingabe- oder Ausgabedatei im Programm zu schließen, indem Sie die close-Anweisung von awk verwenden.
close("filename")
filename kann die von getline geöffnete Datei sein (es kann auch stdin sein, eine Variable, die den Dateinamen oder den genauen von getline verwendeten Befehl enthält). Oder eine Ausgabedatei (könnte stdout sein, eine Variable, die den Dateinamen oder den genauen Befehl über eine Pipe enthält).
4. Ausgabe in eine Datei:
awk ermöglicht die folgende Methode zur Ausgabe der Ergebnisse in eine Datei:
printf("hello word!")>"datafile "
oder
printf("hello word!")>>"datafile"
5. Ausgabe an einen Befehl
Awk ermöglicht die folgende Methode, um das Ergebnis in einen Befehl auszugeben:
printf("hello word!")|"sort-t','"
Hybridprogrammierung von awk und Shell-Skript
Da awk als Shell-Befehl verwendet werden kann, lässt sich awk gut in das Shell-Batch-Programm integrieren, was die Implementierung einer gemischten Programmierung von awk- und Shell-Programmen ermöglicht. Der Schlüssel zur Realisierung der Hybridprogrammierung ist der Dialog zwischen awk und Shell-Skript. Mit anderen Worten, es ist der Informationsaustausch zwischen awk und Shell-Skript: awk erhält die erforderlichen Informationen (normalerweise den Wert der Variablen) aus dem Shell-Skript und führt sie aus in awk Die Shell-Befehlszeile und das Shell-Skript senden die Ergebnisse der Befehlsausführung zur Verarbeitung an awk, und das Shell-Skript liest die Ausführungsergebnisse von awk usw.
1.awk liest Variablen des Shell-Skriptprogramms
In awk können wir die Variablen im Sell-Scrpit-Programm über „‘$Variablenname‘“ lesen.
Beispiel: Im folgenden Beispiel lesen wir die Variable Name im Programm „sell scrpit“. Diese Variable speichert den Autor des Textes „myfile“ und awk gibt den Namen aus.
$cat writename
:
# @(#)
#
Name="Zhang San" nawk 'BEGIN. name="'Name'"; printf("%s geschrieben von %s",FILENAME,name");}
{...}END{...}' myfile
.
.
.
2. Senden Sie das Ausführungsergebnis des Shell-Befehls zur Verarbeitung
Als Methode zur Informationsübertragung können wir das Ergebnis eines Shell-Befehls über die Pipeline senden ( |) Zur Verarbeitung an awk übergeben:
Beispiel: Beispiel awk verarbeitet das Ausführungsergebnis des Shell-Befehls
$who -u |. ,$2,$1) }'
Dieser Befehl gibt den Namen des Programms aus, das vom registrierten Terminal ausgeführt wird
3 Das Shell-Skriptprogramm liest das Ausführungsergebnis von awk
Um das Lesen des Shell-Skriptprogramms zu realisieren, können wir einige spezielle Methoden verwenden, um die Ergebnisse der awk-Ausführung in einer Shell-Skriptvariablen in Form des Variablennamens = zu speichern „awk-Anweisung“. Natürlich können wir die Ergebnisse der awk-Ausführung auch zur Verarbeitung an das Shell-Skriptprogramm übergeben.
Beispiel: Als einer der Mechanismen zum Übertragen von Nachrichten Bietet eine Befehlswand zum Senden von Nachrichten an alle Benutzer (d. h. an alle schreiben). Zu diesem Zweck können wir dieses Programm über ein Shell-Batch-Programm wall.shell simulieren Tatsächlich ist Wall in älteren Versionen ein Shell-Batch-Programm:
$cat wall.shell
:
# @(#) wall.shell: Nachricht an jedes registrierte Terminal senden
#
cat >/tmp/$$
#Benutzereingabenachrichtentext who -u | awk '{print $2}' | tty
fertig
in diesem Programm akzeptiert awk das Ausführungsergebnis des Befehls who -u. Dieser Befehl gibt die Informationen aller registrierten Terminals aus Verwenden Sie daher den Befehl awk, um den Gerätenamen zu extrahieren, und verwenden Sie ihn dann beim Lesen. Die tty-Anweisung leitet diese Dateinamen in die Variable (Shell-Skriptvariable) tty als Endadresse der Informationsübertragung weiter.
4. Führen Sie die Shell-Befehlszeile in awk aus ----eingebettete Funktion system()
system() ist eine eingebettete Funktion, die nicht für Zeichen- oder numerische Typen geeignet ist Diese Funktion verarbeitet die als Argument übergebene Zeichenfolge. Das System verarbeitet diesen Parameter als Befehl, führt ihn also als Befehlszeile aus. Dies gibt Benutzern die Flexibilität, Befehle oder Skripte auszuführen, wenn sie von ihren eigenen awk-Programmen benötigt werden.
Beispiel: Das folgende Programm verwendet die im System eingebettete Funktion, um eine vom Benutzer erstellte Berichtsdatei zu drucken. Diese Datei wird in einer Datei mit dem Namen myreport.txt gespeichert. Der Einfachheit halber listen wir nur den END-Teil auf:
.
In diesem Beispiel verwenden wir zuerst die close-Anweisung, um die Datei myreport.txt zu schließen, und verwenden dann die im System eingebettete Funktion, um myreport.txt zum Drucken an den Drucker zu senden.
Während ich dies schreibe, muss ich mich von meinen Freunden verabschieden. Um ehrlich zu sein, sind diese Inhalte immer noch ein Fortschritt in der Wissenschaft, und awk ist keine Ausnahme ebnet Ihnen einen kleinen Anfang auf dem langen Weg, der vor Ihnen liegt, und den Rest des Weges müssen Sie selbst gehen. Ehrlich gesagt, wenn dieser Artikel Ihnen auf dem weiteren Weg wirklich etwas Erleichterung bringen kann, dann bin ich zufrieden!
Wenn Sie Fragen zu diesem Artikel haben, senden Sie bitte eine E-Mail an:Chizlong@yeah.net oder hinterlassen Sie eine Nachricht auf der Homepage http://chizling.yeah.net.
Anhang:
1.awks Metazeichen für reguläre Ausdrücke
Escape-Sequenz
^ beginnt mit der Übereinstimmung am Anfang der Zeichenfolge
$ Übereinstimmungen beginnend bei das Ende der Zeichenfolge
. Entspricht jeder einzelnen Zeichenfolge
[ABC] Entspricht jedem Zeichen innerhalb von []
[A-Ca-c] entspricht den Zeichen im Bereich A-C und a-c (in alphabetischer Reihenfolge).
[^ABC] entspricht jedem Zeichen außer allen Zeichen in [].
Schreibtisch|Stuhl entspricht entweder Schreibtisch oder Stuhl entspricht dem
[ABC][DEF] Assoziation. Entspricht einem beliebigen Zeichen unter A, B und C und muss von einem beliebigen Zeichen unter D, E und F gefolgt werden.
* Entspricht jedem Zeichen A, B oder C, das 0 oder öfter vorkommt
+ Entspricht jedem Zeichen A, B oder C, das 1 oder mehr Mal vorkommt
? Entspricht einer leeren Zeichenfolge oder einem beliebigen Zeichen von A, B oder C
(Blue|Black)berry Kombiniert reguläre Ausdrücke und entspricht Blueberry oder Blackberry
2.awk-Arithmetikoperatoren
Operatorverwendung
------------------
x^y x hoch y
x**y Dasselbe wie oben
x %y Berechnen Sie den Rest von x/y (modulo)
x+y von y); auch Ichimoku-Subtraktion genannt
++y Nach der Addition von 1 zu y verwenden Sie y (Präfixaddition)
y++ Verwenden Sie den y-Wert und addieren Sie dann 1 (Suffixaddition)
--y Nach y wird um 1 subtrahiert. Verwenden Sie y (Präfixsubtraktion)
y-- verwenden Sie y nach der Subtraktion um 1 (Suffixsubtraktion)
x=y weisen Sie x den Wert von y zu
x+=y weisen Sie den Wert von x zu +y zu x
x-=y Weisen Sie den Wert von x-y zu x
x*=y zu. Weisen Sie den Wert von x*y zu x
x/=y zu. Weisen Sie den Wert von x/y zu x x zu %=y Weisen Sie x
x^=y den Wert von x%y zu. Weisen Sie x
x**=y den Wert von x^y zu. Weisen Sie x
3. Von awk zugelassene Tests:
Operatorbedeutung
x==y x ist gleich y
x!=y x ist nicht gleich y
x>y x ist größer als y
x>= y x ist größer oder gleich y
x
x~re x stimmt überein Der reguläre Ausdruck re?
x!~re x entspricht nicht den regulären Ausdrucksoperatoren der Formel re? = , -= , *= ,/= , %=
||. 'x'y' wird zu "xy")
+ -
* / %
++ --
5.awk integrierte Variablen (vordefinierte Variablen)
Hinweis: Das v-Element in der Tabelle stellt das erste Tool dar, das Variablen unterstützt (dasselbe unten)): A=awk, N=nawk, P=POSIX awk, G=gawk
V Variable bedeutet Standardwert
----------------- --------------- ---------
N Anzahl der ARGC-Befehlszeilenparameter
G ARGIND ARGV-Identifikator der aktuell verarbeiteten Datei
N ARGV-Befehlszeilenparameter-Array
G CONVFMT digitales Konvertierungsformat %. 6g
P ENVIRON UNIX-Umgebungsvariable
N ERRNO UNIX-Systemfehlermeldung
G FIELDWIDTHS Eine durch Leerzeichen getrennte Zeichenfolge von Eingabefeldbreiten
A FILENAME Der Name der aktuellen Eingabedatei
P FNR The aktuelle Anzahl der Datensätze
A FS Das Eingabefeld-Trennzeichen
G IGNORECASE Kontrolle der Groß-/Kleinschreibung 0 (Groß-/Kleinschreibung beachten)
A NF Anzahl der Felder im aktuellen Datensatz
A NR Anzahl der Datensätze, die vorhanden waren lesen
A OFMT-Zahlenausgabeformat %.6g
A OFS-Ausgabefeldtrennzeichenraum
A ORS-Ausgabedatensatztrennzeichen neue Zeile
A RS-Eingabedatensatztrennzeichen neue Zeile
N RSTART Die erste Zeichenfolge stimmte überein durch die Matching-Funktion
N RLENGTH Die Länge der Zeichenfolge, die durch die Matching-Funktion abgeglichen wird
N SUBSEP Indextrennzeichen „34“
6.awks integrierte Funktion
V-Funktion Zweck oder Rückgabewert
------------- ------------------------------ ----
N gsub(reg,string,target) Jeder reguläre Ausdruck Ersetzt bei Übereinstimmung mit der Formel reg die Zeichenfolge im Ziel
N index(search,string) Gibt die Position der Suchzeichenfolge in string zurück
Eine Länge (Zeichenfolge) Ermitteln Sie die Anzahl der Zeichen in der Zeichenfolge.
N match(string, reg) Gibt die Position in der Zeichenfolge zurück, die mit dem regulären Ausdruck reg übereinstimmt.
N printf(format,variable) formatiert die Ausgabe und gibt die Variable variable in dem von format bereitgestellten Format aus.
N split(string,store,delim) Zerlegen Sie die Zeichenfolge gemäß dem Trennzeichen delim in die Array-Elemente von store
N sprintf(format, variable) Gibt formatierte Daten basierend auf dem Format zurück, in das Variablen eingefügt werden sollen Die Zeichenfolge Die Daten in
G strftime(format,timestamp) geben eine Datums- oder Zeitzeichenfolge basierend auf dem Format zurück. timestmp ist die von der Funktion systime() zurückgegebene Zeit Wird zum ersten Mal als regulärer Ausdruck verwendet. Ersetzen Sie die Zeichenfolge in der Zielzeichenfolge das entsprechende Kleinbuchstabenzeichen in der Zeichenfolge
P toupper(string) gibt das entsprechende Großbuchstabenzeichen in der Zeichenfolge zurück
A atan(x,y) Kotangens von x (Bogenmaß)
N cos(x) Kosinus von x (Bogenmaß). )
A exp (x) Die x-Potenz von e
A int(x) Der ganzzahlige Teil von x
A log(x) Der natürliche Logarithmus von x
N rand() Zufallszahl zwischen 0-1
N sin(x) Sinus von x (Bogenmaß)
A sqrt(x) Quadratwurzel von x
A srand(x) Initialisieren Sie den Zufallszahlengenerator. Wenn x weggelassen wird, verwenden Sie system()
G system() gibt die seit dem 1. Januar 1970 verstrichene Zeit in Sekunden zurück