AWK

Awk
The-AWK-Programming-Language.svg
Awk-example-usage-gimp.gif
Paradigma Scripting, prozedural, datengetrieben[1]
Entworfen von Alfred Aho, Peter Weinberger, und Brian Kernighan
Erstmals erschienen 1977; Vor 45 Jahren
Stabile Version
IEEE STD 1003.1-2008 (POSIX) / 1985
Disziplin tippen keiner; kann Strings, Ganzzahlen und schwimmende Punktzahlen bewältigen; Reguläre Ausdrücke
OS Plattformübergreifend
Haupt Implementierungen
awk, gnu awk, mawk, nawk, mks awk, thompson awk (Compiler), awka (Compiler)
Dialekte
Old Awk OAWK 1977, New Awk Nawk 1985, Gnu awk gaffen
Beeinflusst von
C, sed, Snobol[2][3]
Beeinflusst
Tcl, Ampl, Perl, Korn Shell (KSH93, dtksh, TKSH), Lua

Awk (awk)[4] ist ein Domänenspezifische Sprache für die Textverarbeitung entwickelt und normalerweise als verwendet als Datenextraktion und Berichterstattungsinstrument. Wie sed und Grep, es ist ein Filter,[4] und ist ein Standardmerkmal der meisten UNIX-ähnliche Betriebssysteme.

Die awk -Sprache ist a datengetrieben Skriptsprache bestehend aus einer Reihe von Maßnahmen, gegen die er ergriffen werden sollte Ströme von Textdaten - entweder direkt auf Dateien ausführen oder als Teil von a verwendet werden Pipeline - Zum Zwecke des Extrahierens oder der Transformation von Text wie das Erstellen formatierter Berichte. Die Sprache verwendet ausführlich die Saite Datentyp, assoziative Arrays (Das heißt, Arrays, die durch Schlüsselzeichenfolge indiziert werden) und Reguläre Ausdrücke. Während Awk eine begrenzte beabsichtigt hat Anwendungsbereich und war speziell für die Unterstützung entwickelt Ein-Liner-Programme, die Sprache ist Turing-Completeund sogar die Early Bell Labs-Benutzer von Awk haben oft gut strukturierte große AWK-Programme geschrieben.[5]

Awk wurde erstellt bei Bell Labs in den 1970ern,[6] und sein Name leitet sich von der ab Nachnamen seiner Autoren: Alfred Aho, Peter Weinberger, und Brian Kernighan. Das Akronym wird genauso ausgesprochen wie der Vogel Alk, was auf dem Cover von liegt Die awk -Programmiersprache.[7] Wenn in allen Kleinbuchstaben geschrieben, als awk, es bezieht sich auf die Unix oder Plan 9 Programm, das Skripte ausführt, die in der AWK -Programmiersprache geschrieben wurden.

Geschichte

Awk wurde 1977 von 1977 von entwickelt Alfred Aho (Autor von Egrep), Peter J. Weinberger (der an winzigen relationalen Datenbanken arbeitete) und Brian Kernighan. Awk hat seinen Namen von ihren jeweiligen Initialen. Laut Kernighan war es eines der Ziele von AWK, ein Werkzeug zu haben, das sowohl Zahlen als auch Saiten leicht manipulieren würde. Awk war auch inspiriert von Marc RochkindDie Programmiersprache, die verwendet wurde, um nach Mustern in Eingabedaten zu suchen, und mithilfe der Verwendung implementiert wurde yacc.[8]

Als eines der frühen Werkzeuge, in denen man erscheinen kann Version 7 Unix, Awk fügte einem UNIX Rechenfunktionen hinzu Pipeline neben dem Bourne Shell, die einzige Skriptsprache, die in einer Standard -UNIX -Umgebung verfügbar ist. Es ist eines der obligatorischen Versorgungsunternehmen der Einzel -Unix -Spezifikation,[9] und wird von der verlangt Linux Standard Base Spezifikation.[10]

Awk wurde 1985–88 signifikant überarbeitet und erweitert, was zu dem führte Gnu awk Implementierung geschrieben von Paul RubinJay Fenlason und Richard Stallman, veröffentlicht 1988.[11] GNU awk ist möglicherweise die am häufigsten bereitgestellte Version[12] weil es in GNU-basierten Linux-Paketen enthalten ist. Gnu awk ist seit 1994 ausschließlich von Arnold Robbins aufrechterhalten.[11] Brian Kernighan's Nawk (New awk) Source wurde erstmals seit Ende der neunziger Jahre 1993 unveröffentlicht und öffentlich veröffentlicht. Viele BSD -Systeme verwenden es, um die GPL -Lizenz zu vermeiden.[11]

Awk war vorausging von sed (1974). Beide wurden für die Textverarbeitung ausgelegt. Sie teilen das zeilenorientierte, datengetriebene Paradigma und eignen sich besonders für das Schreiben Ein-Liner-Programmeaufgrund des impliziten Hauptschleife und aktuelle Zeilenvariablen. Die Kraft und Richtigkeit von frühen AWK-Programmen-insbesondere die mächtige regelmäßige Ausdrucksbekämpfung und -versicht aufgrund impliziter Variablen, die Einzeiler erleichtern, waren zu dieser Zeit wichtige Inspirationen für die Perl Sprache (1987). In den neunziger Jahren wurde Perl sehr beliebt und konkurrierte mit AWK in der Nische der Unix-Textverarbeitungssprachen.

Struktur von AWK -Programmen

POSIX awk.pdf

Awk liest die Eingabe jeweils eine Zeile. Für jedes Muster im Programm wird eine Zeile gescannt, und für jedes Muster, das übereinstimmt, wird die zugehörige Aktion ausgeführt.

-Alfred V. Aho[13]

Ein AWK -Programm ist eine Reihe von Muster -Aktionspaaren, die als:

Bedingung { Aktion } Bedingung { Aktion } ... 

wo Bedingung ist normalerweise ein Ausdruck und Aktion ist eine Reihe von Befehlen. Die Eingabe wird in Datensätze aufgeteilt, wobei standardmäßig Datensätze durch Newline -Zeichen getrennt sind, so dass die Eingabe in Zeilen aufgeteilt wird. Der Programm testet jeden Datensatz gegen jede der Bedingungen und führt die aus Aktion Für jeden Ausdruck ist das wahr. Entweder die Bedingung oder die Aktion kann weggelassen werden. Die Bedingung stellt standardmäßig für jeden Datensatz ab. Die Standardaktion besteht darin, den Datensatz zu drucken. Dies ist die gleiche Muster-Action-Struktur wie SED.

Zusätzlich zu einem einfachen awk -Ausdruck, wie z. foo == 1 oder /^foo/, der Zustand kann sein START oder ENDE verursacht, dass die Aktion vor oder nach allen Aufzeichnungen gelesen wurde, oder Muster1, Muster2 Dies entspricht dem Rekordebereich mit einem Rekord, der übereinstimmt Muster1 bis zu und einschließlich des Rekords, der übereinstimmt Muster2 Bevor ich erneut versuche, gegen gegeneinander zu passen Muster1 nach zukünftigen Linien.

Zusätzlich zu normalen arithmetischen und logischen Operatoren umfassen AWK -Ausdrücke der Tilde -Operator, ~, was passt a regulären Ausdruck gegen eine Schnur. Als praktisch syntethischer Zucker, /regexp/ ohne den Tilde -Operator übereinstimmt mit dem aktuellen Datensatz; Diese Syntax stammt aus sed, was es wiederum von der erbte ed Herausgeber, wo / wird für die Suche verwendet. Diese Syntax der Verwendung von Schrägstrichen als Grenzwerte für reguläre Ausdrücke wurde anschließend von übernommen von Perl und ECMaskript, und ist jetzt häufig. Der Tilde -Betreiber wurde ebenfalls von Perl übernommen.

Befehle

Awk -Befehle sind die Aussagen, die ersetzt werden Aktion In den obigen Beispielen. Awk -Befehle können Funktionsaufrufe, variable Zuordnungen, Berechnungen oder eine beliebige Kombination davon enthalten. Awk enthält eine integrierte Unterstützung für viele Funktionen; Viele weitere werden von den verschiedenen Geschmacksrichtungen von awk bereitgestellt. Einige Aromen unterstützen auch die Aufnahme von Dynamisch verknüpfte Bibliotheken, was auch mehr Funktionen liefern kann.

Das drucken Befehl

Das drucken Der Befehl wird verwendet, um Text auszugeben. Der Ausgangstext wird immer mit einer vordefinierten Zeichenfolge beendet, die als Ausgabemittel -Trennzeichen (ORS) bezeichnet wird, deren Standardwert eine neue Linie ist. Die einfachste Form dieses Befehls ist:

drucken
Dies zeigt den Inhalt des aktuellen Datensatzes an. In awk werden die Aufzeichnungen in unterteilt in Felderund diese können separat angezeigt werden:
drucken $ 1
Zeigt das erste Feld des aktuellen Datensatzes an
drucken $ 1, $ 3
Zeigt die ersten und dritten Felder des aktuellen Datensatzes an, die durch eine vordefinierte Zeichenfolge getrennt sind

Obwohl diese Felder ($ X) kann Ähnlichkeit mit Variablen haben (das $ -Symbol zeigt Variablen in an Perl), sie beziehen sich tatsächlich auf die Felder des aktuellen Datensatzes. Ein Sonderfall, $ 0bezieht sich auf den gesamten Rekord. Tatsächlich die Befehle "drucken" und "drucken $ 0"sind in der Funktionalität identisch.

Das drucken Der Befehl kann auch die Ergebnisse von Berechnungen und/oder Funktionsaufrufen anzeigen:

/regex_pattern/ {  # Aktionen zum Ereignis im Ereignis der Datensatz (Zeile) übereinstimmen mit der obigen Regex_Pattern  drucken 3+2  drucken Foobar(3)  drucken Foobar(Variable)  drucken Sünde(3-2) } 

Die Ausgabe kann an eine Datei gesendet werden:

/regex_pattern/ {  # Aktionen zum Ereignis im Ereignis der Datensatz (Zeile) übereinstimmen mit der obigen Regex_Pattern  drucken "Ausdruck" > "Dateiname" } 

oder durch a Rohr:

/regex_pattern/ {  # Aktionen zum Ereignis im Ereignis der Datensatz (Zeile) übereinstimmen mit der obigen Regex_Pattern  drucken "Ausdruck" | "Befehl" } 

Eingebaute Variablen

Die integrierten Variablen von awk umfassen die Feldvariablen: $ 1, $ 2, $ 3 usw. ($ 0 repräsentiert den gesamten Datensatz). Sie halten den Text oder die Werte in den einzelnen Textfeldern in einem Datensatz.

Andere Variablen sind:

  • Nr: Anzahl der Datensätze. Halten Sie eine aktuelle Anzahl der Anzahl der bisher gelesenen Eingabeaufzeichnungen von allen Datendateien. Es beginnt bei Null, wird aber nie automatisch auf Null zurückgesetzt.[14]
  • Fnr: Dateinummer der Datensätze. Hält eine aktuelle Anzahl der Anzahl der bisher gelesenen Eingabedatensätze bei in der aktuellen Datei. Diese Variable wird bei jedem Start einer neuen Datei automatisch auf Null zurückgesetzt.[14]
  • Nf: Anzahl der Felder. Enthält die Anzahl der Felder im aktuellen Eingangsdatensatz. Das letzte Feld im Eingangsdatensatz kann von $ nf, dem 2. bis längeren Feld von $ (NF-1), dem Feld 3. bis Lasten von $ (NF-2) usw., bezeichnet werden.
  • DATEINAME: Enthält den Namen der aktuellen Eingabedatei.
  • Fs: Feldabscheider. Enthält das "Feldabscheider", das verwendet wird, um Felder in den Eingangsdatensatz zu teilen. Die Standardeinstellung "White Space" ermöglicht jede Sequenz von Speicherplatz und Registerkartenzeichen. FS kann mit einer anderen Zeichen- oder Zeichensequenz neu zugewiesen werden, um den Feldabscheider zu ändern.
  • Rs: Rekordtrennzeichen. Speichert den aktuellen "Rekordtrennzeichen" -Zeichen. Da standardmäßig eine Eingabezeile der Eingangsdatensatz ist, ist das Standard -Rekordtrennzeichen eine "Newline".
  • Ofs: Ausgangsfeldabscheider. Speichert das "Ausgangsfeldabscheider", das die Felder trennt, wenn awk sie druckt. Die Standardeinstellung ist ein "Space" -Scharakter.
  • Ors: Ausgangsrekordabscheider. Speichert das "Ausgangsdatensatzabscheider", das die Ausgabebatensätze trennt, wenn awk sie druckt. Die Standardeinstellung ist ein "Newline" -Scharakter.
  • OFMT: Ausgabeformat. Speichert das Format für die numerische Ausgabe. Das Standardformat ist "%.6G".

Variablen und Syntax

Variablennamen können mit Ausnahme von Sprachschlüsselwörtern eines der Zeichen [A-Za-Z0-9_] verwenden. Die Betreiber + - * / Darstellung von Addition, Subtraktion, Multiplikation bzw. Teilung. Für String VerkettungStellen Sie einfach zwei Variablen (oder Stringkonstanten) nebeneinander. Es ist optional, einen Speicherplatz dazwischen zu verwenden, wenn Stringkonstanten beteiligt sind, aber zwei Variablennamen, die nebeneinander platziert sind, erfordern einen Platz dazwischen. Anführungszeichen abgrenzen Stringkonstanten. Aussagen müssen nicht mit Semikolonen enden. Schließlich können Kommentare zu den Programmen mit Verwendung hinzugefügt werden # als erster Charakter in einer Zeile.

Benutzerdefinierte Funktionen

In einem ähnlichen Format wie C, Funktionsdefinitionen bestehen aus dem Schlüsselwort Funktion, der Funktionsname, Argumentnamen und die Funktionskörper. Hier ist ein Beispiel für eine Funktion.

Funktion add_three (Nummer) {  Rückkehr Nummer + 3 } 

Diese Aussage kann wie folgt aufgerufen werden:

(Muster) {  drucken add_three(36)  # Ausgänge '' '39' '' ' } 

Funktionen können Variablen haben, die sich im lokalen Bereich befinden. Die Namen davon werden zum Ende der Argumentliste hinzugefügt, obwohl die Werte für diese beim Aufrufen der Funktion weggelassen werden sollten. Es ist Konvention, einige hinzuzufügen Whitespace In der Argumentliste vor den lokalen Variablen, um anzugeben, wo die Parameter enden und die lokalen Variablen beginnen.

Beispiele

Hallo Welt

Hier ist die übliche "Hallo Welt"Programm in awk geschrieben:

START {  drucken "Hallo Welt!"  Ausfahrt } 

Drucken Zeilen länger als 80 Zeichen

Drucken Sie alle Zeilen länger als 80 Zeichen. Beachten Sie, dass die Standardaktion die aktuelle Zeile drucken soll.

Länge($0) > 80 

Wörter zählen

Zählen Sie Wörter in der Eingabe und drucken Sie die Anzahl der Zeilen, Wörter und Zeichen (wie Toilette):

{  Wörter += Nf  Chars += Länge + 1 # Fügen Sie eine hinzu, um das neue Zeichen des neuen Datensatzes am Ende jedes Datensatzes zu berücksichtigen (Zeile) } ENDE { drucken Nr, Wörter, Chars } 

Da es für die erste Zeile des Programms kein Muster gibt, entspricht jede Eingabezeile standardmäßig, sodass die Inkrementaktionen für jede Zeile ausgeführt werden. Beachten Sie, dass Wörter += NF ist Kurzschrift für Wörter = Wörter + NF.

Sum letzte Wort

{ s += $Nf } ENDE { drucken s + 0 } 

s wird durch den numerischen Wert von erhöht $ Nf, was das letzte Wort in der Zeile ist, wie durch Awks Feldabscheider (standardmäßig weißer Raum) definiert. Nf ist die Anzahl der Felder in der Stromlinie, z. 4. Da $ 4 ist der Wert des vierten Feldes, $ Nf Ist der Wert des letzten Feldes in der Linie unabhängig davon, wie viele Felder diese Zeile haben oder ob es über mehr oder weniger Felder als umgebende Linien verfügt. $ ist eigentlich ein unärer Operator mit dem höchsten Vorrang. (Wenn die Linie keine Felder hat, dann Nf ist 0,, $ 0 ist die ganze Linie, die in diesem Fall neben möglichem weißem Raum leer ist, ebenso wie der numerische Wert 0.)

Am Ende der Eingabe die ENDE Muster übereinstimmt also s wird gedruckt. Da es jedoch überhaupt keine Eingabezeilen gegeben haben, wurde in diesem Fall kein Wert zugewiesen, der jemals zugewiesen wurde sEs wird standardmäßig eine leere Zeichenfolge sein. Das Hinzufügen von Null zu einer Variablen ist ein awk -Idiom, um es von einer Zeichenfolge zu einem numerischen Wert zu zwingen. (Die Verkettung einer leeren Zeichenfolge besteht darin, von einer Zahl zu einer Zeichenfolge zu zwingen, z. s "". Beachten Sie, dass es keinen Bediener gibt, der Strings verkettet wird, sie werden nur nebeneinander platziert.) Mit dem Zwang druckt das Programm "0" auf einer leeren Eingabe, ohne dass eine leere Linie gedruckt wird.

Stimmen Sie einen Bereich von Eingangsleitungen an

Nr % 4 == 1, Nr % 4 == 3 { printf " %6d %s \ n", Nr, $0 } 

Die Aktionsanweisung druckt jede Zeile nummeriert. Die printf -Funktion emuliert den Standard c printf und funktioniert ähnlich wie der oben beschriebene Druckbefehl. Das passende Muster funktioniert jedoch wie folgt: Nr Ist die Anzahl der Datensätze, typischerweise Eingabezeilen, awk hat bisher gelesen, d. H. Die aktuelle Zeilennummer, beginnend bei 1 für die erste Eingabezeile. % ist der Modulo Operator. Nr% 4 == 1 gilt für die 1., 5., 9. usw., Eingangslinien. Ebenfalls, Nr% 4 == 3 gilt für die 3., 7., 11. usw., Eingangslinien. Das Bereichsmuster ist falsch, bis der erste Teil in Zeile 1 übereinstimmt, und bleibt dann bis hin zu und einschließlich der Übereinstimmung des zweiten Teils in Zeile 3. Es bleibt dann falsch, bis der erste Teil erneut in Zeile 5 übereinstimmt.

So druckt das Programm die Zeilen 1,2,3, überspringt Zeile 4 und dann 5,6,7 und so weiter. Für jede Zeile druckt es die Zeilennummer (auf einem 6-Zeichen-Feld) und dann den Linieninhalt. Zum Beispiel bei Ausführung dieser Eingabe:

Rom Florence Milan Neapel Turin Venedig

Das vorherige Programm druckt:

     1 Rom 2 Florenz 3 Mailand 5 Turin 6 Venedig

Drucken des Anfangs- oder letzten Teils einer Datei

Als Sonderfall, wenn der erste Teil eines Bereichsmusters ständig wahr ist, z. 1Der Bereich beginnt am Anfang des Eingangs. In ähnlicher Weise, wenn der zweite Teil ständig falsch ist, z. 0Der Bereich wird bis zum Ende der Eingabe fortgesetzt. Zum Beispiel,

 /^-hier schneiden-$/, 0 

druckt Eingangslinien aus der ersten Zeile, die dem regulären Ausdruck entspricht ^-hier schneiden-$Das heißt, eine Linie, die nur den Ausdruck "-hier-cut-" bis zum Ende enthält.

Berechnen Sie die Wortfrequenzen

Wortfrequenz Verwendung assoziative Arrays:

START {  Fs="[^a-za-z]+" } {  zum (i=1; i<=Nf; i++)  Wörter[zu senken($i)]++ } ENDE {  zum (i in Wörter)  drucken i, Wörter[i] } 

Der Startblock setzt das Feldtrennzeichen auf jede Sequenz nicht-alphabetischer Zeichen. Beachten Sie, dass Separatoren reguläre Ausdrücke sein können. Danach kommen wir zu einer bloßen Aktion, die die Aktion auf jeder Eingabestelle ausführt. In diesem Fall fügen wir für jedes Feld in der Zeile einen hinzu, der Anzahl der zuerst in Kleinbuchstaben konvertierten Wort erscheint. Schließlich drucken wir im Endblock die Wörter mit ihren Frequenzen. Die Linie

für (i in Worten)

erstellt eine Schleife, die durch das Array geht Wörter, Einstellung i zu jedem Index des Arrays. Dies unterscheidet sich von den meisten Sprachen, in denen eine solche Schleife durch jede durchläuft Wert im Array. Die Schleife druckt somit jedes Wort aus, gefolgt von seiner Frequenzzahl. zu senken war eine Ergänzung zu dem One True Awk (siehe unten), nachdem das Buch veröffentlicht wurde.

Übereinstimmung Muster aus der Befehlszeile

Dieses Programm kann auf verschiedene Arten dargestellt werden. Der erste benutzt die Bourne Shell Um ein Shell -Skript zu erstellen, das alles tut. Es ist der kürzeste dieser Methoden:

#!/bin/sh Muster="$ 1" Wechsel awk '/'"$ Muster"'/ {Print Dateiname ":" $ 0}' "$@" 

Das $ Muster Im Befehl awk wird nicht durch einzelne Zitate geschützt, so dass die Shell die Variable erweitert, sie jedoch in doppelte Anführungszeichen einfügen muss, um Muster, die Räume enthalten, ordnungsgemäß zu verarbeiten. Ein Muster selbst auf die übliche Weise überprüft, ob die gesamte Zeile ($ 0) Streichhölzer. DATEINAME Enthält den aktuellen Dateinamen. awk hat keinen expliziten Verkettungsoperator; Zwei benachbarte Saiten verkettet sie. $ 0 Erweitert sich auf die ursprüngliche unveränderte Eingangslinie.

Es gibt alternative Möglichkeiten, dies zu schreiben. Dieses Shell -Skript greift auf die Umgebung direkt aus innerhalb AWK zu:

#!/bin/sh Export Muster="$ 1" Wechsel awk '$ 0 ~ Environ ["Muster"] {Print Dateiname ":" $ 0}' "$@" 

Dies ist ein Shell -Skript, das verwendet Umwelt, ein Array, das nach der Veröffentlichung des Buches in einer neueren Version des One True Awk eingeführt wurde. Der Index von Umwelt ist der Name einer Umgebungsvariablen; Sein Ergebnis ist der Wert der Variablen. Das ist wie das Getenv Funktion in verschiedenen Standardbibliotheken und Posix. Das Shell -Skript macht eine Umgebungsvariable Muster Das erste Argument enthält, löst dieses Argument fallen und hat awk nach dem Muster in jeder Datei.

~ Schecks, um festzustellen, ob sein linker Operand mit seinem rechten Operanden übereinstimmt. ! ~ ist sein umgekehrt. Beachten Sie, dass ein regulärer Ausdruck nur eine Zeichenfolge ist und in Variablen gespeichert werden kann.

Der nächste Weg verwendet die Variablenzuweisung von Befehlszeilen, bei der ein Argument für awk als Zuordnung zu einer Variablen angesehen werden kann:

#!/bin/sh Muster="$ 1" Wechsel awk '$ 0 ~ Muster {Print Dateiname ":" $ 0}' "Muster =$ Muster" "$@" 

Oder Sie können die verwenden -V var = Wert Befehlszeilenoption (z. awk -v muster = "$ muster" ...).

Schließlich ist dies in Pure Awk, ohne Hilfe von einer Shell oder ohne die Notwendigkeit, zu viel über die Implementierung des awk -Skripts zu wissen (wie die variable Zuordnung in Befehlszeile eins erforderlich) geschrieben, ist jedoch etwas lang:

START {  Muster = Argv[1]  zum (i = 1; i < Argc; i++) # Erstes Argument entfernen  Argv[i] = Argv[i + 1]  Argc--  wenn (Argc == 1) { # Das Muster war das einzige, also erzwingen Sie das Lesen aus Standardeingaben (verwendet von Buch)  Argc = 2  Argv[1] = "-"  } } $0 ~ Muster { drucken DATEINAME ":" $0 } 

Das START ist nicht nur erforderlich, um das erste Argument zu extrahieren, sondern auch zu verhindern, dass es nach dem als Dateinamen interpretiert wird START Blockende endet. ArgcDie Anzahl der Argumente ist immer garantiert ≥1 wie Argv [0] ist der Name des Befehls, der das Skript ausgeführt hat, meistens die Zeichenfolge "awk". Beachten Sie auch das Argv [argc] ist die leere Zeichenfolge, "" ". # Initiiert einen Kommentar, der sich bis zum Ende der Linie erweitert.

Beachten Sie das wenn Block. awk prüft nur, ob es aus der Standardeingabe gelesen wird, bevor der Befehl ausgeführt wird. Das bedeutet, dass

awk 'prog'

funktioniert nur, weil die Tatsache, dass keine Dateinamen gibt, nur zuvor überprüft wird Prog es läuft! Wenn Sie explizit eingestellt sind Argc Auf 1, damit es keine Argumente gibt, wird awk einfach aufhören, weil es das Gefühl hat, dass es keine Eingabedateien mehr gibt. Daher müssen Sie ausdrücklich sagen, dass Sie aus der Standardeingabe mit dem speziellen Dateinamen lesen können -.

In sich geschlossene awk-Skripte

Auf Unix-ähnlichen Betriebssystemen können selbstständige awk-Skripte mit dem konstruiert werden Shebang Syntax.

Beispielsweise kann ein Skript, das den Inhalt einer bestimmten Datei druckt, durch Erstellen einer Datei mit dem Namen erstellt werden print.awk mit dem folgenden Inhalt:

#!/usr/bin/awk -f { drucken $0 } 

Es kann aufgerufen werden mit: ./print.awk

Das -f AWK sagt awk, dass das folgende Argument die Datei zum Lesen des awk -Programms ist, das das gleiche Flag ist, das in SED verwendet wird. Da sie häufig für Einzeiler verwendet werden, werden beide Programme standardmäßig ein Programm ausführen, das als Befehlszeilenargument als separate Datei ausgegeben wird.

Versionen und Implementierungen

Awk wurde ursprünglich 1977 geschrieben und verteilt mit Version 7 Unix.

1985 begannen die Autoren, die Sprache zu erweitern, am deutlichsten, indem sie benutzerdefinierte Funktionen hinzufügen. Die Sprache wird im Buch beschrieben Die awk -Programmiersprache, veröffentlicht 1988, und seine Implementierung wurde in Veröffentlichungen von zur Verfügung gestellt UNIX -System v. Um Verwirrung mit der inkompatiblen älteren Version zu vermeiden, wurde diese Version manchmal "New Awg" oder bezeichnet Nawk. Diese Implementierung wurde unter einem veröffentlicht Kostenlose Softwarelizenz 1996 und wird immer noch von Brian Kernighan aufrechterhalten (siehe externe Links unten).

Alte Versionen von Unix, wie z. UNIX/32V, inbegriffen awkcc, das awk zu C. kernighan konvertierte, schrieb ein Programm, um awk in c ++ zu verwandeln; Sein Zustand ist nicht bekannt.[15]

  • Bwk awk, auch bekannt als Nawkbezieht sich auf die Version von Brian Kernighan. Es wurde als "One True Awk" bezeichnet, da der Begriff in Verbindung mit dem Buch, das ursprünglich die Sprache und die Tatsache beschrieben hat, dass Kernighan einer der ursprünglichen Autoren von Awk war.[7] FreeBSD bezieht sich auf diese Version als One-True-Awk.[16] Diese Version hat auch Funktionen im Buch, wie z. zu senken und Umwelt das werden oben erklärt; Weitere Informationen finden Sie in der Fixes -Datei im Quellarchiv. Diese Version wird zum Beispiel von zum Beispiel verwendet Android, Freebsd, Netbsd, OpenBSD, Mac OS, und Illumos. Brian Kernighan und Arnold Robbins sind die Hauptbeiträge für ein Quell -Repository für Nawk: Github.com/ONetRueAwk/awk.
  • gaffen (GNU awk) ist eine weitere Implementierung für freie Software und die einzige Implementierung, die ernsthafte Fortschritte implementiert Internationalisierung und Lokalisierung und TCP/IP -Netzwerk. Es wurde geschrieben, bevor die ursprüngliche Implementierung frei verfügbar wurde. Es enthält einen eigenen Debugger und seine Profiler Ermöglicht dem Benutzer, gemessene Leistungsverbesserungen für ein Skript vorzunehmen. Außerdem kann der Benutzer die Funktionalität mit freigegebenen Bibliotheken erweitern. Etwas Linux -Verteilungen enthalten gaffen als Standard -awk -Implementierung.
    • gawk-csv. Das CSV Erweiterung von gaffen Bietet Einrichtungen zum Umgang mit Eingaben und Ausgabe von CSV -formatierten Daten.[17]
  • MAWK ist eine sehr schnelle awk -Implementierung von Mike Brennan basierend auf einem Bytecode Dolmetscher.
  • libmawk ist eine Gabel von Mawk, die es Anwendungen ermöglicht, mehrere parallele Instanzen von AWK -Dolmetschern einzubetten.
  • Awka (dessen Frontend auf der MAWK Programm) ist ein weiterer Übersetzer von awk -Skripten in den C -Code. Nachdem die resultierenden ausführbaren Ausführungsgegenstände im Zusammenhang mit der libawka.a des Autors, statisch einschließlich des Autors, werden erheblich beschleunigt und laut den Tests des Autors sehr gut mit anderen Versionen von awk verglichen. Perl, oder Tcl. Kleine Skripte werden zu Programmen von 160 bis 170 kb.
  • Tawk (Thompson awk) ist ein awk Compiler zum Solaris, DOS, OS/2, und Fensterzuvor verkauft von Thompson Automation Software (die seine Aktivitäten eingestellt hat).[18]
  • Kiefer ist ein Projekt zum Implementieren von awk in Java, gehostet auf SourceForge.[19] Erweiterungen zur Sprache werden hinzugefügt, um Zugriff auf Java -Funktionen in awk -Skripten (d. H. Java -Threads, Sockets, Sammlungen usw.) zu gewähren.
  • xgawk ist eine Gabel von gaffen[20] Das erstreckt sich gaffen mit dynamisch ladbaren Bibliotheken. Die XMLGawk -Erweiterung wurde in die offizielle GNU AWK -Release 4.1.0 integriert.
  • QSeawk ist eine eingebettete AWK -Interpreter -Implementierung, die in der QSE -Bibliothek enthalten ist, die einbettet Programmierschnittstelle (API) für C und C ++.[21]
  • libfawk ist ein sehr kleiner, nur funktionierender, wieder eingebettbarer Interpreter, der in C geschrieben wurde
  • Busybox Enthält eine awk -Implementierung von Dmitry Zakharov. Dies ist eine sehr kleine Implementierung, die für eingebettete Systeme geeignet ist.
  • Klauen von Michael Parker bietet eine awk -Implementierung in Common Lispbasierend auf der regulären Ausdrucksbibliothek desselben Autors.[22]

Bücher

  • Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988-01-01). Die awk -Programmiersprache. New York, NY: Addison-Wesley. ISBN 0-201-07981-x. Abgerufen 2017-01-22.
  • Robbins, Arnold (2001-05-15). Effektive awk -Programmierung (3. Aufl.). Sebastopol, CA: O'Reilly Media. ISBN 0-596-00070-7. Abgerufen 2009-04-16.
  • Dougherty, Dale; Robbins, Arnold (1997-03-01). sed & awk (2. Aufl.). Sebastopol, CA: O'Reilly Media. ISBN 1-56592-225-5. Abgerufen 2009-04-16.
  • Robbins, Arnold (2000). Effektive awk -Programmierung: Ein Benutzerhandbuch für GNU awk (1.0.3 ed.). Bloomington, in: iuniverse. ISBN 0-595-10034-1. Archiviert Aus dem Original am 12. April 2009. Abgerufen 2009-04-16.

Siehe auch

Verweise

  1. ^ Stutz, Michael (19. September 2006). "Beginnen Sie mit Gawk: awk Language Fundamentals" (PDF). Entwicklerworks. IBM. Archiviert (PDF) vom Original am 2015-04-27. Abgerufen 2015-01-29. [Awk] wird häufig als datengesteuerte Sprache bezeichnet-die Programmanweisungen beschreiben die übereinstimmenden und verarbeitenden Eingabedaten anstelle einer Abfolge von Programmschritten
  2. ^ Andreas J. Pilavakis (1989). UNIX -Workshop. Macmillan International Hochschulbildung. p. 196.
  3. ^ Arnold Robbins (2015). Effektive awk -Programmierung: Universelle Textverarbeitung und Musteranpassung (4. Aufl.). O'Reilly Media. p. 560.
  4. ^ a b James W. Livingston (2. Mai 1988). "Das großartige AWK -Programm ist kein Birdbrain". Digitale Bewertung. p. 91.
  5. ^ Raymond, Eric S. "Minilanguages ​​anwenden". Die Kunst der Unix -Programmierung. Fallstudie: awk. Archiviert von das Original Am 30. Juli 2008. Abgerufen 11. Mai, 2010. Die awk-Aktionssprache ist vervollständigt und kann Dateien lesen und schreiben.
  6. ^ Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1. September 1978). Awk - ein Muster -Scan- und Verarbeitungssprache (zweite Ausgabe) (Technischer Bericht). UNIX Seventh Edition Manual, Band 2. Bell Telefonlabors, Inc. Archiviert vom Original am 15. August 2021. Abgerufen 1. Februar, 2020.
  7. ^ a b Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988). Die awk -Programmiersprache. Addison-Wesley Publishing Company. ISBN 9780201079814. Abgerufen 16. Mai 2015.
  8. ^ "Unix Special: Profs Kernighan & Brailsford". Computerphile. 30. September 2015. Archiviert vom Original am 2021-11-22.
  9. ^ "Die Einzel -Unix -Spezifikation, Version 3, Utilities Interface -Tabelle". Archiviert von das Original Am 2018-01-05. Abgerufen 2005-12-18.
  10. ^ "Kapitel 15. Befehle und Dienstprogramme". Linux -Standard -Basis -Kernspezifikation 4.0 (Technischer Bericht). Linux Foundation. 2008. Archiviert vom Original am 2019-10-16. Abgerufen 2020-02-01.
  11. ^ a b c Robbins, Arnold (März 2014). "Das GNU -Projekt und ich: 27 Jahre mit Gnu awk" (PDF). skeeve.com. Archiviert (PDF) Aus dem Original am 6. Oktober 2014. Abgerufen 4. Oktober, 2014.
  12. ^ Dougherty, Dale; Robbins, Arnold (1997). sed & awk (2. Aufl.). Sebastopol, CA: O'Reilly. p. 221. ISBN 1-565-92225-5.
  13. ^ Hamilton, Naomi (30. Mai 2008). "Der A-Z der Programmiersprachen: awk". Computerwelt. Archiviert vom Original am 2020-02-01. Abgerufen 2008-12-12.
  14. ^ a b "Datensätze (GNU AWK -Benutzerhandbuch)". Archiviert vom Original am 2020-06-14. Abgerufen 2020-05-23.
  15. ^ Kernighan, Brian W. (24. bis 25. April 1991). Ein awk zu c ++ übersetzer (PDF). Usenix C ++ - Konferenz. Washington, D.C. S. 217–228. Archiviert (PDF) vom Original am 2020-06-22. Abgerufen 2020-02-01.
  16. ^ "FreeBSDs Arbeitsprotokoll zum Importieren von BWK AWK in den Kern von FreeBSD". 16. Mai 2005. Archiviert Aus dem Original am 8. September 2013. Abgerufen 20. September, 2006.
  17. ^ gawk-csv Dokumentation bei http://gawkextlib.sourceforge.net/csv/gawk-csv.html Archiviert 2020-03-25 am Wayback -Maschine
  18. ^ James K. Lawless (1. Mai 1997). "Untersuchung des TAWK -Compilers". Dr. Dobbs Journal. Archiviert vom Original am 21. Februar 2020. Abgerufen 21. Februar, 2020.
  19. ^ "Kiefer bei SourceForge ". Archiviert vom Original am 2007-05-27. Abgerufen 2006-08-23.
  20. ^ "xgawk Startseite". Archiviert vom Original am 2013-04-18. Abgerufen 2013-05-07.
  21. ^ "QSeawk bei Github". Archiviert vom Original am 2018-06-11. Abgerufen 2017-09-06.
  22. ^ "Klawk bei Github". Archiviert vom Original am 2021-08-25. Abgerufen 2021-06-01.

Weitere Lektüre

Externe Links