Dies ist der Befehl awkposix, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
awk – Sprache zum Scannen und Verarbeiten von Mustern
ZUSAMMENFASSUNG
awk [-F Sepstring] [−v Zuordnung]... Programm [Argument...]
awk [-F Sepstring] -f Programmdatei [-f Programmdatei]... [−v Zuordnung]...
[Argument...]
BESCHREIBUNG
Die awk Das Dienstprogramm führt Programme aus, die in geschrieben sind awk Programmiersprache, die ist
spezialisiert auf Textdatenmanipulation. Ein awk Programm ist eine Folge von Mustern und
entsprechende Aktionen. Wenn eine Eingabe gelesen wird, die einem Muster entspricht, wird die zugehörige Aktion ausgeführt
mit diesem Muster ausgeführt wird.
Die Eingabe ist als Folge von Datensätzen zu interpretieren. Standardmäßig besteht ein Datensatz aus einer Zeile, kleiner
Es endet , aber dies kann mit der geändert werden RS eingebaute Variable. Jede
Der Eingabedatensatz muss der Reihe nach mit jedem Muster im Programm abgeglichen werden. Für jede
Wenn das Muster übereinstimmt, wird die zugehörige Aktion ausgeführt.
Die awk Das Dienstprogramm interpretiert jeden Eingabedatensatz als eine Folge von Feldern, wobei, durch
Standardmäßig ist ein Feld eine Zeichenfolge von Nicht- nicht- Figuren. Diese Standardeinstellung
Und Das Feldtrennzeichen kann mithilfe von geändert werden FS integrierte Variable oder die -F
Sepstring Option. Die awk Das Dienstprogramm bezeichnet das erste Feld in einem Datensatz mit $1, das zweite
2 $ und so weiter. Das Symbol $0 soll sich auf den gesamten Datensatz beziehen; jedes andere Feld festlegen
bewirkt die Neubewertung von $0. Durch die Zuweisung zu $0 werden die Werte aller anderen Felder zurückgesetzt
und den NF eingebaute Variable.
OPTIONAL
Die awk Dienstprogramm muss dem Band der Basisdefinitionen von POSIX.1‐2008 entsprechen, Abschnitt
12.2, Dienstprogramm Syntax Leitlinien.
Folgende Optionen sollen unterstützt werden:
-F Sepstring
Definieren Sie das Eingabefeldtrennzeichen. Diese Option entspricht:
-v FS=Sepstring
außer dass wenn -F Sepstring und −v FS=Sepstring werden beide verwendet, es ist nicht spezifiziert
ob die FS Zuordnung resultierend aus -F Sepstring wird im Befehl verarbeitet
Zeilenreihenfolge oder wird nach der letzten verarbeitet −v FS=Sepstring. Siehe die Beschreibung
FS Die integrierte Variable und deren Verwendung finden Sie in der ERWEITERTEN BESCHREIBUNG
.
-f Programmdatei
Geben Sie den Pfadnamen der Datei an Programmdatei mit einem awk Programm. Ein Pfadname
of '-' soll die Standardeingabe bezeichnen. Wenn mehrere Instanzen dieser Option vorhanden sind
angegeben, die Verkettung der angegebenen Dateien als Programmdatei in der Reihenfolge
angegeben werden soll awk Programm. Das awk Programm kann alternativ sein
in der Befehlszeile als einzelnes Argument angegeben.
−v Zuordnung
Der Antrag stellt sicher, dass die Zuordnung Argument hat die gleiche Form wie
an Zuordnung Operand. Die angegebene Variablenzuweisung muss vorher erfolgen
Ausführen der awk Programm, einschließlich der damit verbundenen Aktionen START Muster
(wenn überhaupt). Es können mehrere Vorkommen dieser Option angegeben werden.
OPERANDEN
Folgende Operanden sollen unterstützt werden:
Programm Wenn nein -f Option angegeben ist, der erste Operand awk soll der Text sein
awk Programm. Der Antrag muss die Programm Operand als Single
Argument zwei awk. Wenn der Text nicht mit a endet , awk interpretieren soll
den Text, als ob es so wäre.
Argument Eine der beiden folgenden Arten von Argument untereinander kombinierbar:
Datei Ein Pfadname einer Datei, die die zu lesende Eingabe enthält
mit den Mustern im Programm abgeglichen. Wenn nein Datei
Operanden angegeben sind, oder wenn a Datei Operand ist '-', Die Standard
Eingabe verwendet werden soll.
Zuordnung
Ein Operand, der mit an beginnt oder alphabetisches Zeichen
aus dem portablen Zeichensatz (siehe Tabelle in den Basisdefinitionen).
Band von POSIX.1‐2008, Abschnitt 6.1, Handy Charakter Stelle den ), gefolgt
durch eine Folge von Unterstrichen, Ziffern und Buchstaben aus dem
portabler Zeichensatz, gefolgt von '=' Zeichen, soll a angeben
Variablenzuweisung anstelle eines Pfadnamens. Die Charaktere vor dem
'=' den Namen eines darstellen awk Variable; wenn dieser Name ein ist awk
reserviertes Wort (vgl Grammatik) Das Verhalten ist undefiniert. Die Charaktere
im Anschluss an die sind so zu interpretieren, als ob sie erschienen wären
in England, awk Programm vorangestellt und gefolgt von einem doppelten Anführungszeichen ('"')
Charakter, als STRING Token (vgl Grammatik), außer wenn der letzte
Der Charakter ist unentdeckt , es soll als a interpretiert werden
wörtlich und nicht als erstes Zeichen der Sequenz
"\"". Der Variablen soll der entsprechende Wert zugewiesen werden STRING Zeichen
und gelten gegebenenfalls als a numerisch Schnur (sehen
Ausdrücke in awk), soll der Variablen auch ihr numerischer Wert zugewiesen werden
Wert. Jede solche Variablenzuweisung muss unmittelbar vor dem erfolgen
Verarbeitung des Folgenden Datei, wenn überhaupt. Also eine Aufgabe vor
Der Erste Datei Das Argument soll nach dem ausgeführt werden START Aktionen (falls
beliebig), während eine Zuweisung nach der letzten Datei Streit soll stattfinden
Vor dem ENDE Aktionen (falls vorhanden). Wenn es keine gibt Datei Argumente,
Zuweisungen müssen vor der Verarbeitung der Standardeingabe ausgeführt werden.
STDIN
Die Standardeingabe darf nur verwendet werden, wenn nein Datei Operanden angegeben sind, oder wenn a Datei
Operand ist '-', oder wenn a Programmdatei Optionsargument ist '-'; siehe Abschnitt EINGABEDATEIEN. Wenn
die awk Das Programm enthält keine Aktionen und keine Muster, ist aber ansonsten gültig awk Programms,
Standardeingabe und alle Datei Operanden dürfen nicht gelesen werden und awk wird mit einem Return beendet
Status Null.
SPEISUNG DATEIEN
Eingabedateien in die awk Programme aus einer der folgenden Quellen müssen Textdateien sein:
* Irgendein Datei Operanden oder ihre Äquivalente, erreicht durch Modifizieren der awk Variablen ARGV
und Argc
* Standardeingabe, sofern keine vorhanden ist Datei Operanden
* Argumente zum Getline Funktion
Ob die Variable RS auf einen anderen Wert als a gesetzt ist oder nicht, für diese Dateien,
Implementierungen müssen Datensätze unterstützen, die mit dem angegebenen Trennzeichen bis abgeschlossen werden
{LINE_MAX} Bytes und unterstützt möglicherweise längere Datensätze.
If -f Programmdatei Wird angegeben, stellt die Anwendung sicher, dass die von jedem benannten Dateien
die Programmdatei Optionsargumente sind Textdateien und deren Verkettung in derselben Reihenfolge wie
sie erscheinen in den Argumenten, ist ein awk
VARIABLEN
Die folgenden Umgebungsvariablen sollen die Ausführung von awk:
SPRACHE Geben Sie einen Standardwert für die Internationalisierungsvariablen an, die nicht festgelegt sind oder
Null. (Siehe den Band Basisdefinitionen von POSIX.1‐2008, Abschnitt 8.2,
Internationalisierung Variablen für den Vorrang der Internationalisierung
Variablen, die verwendet werden, um die Werte von Gebietsschemakategorien zu bestimmen.)
LC_ALL Wenn auf einen nicht leeren Zeichenfolgenwert gesetzt, überschreiben Sie die Werte aller anderen
Internationalisierungsvariablen.
LC_COLLATE
Bestimmen Sie das Gebietsschema für das Verhalten von Bereichen, Äquivalenzklassen und Multi-
Zeichensortierungselemente in regulären Ausdrücken und in Vergleichen von
Zeichenfolgenwerte.
LC_CTYPE Bestimmen Sie das Gebietsschema für die Interpretation von Sequenzen von Bytes von Textdaten
als Zeichen (z. B. Einzelbyte- im Gegensatz zu Mehrbyte-Zeichen in
Argumente und Eingabedateien), das Verhalten von Zeichenklassen innerhalb regulärer
Ausdrücke, die Identifizierung von Zeichen als Buchstaben und die Zuordnung von
Groß- und Kleinbuchstaben für die TOUPPER und tolower Funktionen.
LC_MESSAGES
Bestimmen Sie das Gebietsschema, das verwendet werden soll, um das Format und den Inhalt von . zu beeinflussen
Diagnosemeldungen in Standardfehler geschrieben.
LC_NUMERIC
Bestimmen Sie das Basiszeichen, das bei der Interpretation numerischer Eingaben verwendet wird
Konvertierungen zwischen numerischen und Zeichenfolgewerten und Formatierung der numerischen Ausgabe.
Unabhängig vom Standort ist die Zeichen (das Dezimalzeichen des
POSIX-Gebietsschema) ist das bei der Verarbeitung erkannte Dezimalzeichen awk
Programme (einschließlich Zuweisungen in Befehlszeilenargumenten).
NLSPATH Bestimmen Sie den Speicherort von Nachrichtenkatalogen für die Verarbeitung von LC_MESSAGES.
PATH Bestimmen Sie den Suchpfad, wenn Sie nach Befehlen suchen, die von ausgeführt werden fragst(ausdr), oder
Eingangs- und Ausgangsrohre; siehe den Band „Base Definitions“ von POSIX.1‐2008, Kapitel
8, Arbeitsumfeld Variablen.
Darüber hinaus müssen alle Umgebungsvariablen über das sichtbar sein awk Variable UMWELT.
ASYNCHRON EVENTS
Standard.
STDOUT
Die Art der Ausgabedateien hängt davon ab awk
STDERR
Der Standardfehler darf nur für Diagnosemeldungen verwendet werden.
AUSGABE DATEIEN
Die Art der Ausgabedateien hängt davon ab awk
VERLÄNGERT BESCHREIBUNG
Insgesamt: Programm Struktur
An awk Das Programm besteht aus Paaren der Form:
Anleitungen { Aktion }
Es kann entweder das Muster oder die Aktion (einschließlich der umschließenden Klammerzeichen) sein
weggelassen.
Ein fehlendes Muster muss mit jedem Eingabedatensatz übereinstimmen, und eine fehlende Aktion muss mit jedem Eingabedatensatz übereinstimmen
gleichwertig:
{ drucken }
Ausführung der awk Das Programm beginnt mit der Ausführung der damit verbundenen Aktionen
alle START Muster in der Reihenfolge, in der sie im Programm auftreten. Dann jeder Datei Operand (bzw
Standardeingabe, wenn keine Dateien angegeben wurden) werden wiederum durch Lesen von Daten aus verarbeitet
die Datei, bis ein Datensatztrennzeichen angezeigt wird ( standardmäßig). Vor dem Ersten
Wird ein Verweis auf ein Feld im Datensatz ausgewertet, wird der Datensatz in Felder aufgeteilt.
nach den Regeln in Normale Ausdrücke, unter Verwendung des Werts von FS das war aktuell bei
der Zeitpunkt, zu dem der Datensatz gelesen wurde. Jedes Muster im Programm soll dann im bewertet werden
Reihenfolge des Auftretens und die Aktion, die jedem Muster zugeordnet ist, das mit dem aktuellen übereinstimmt
Datensatz ausgeführt. Die Aktion für ein passendes Muster muss vor der Auswertung ausgeführt werden
nachfolgende Muster. Zum Schluss noch die mit allen verbundenen Aktionen ENDE Muster sollen sein
werden in der Reihenfolge ausgeführt, in der sie im Programm vorkommen.
Ausdrücke in awk
Ausdrücke beschreiben Berechnungen, die in verwendet werden Muster und Aktionen. In der folgenden Tabelle:
Gültige Ausdrucksoperationen werden in Gruppen von der höchsten Priorität zuerst zur niedrigsten angegeben
Vorrang zuletzt, wobei Operatoren mit gleicher Vorrangstellung zwischen horizontalen Linien gruppiert sind. In
Ausdrucksbewertung, bei der die Grammatik formal mehrdeutig ist, hat höhere Priorität
Operatoren müssen vor Operatoren mit niedrigerer Priorität ausgewertet werden. In dieser Tabelle ausdr, Ausdruck1,
Ausdruck2 und Ausdruck3 stellt einen beliebigen Ausdruck dar, während lvalue eine beliebige mögliche Entität darstellt
zugewiesen (d. h. auf der linken Seite eines Zuweisungsoperators). Die genaue Syntax von
Ausdrücke sind in angegeben Grammatik.
Tisch 4-1: Ausdrücke in Abnehmend Vorrang in awk
┌─────────────────────┬───────────────── ────────┬─ ───────────────┬──────────────┐
│ Syntax │ Name │ Typ of Ergebnis │Assoziativität │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│( ausdr ) │Gruppierung │Typ von ausdr │N/A │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│$ausdr │Feldreferenz │String │N/A │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│lvalue ++ │Post-Inkrement │Numerisch │N/A │
│lvalue −− │Post-Dekrement │Numerisch │N/A │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│++ L-Wert │Vorinkrement │Numerisch │N/A │
│−− Lvalue │Pre-Dekrement │Numerisch │N/A │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr ^ ausdr │Potenzierung │Numerisch │Rechts │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│! ausdr │Logisch, nicht │Numerisch │N/A │
│+ ausdr │Unär plus │Numerisch │N/A │
│− ausdr │Unäres Minus │Numerisch │N/A │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr * ausdr │Multiplikation │Numerisch │Links │
│ausdr / ausdr │Division │Numerisch │Links │
│ausdr % ausdr │Modul │Numerisch │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr + ausdr │Addition │Numerisch │Links │
│ausdr - ausdr │Subtraktion │Numerisch │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr ausdr │String-Verkettung │String │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr < ausdr │Kleiner als │Numerisch │Keine │
│ausdr <= ausdr │Kleiner oder gleich │Numerisch │Keine │
│ausdr != ausdr │Ungleich │Numerisch │Keine │
│ausdr == ausdr │Gleich │Numerisch │Keine │
│ausdr > ausdr │Größer als │Numerisch │Keine │
│ausdr >= ausdr │Größer als oder gleich │Numerisch │Keine │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr ~ ausdr │ERE Übereinstimmung │Numerisch │Keine │
│ausdr !~ ausdr │ERE nicht übereinstimmend │Numerisch │Keine │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr im Array │Array-Mitgliedschaft │Numerisch │Links │
│( Index ) in Array │Mehrdimensionales Array │Numerisch │Links │
│ │Mitgliedschaft │ │ │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr && ausdr │Logisch UND │Numerisch │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│ausdr || ausdr │Logisch ODER │Numerisch │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│Ausdruck1 ? Ausdruck2 : Ausdruck3│Bedingter Ausdruck │Typ der Auswahl│Rechts │
│ │ │Ausdruck2 or Ausdruck3 │ │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│lWert ^= ausdr │Potenzierungszuweisung│Numerisch │Rechts │
│lWert %= ausdr │Modulzuweisung │Numerisch │Rechts │
│lWert *= ausdr │Multiplikationsaufgabe│Numerisch │Rechts │
│lWert /= ausdr │Divisionszuordnung │Numerisch │Rechts │
│Wert += ausdr │Additionszuweisung │Numerisch │Rechts │
│lWert −= ausdr │Subtraktionsaufgabe │Numerisch │Rechts │
│lWert = ausdr │Aufgabe │Art von ausdr │Richtig │
└─────────────────────┴───────────────── ────────┴─ ───────────────┴──────────────┘
Jeder Ausdruck muss entweder einen Zeichenfolgenwert, einen numerischen Wert oder beides haben. Außer als
Für bestimmte Kontexte angegeben, muss der Wert eines Ausdrucks implizit in konvertiert werden
der Typ, der für den Kontext benötigt wird, in dem er verwendet wird. Ein String-Wert soll konvertiert werden
ein numerischer Wert, entweder durch das Äquivalent der folgenden Aufrufe von definierten Funktionen
der ISO-C-Standard:
setlocale(LC_NUMERIC, "");
Zahlenwert = atof(string_value);
oder durch Konvertieren des Anfangsteils der Zeichenfolge in einen Typ doppelt Darstellung als
folgt:
Die Eingabezeichenfolge wird in zwei Teile zerlegt: eine anfängliche, möglicherweise leere Sequenz
von Leerzeichen (wie angegeben durch istRaum()) und eine Betreffsequenz
als Gleitkommakonstante interpretiert.
Die erwartete Form der Subjektsequenz ist optional '+' or '-' unterschreiben, dann a
nichtleere Ziffernfolge, die optional ein enthält , dann ein optionales
Exponententeil. Ein Exponententeil besteht aus 'e' or 'E', gefolgt von einem optionalen
Vorzeichen, gefolgt von einer oder mehreren Dezimalstellen.
Die Reihenfolge beginnt mit der ersten Ziffer oder dem (was zuerst eintritt)
wird als schwebende Konstante der C-Sprache interpretiert, und wenn weder ein Exponent noch vorhanden ist
Teil noch ein erscheint, a Es wird davon ausgegangen, dass auf die letzte Ziffer in folgt
Zeichenfolge. Wenn die Betreffzeile mit einem Minuszeichen beginnt, ergibt sich der Wert aus
die Konvertierung wird negiert.
Ein numerischer Wert, der genau dem Wert einer Ganzzahl entspricht (siehe Abschnitt 1.1.2,
Konzepte Abgeleitet von die ISO C Standard) soll durch das Äquivalent in einen String umgewandelt werden
eines Anrufs an die sprintf Funktion (siehe Schnur Funktionen) mit der Zeichenfolge "%D" wie die fmt
Argument und der numerische Wert, der als erster und einziger konvertiert wird ausdr Streit. Beliebig
Ein anderer numerischer Wert wird durch das Äquivalent eines Aufrufs von in eine Zeichenfolge konvertiert
sprintf Funktion mit dem Wert der Variablen CONVFMT wie die fmt Argument und die
Der numerische Wert wird als erster und einziger konvertiert ausdr Streit. Das Ergebnis der
Die Konvertierung ist nicht angegeben, wenn der Wert von CONVFMT ist kein Gleitkommaformat
Spezifikation. Dieser Band von POSIX.1-2008 spezifiziert keine expliziten Konvertierungen zwischen
Zahlen und Zeichenfolgen. Eine Anwendung kann erzwingen, dass ein Ausdruck als Zahl behandelt wird
Fügen Sie Null hinzu oder erzwingen Sie, dass es als Zeichenfolge behandelt wird, indem Sie die Null verketten
Zeichenfolge ("") dazu.
Ein Zeichenfolgenwert gilt als a numerisch Schnur wenn es von einem der folgenden kommt:
1. Feldvariablen
2. Eingabe von der Getline() Funktion
3. DATEINAME
4. ARGV Array-Elemente
5. UMWELT Array-Elemente
6. Array-Elemente, die von erstellt wurden gespalten() Funktion
7. Eine Befehlszeilenvariablenzuweisung
8. Variablenzuweisung von einer anderen numerischen String-Variablen
und eine umsetzungsabhängige Bedingung, die entweder dem folgenden Fall (a) oder (b) entspricht, ist
getroffen.
A. Nach dem Äquivalent der folgenden Aufrufe von Funktionen, die von ISO C definiert sind
Standard, string_value_end würde sich unterscheiden von string_value, und alle Zeichen davor
das abschließende Nullzeichen in string_value_end wäre Figuren:
verkohlen *string_value_end;
setlocale(LC_NUMERIC, "");
Zahlenwert = strtod (string_value, &string_value_end);
B. Nachdem alle folgenden Konvertierungen angewendet wurden, wäre die resultierende Zeichenfolge
lexikalisch als erkannt werden NUMBER Token gemäß den lexikalischen Konventionen in
Grammatik:
-- Alle vor- und nachgestellten Zeichen werden verworfen.
-- Wenn das erste Nicht- Ist '+' or '-', es wird verworfen.
– Jedes Vorkommen des Dezimalpunktzeichens aus dem aktuellen Gebietsschema wird geändert
zu einem .
Im Fall (a) der numerische Wert von numerisch Schnur soll der Wert sein, der sein würde
zurückgegeben von der strtod() Anruf. Im Fall (b), wenn das erste Nicht- Ist '-', die Zahl
Wert der numerisch Schnur soll die Negation des numerischen Werts des erkannten sein
NUMBER Zeichen; andernfalls der numerische Wert von numerisch Schnur soll die Zahl sein
Wert des anerkannten NUMBER Zeichen. Ob eine Zeichenfolge ein ist oder nicht numerisch Schnur sind
ist nur in Zusammenhängen relevant, in denen dieser Begriff in diesem Abschnitt verwendet wird.
Wenn ein Ausdruck in einem booleschen Kontext verwendet wird und er einen numerischen Wert hat, einen Wert von
Null wird als falsch behandelt und jeder andere Wert wird als wahr behandelt. Ansonsten a
Der Zeichenfolgenwert der Nullzeichenfolge wird als falsch behandelt, und jeder andere Wert gilt ebenfalls
als wahr behandelt. Ein boolescher Kontext muss einer der folgenden sein:
* Der erste Unterausdruck eines bedingten Ausdrucks
* Ein Ausdruck, der durch logisches NICHT, logisches UND oder logisches ODER bearbeitet wird
* Der zweite Ausdruck von a für Aussage
* Der Ausdruck eines if Aussage
* Der Ausdruck des während Klausel in entweder a während or do...während Aussage
* Ein Ausdruck, der als Muster verwendet wird (wie in „Gesamtprogrammstruktur“)
Die gesamte Arithmetik muss der Semantik der Gleitkomma-Arithmetik folgen, wie in der
ISO C-Standard (siehe Abschnitt 1.1.2, Konzepte Abgeleitet von die ISO C Standard).
Der Wert des Ausdrucks:
Ausdruck1 ^ Ausdruck2
muss dem vom ISO C-Standardfunktionsaufruf zurückgegebenen Wert entsprechen:
pow(Ausdruck1, Ausdruck2)
Der Ausdruck:
lWert ^= ausdr
muss dem ISO-C-Standardausdruck entsprechen:
lWert = pow(lvalue, ausdr)
mit der Ausnahme, dass lvalue nur einmal ausgewertet werden soll. Der Wert des Ausdrucks:
Ausdruck1 % Ausdruck2
muss dem vom ISO C-Standardfunktionsaufruf zurückgegebenen Wert entsprechen:
fmod(Ausdruck1, Ausdruck2)
Der Ausdruck:
lWert %= ausdr
muss dem ISO-C-Standardausdruck entsprechen:
lWert = fmod(lvalue, ausdr)
mit der Ausnahme, dass lvalue nur einmal ausgewertet werden soll.
Variablen und Felder werden durch die Zuweisungsanweisung festgelegt:
lWert = Ausdruck
und die Art von Ausdruck soll den resultierenden Variablentyp bestimmen. Die Zuordnung
beinhaltet die Rechenaufgaben ("+=", "−=", "*=", "/=", "%=", "^=", "++", "−−") alle
davon soll ein numerisches Ergebnis entstehen. Die linke Seite einer Aufgabe und die
Das Ziel von Inkrementierungs- und Dekrementierungsoperatoren kann eine Variable, ein Array mit Index oder
oder ein Feldselektor.
Die awk Die Sprache stellt Arrays bereit, die zum Speichern von Zahlen oder Zeichenfolgen verwendet werden. Arrays
müssen nicht deklariert werden. Sie müssen zunächst leer sein und ihre Größe ändert sich
dynamisch. Die Indizes oder Elementbezeichner sind Zeichenfolgen und stellen einen Typ von bereit
assoziative Array-Fähigkeit. Ein Array-Name, gefolgt von einem Index in eckigen Klammern
kann als L-Wert und damit als Ausdruck verwendet werden, wie in der Grammatik beschrieben; sehen
Grammatik. Nicht abonnierte Array-Namen können nur in den folgenden Kontexten verwendet werden:
* Ein Parameter in einer Funktionsdefinition oder einem Funktionsaufruf
* Die NAME/FUNKTION Token nach jeder Verwendung des Schlüsselworts in wie in der Grammatik angegeben (siehe
Grammatik); Wenn der in diesem Kontext verwendete Name kein Array-Name ist, ist das Verhalten der Fall
undefiniert
Ein gültiges Array Index soll aus einem oder mehreren bestehen -getrennte Ausdrücke, ähnlich wie
die Art und Weise, wie mehrdimensionale Arrays in einigen Programmiersprachen indiziert werden.
Parce que awk Arrays sind wirklich eindimensional, wie z -Getrennte Liste soll sein
in eine einzelne Zeichenfolge konvertiert, indem die Zeichenfolgenwerte der einzelnen Zeichenfolgen verkettet werden
Ausdrücke, die jeweils durch den Wert voneinander getrennt sind SUBSEP Variable. Und so kam es dass der
Die folgenden zwei Indexoperationen müssen gleichwertig sein:
jung[Ausdruck1, Ausdruck2... exprn]
jung[Ausdruck1 SUBSEP Ausdruck2 SUBSEP ... SUBSEP exprn]
Die Anwendung soll sicherstellen, dass eine mehrdimensionale Index verwendet mit dem in Betreiber ist
in Klammern gesetzt. Der in Operator, der die Existenz eines bestimmten Arrays prüft
Element, darf nicht dazu führen, dass dieses Element existiert. Jeder andere Verweis auf ein nicht vorhandenes Array
Element soll es automatisch erstellen.
Vergleiche (mit dem '<', "<=", "!=", "==", '>' und ">=" Betreiber) erfolgen
numerisch, wenn beide Operanden numerisch sind, wenn einer numerisch ist und der andere eine Zeichenfolge hat
Wert, der eine numerische Zeichenfolge ist, oder wenn einer numerisch ist und der andere nicht initialisiert ist
Wert. Ansonsten werden Operanden nach Bedarf in Strings und einen String konvertiert
Der Vergleich muss anhand der gebietsschemaspezifischen Sortierfolge erfolgen. Der Wert der
Der Vergleichsausdruck muss 1 sein, wenn die Beziehung wahr ist, oder 0, wenn die Beziehung falsch ist.
Variablen und Spezial Variablen
Variablen können in einem verwendet werden awk Programm, indem Sie darauf verweisen. Mit Ausnahme von
Funktionsparameter (siehe Benutzerdefinierte Funktionen), werden sie nicht explizit deklariert.
Funktionsparameternamen müssen lokal für die Funktion sein; alle anderen Variablennamen sollen sein
global. Derselbe Name darf nicht sowohl als Funktionsparametername als auch als Name verwendet werden
einer Funktion oder eines Specials awk Variable. Derselbe Name darf nicht gleichzeitig als verwendet werden
Variablenname mit globalem Gültigkeitsbereich und als Name einer Funktion. Derselbe Name soll nicht sein
Wird im selben Bereich sowohl als Skalarvariable als auch als Array verwendet. Nicht initialisiert
Variablen, einschließlich Skalarvariablen, Array-Elementen und Feldvariablen, müssen eine haben
nicht initialisierter Wert. Ein nicht initialisierter Wert muss sowohl den numerischen Wert Null als auch a haben
Zeichenfolgenwert der leeren Zeichenfolge. Auswertung von Variablen mit einem nicht initialisierten Wert, um
Ob Zeichenfolgen oder Zahlen, werden durch den Kontext bestimmt, in dem sie verwendet werden.
Feldvariablen werden mit a bezeichnet '$' gefolgt von einer Zahl oder einem numerischen Ausdruck.
Die Auswirkung der Feldnummer Ausdruck zu etwas anderem als einem nicht negativen Ergebnis bewerten
Ganzzahl ist nicht angegeben; Nicht initialisierte Variablen oder Zeichenfolgenwerte müssen nicht konvertiert werden
numerische Werte in diesem Zusammenhang. Neue Feldvariablen können durch Zuweisen eines Werts erstellt werden
ihnen. Verweise auf nicht vorhandene Felder (d. h. Felder nach $NF), soll ausgewertet werden
nicht initialisierter Wert. Durch solche Verweise dürfen keine neuen Felder erstellt werden. Die Zuordnung zu a
nicht vorhandenes Feld (z. B. $(NF+2)=5) soll den Wert von erhöhen NF; Erstellen Sie welche
dazwischenliegende Felder mit dem nicht initialisierten Wert; und bewirken, dass der Wert $0 ist
neu berechnet, wobei die Felder durch den Wert von getrennt werden OFS. Jede Feldvariable
muss beim Erstellen einen Zeichenfolgenwert oder einen nicht initialisierten Wert haben. Feldvariablen sollen
haben den nicht initialisierten Wert, wenn sie aus $0 mit erstellt werden FS und die Variable nicht
beliebige Zeichen enthalten. Gegebenenfalls ist die Feldvariable als Zahl zu betrachten
Zeichenfolge (siehe Ausdrücke in awk).
Implementierungen müssen die folgenden anderen speziellen Variablen unterstützen, die von festgelegt werden awk:
Argc Die Anzahl der Elemente in der ARGV Array.
ARGV Ein Array von Befehlszeilenargumenten, ausgenommen Optionen und Programm Streit,
von Null bis nummeriert Argc−1.
Die Argumente in ARGV kann geändert oder ergänzt werden; Argc kann geändert werden. Wie jeder
Eingabedatei endet, awk soll das nächste Nicht-Null-Element von behandeln ARGV, bis zum
aktueller Wert von Argc−1 (einschließlich) als Name der nächsten Eingabedatei. Daher,
Festlegen eines Elements von ARGV auf null bedeutet, dass es nicht als behandelt werden soll
Eingabedatei. Der Name '-' gibt die Standardeingabe an. Wenn ein Argument übereinstimmt
das Format einer Zuordnung Operand, dieses Argument soll als behandelt werden
Zuordnung eher als ein Datei Argument.
CONVFMT Die printf Format zum Konvertieren von Zahlen in Zeichenfolgen (außer für die Ausgabe).
Aussagen, wo OFMT wird eingesetzt); „%.6g“ standardmäßig.
UMWELT Ein Array, das den Wert der Umgebung darstellt, wie im beschrieben exec
Funktionen, die im System Interfaces-Band von POSIX.1-2008 definiert sind. Die Indizes
des Arrays sollen Zeichenfolgen sein, die aus den Namen der Umgebung bestehen
Variablen, und der Wert jedes Array-Elements muss eine Zeichenfolge sein, bestehend aus
der Wert dieser Variablen. Gegebenenfalls muss die Umgebungsvariable sein
Als ein numerisch Schnur (sehen Ausdrücke in awk); Das Array-Element soll
haben auch ihren numerischen Wert.
In allen Fällen, in denen das Verhalten von awk wird von Umgebungsvariablen beeinflusst
(einschließlich der Umgebung aller Befehle, die awk wird über die ausgeführt fragst
Funktion oder über Pipeline-Umleitungen mit der drucken Aussage, die printf
Aussage, oder die Getline Funktion), die verwendete Umgebung soll die sein
Umfeld zu der Zeit awk begann mit der Hinrichtung; es ist durch die Implementierung definiert
ob irgendeine Änderung von UMWELT wirkt sich auf diese Umgebung aus.
DATEINAME Ein Pfadname der aktuellen Eingabedatei. In einem START Aktion der Wert ist
nicht definiert. Innerhalb eines ENDE Bei der Aktion soll der Wert der Name der letzten Eingabe sein
Datei verarbeitet.
FNR Die Ordnungszahl des aktuellen Datensatzes in der aktuellen Datei. In einem START
Aktion muss der Wert Null sein. Innerhalb eines ENDE Aktion soll der Wert sein
Nummer des zuletzt verarbeiteten Datensatzes in der zuletzt verarbeiteten Datei.
FS Regulärer Ausdruck als Eingabefeldtrennzeichen; A standardmäßig.
NF Die Anzahl der Felder im aktuellen Datensatz. In einem START Aktion, die Verwendung von NF
ist undefiniert, es sei denn a Getline Funktion ohne a jung Argument wird ausgeführt
vorher. Innerhalb eines ENDE Aktion, NF behält den Wert, den es zuletzt hatte
Datensatz gelesen, es sei denn, ein nachfolgender, umgeleiteter, Getline Funktion ohne a jung
Das Argument wird vor der Eingabe ausgeführt ENDE Maßnahmen.
NR Die Ordnungszahl des aktuellen Datensatzes ab Beginn der Eingabe. In einem
START Aktion muss der Wert Null sein. Innerhalb eines ENDE Aktion der Wert sein soll
die Nummer des zuletzt verarbeiteten Datensatzes.
OFMT Die printf Format zum Konvertieren von Zahlen in Zeichenfolgen in Ausgabeanweisungen (siehe
Ausgang Statements); „%.6g“ standardmäßig. Das Ergebnis der Konvertierung ist
nicht angegeben, wenn der Wert von OFMT ist keine Gleitkommaformatspezifikation.
OFS Die drucken Trennzeichen für Anweisungsausgabefelder; standardmäßig.
ORS Die drucken Trennzeichen für Anweisungsausgabedatensätze; A standardmäßig.
LÄNGE Die Länge der Zeichenfolge, die mit der übereinstimmt Spiel Funktion.
RS Das erste Zeichen des Zeichenfolgenwerts von RS soll der Eingabedatensatz sein
Separator; A standardmäßig. Wenn RS enthält mehr als ein Zeichen, das
Ergebnisse sind nicht spezifiziert. Wenn RS null ist, werden die Datensätze durch Sequenzen getrennt
bestehend aus a plus eine oder mehrere Leerzeilen, vor- oder nachgestellt
Leerzeilen dürfen nicht zu leeren Datensätzen am Anfang oder Ende führen
Eingabe und a soll immer ein Feldtrennzeichen sein, egal was das ist
Wert von FS ist.
RSTART Die Startposition der Zeichenfolge, die mit der übereinstimmt Spiel Funktion, Nummerierung
von 1. Dies muss immer dem Rückgabewert von entsprechen Spiel
Funktion.
SUBSEP Die tiefgestellte Trennzeichenfolge für mehrdimensionale Arrays; der Standardwert
ist implementierungsspezifisch.
Normale Ausdrücke
Die awk Das Dienstprogramm muss die erweiterte Notation für reguläre Ausdrücke verwenden (siehe Base
Definitionen Band von POSIX.1‐2008, Abschnitt 9.4, Verlängert Normale Ausdrücke) außer dass
Es soll die Verwendung von C-Sprachkonventionen zum Escapen von Sonderzeichen ermöglichen
die EREs, wie in der Tabelle im Band „Base Definitions“ von POSIX.1-2008 angegeben,
Kapitel 5, Reichen Sie das Format Bewertung ('\\', '\ein', '\B', '\F', '\n', '\R', '\t', '\v') und das
Folgende Tabelle; Diese Escape-Sequenzen müssen sowohl innen als auch außen erkannt werden
Klammerausdrücke. Beachten Sie, dass Datensätze nicht durch getrennt werden müssen Charaktere und
String-Konstanten enthalten können Charaktere, also sogar die "\n" Die Reihenfolge ist gültig in
awk EREs. Verwendung einer Zeichen innerhalb eines ERE erfordert das in der gezeigte Escapezeichen
Folgende Tabelle.
Tisch 4-2: Flucht Sequenzen in awk
┌─────────┬───────────────────────────── ───────┬── ──────────────────────────────────┐
│ Flucht │ │ │
│Reihenfolge │ Beschreibung │ Bedeutung │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\" │ │ Charakter │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\/ │ │ Charakter │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\ddd │ A Zeichen gefolgt │ Das Zeichen, dessen Codierung │ ist
│ │ durch die längste Folge von Eins, │ dargestellt durch Eins, Zwei oder │
│ │ zwei oder drei oktale Ziffern │ dreistellige oktale Ganzzahl. Multi- │
│ │ Zeichen (01234567). Wenn alle │-Byte-Zeichen mehrere erfordern, │
│ │ die Ziffern sind 0 (d. h. │ verkettete Escape-Sequenzen von │).
│ │ Darstellung der NUL │ dieses Typs, einschließlich der führenden │
│ │ Charakter), das Verhalten ist │ für jedes Byte. │
│ │ undefiniert. │ │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\c │ A Zeichen gefolgt │ Undefiniert │
│ │ durch ein Zeichen, das nicht in │ │ beschrieben ist
│ │ dieser Tabelle oder in der Tabelle im │ │
│ │ Grunddefinitionsvolumen von │ │
│ │ POSIX.1‐2008, Kapitel 5, Reichen Sie das │ │
│ │ Format Bewertung ('\\', '\ein', '\B', │ │
│ │ '\F', '\n', '\R', '\t', '\v'). │ │
└─────────┴───────────────────────────── ───────┴── ──────────────────────────────────┘
Ein regulärer Ausdruck kann mit einem bestimmten Feld oder einer bestimmten Zeichenfolge abgeglichen werden, indem eines der folgenden verwendet wird
zwei Vergleichsoperatoren für reguläre Ausdrücke, '~' und „!~“. Diese Operatoren sollen interpretieren
ihren rechten Operanden als regulären Ausdruck und ihren linken Operanden als String.
Wenn der reguläre Ausdruck mit der Zeichenfolge übereinstimmt, wird die '~' Der Ausdruck soll einen Wert ergeben
von 1 und die „!~“ Der Ausdruck soll den Wert 0 ergeben. (Der reguläre Ausdruck
Der Matching-Vorgang entspricht der Definition durch den Begriff „matched“ im Band „Basisdefinitionen“ von
POSIX.1‐2008, Abschnitt 9.1, Normale Ausdruck Definitionen, wobei bei jedem eine Übereinstimmung auftritt
Teil der Zeichenfolge, es sei denn, der reguläre Ausdruck ist durch eingeschränkt oder
Sonderzeichen.) Wenn der reguläre Ausdruck nicht mit der Zeichenfolge übereinstimmt,
die '~' Ausdruck soll einen Wert von 0 ergeben, und der „!~“ Der Ausdruck soll ausgewertet werden
auf den Wert 1. Wenn der rechte Operand ein anderer Ausdruck als das lexikalische Token ist
EHE, soll der String-Wert des Ausdrucks als erweiterter regulärer Wert interpretiert werden
Ausdruck, einschließlich der oben beschriebenen Escape-Konventionen. Beachten Sie, dass dies die gleiche Flucht ist
Konventionen müssen auch bei der Bestimmung des Werts eines String-Literals angewendet werden (der
lexikalisches Token STRING) und soll daher ein zweites Mal angewendet werden, wenn ein String-Literal vorhanden ist
in diesem Zusammenhang verwendet.
wenn ein EHE token erscheint als Ausdruck in jedem anderen Kontext als als rechte Hand von
die '~' or „!~“ Operator oder als eines der unten beschriebenen integrierten Funktionsargumente
Der Wert des resultierenden Ausdrucks muss äquivalent sein zu:
$0 " " /ehe/
Die ehe Argument an die gsub, Spiel, unten Funktionen und die fs Argument an die gespalten
Funktion (siehe Schnur Funktionen) sind als erweiterte reguläre Ausdrücke zu interpretieren.
Dies können beides sein EHE Tokens oder beliebige Ausdrücke und werden im interpretiert
auf die gleiche Weise wie auf der rechten Seite '~' or „!~“ Betreiber.
Ein erweiterter regulärer Ausdruck kann zum Trennen von Feldern durch Zuweisung einer Zeichenfolge verwendet werden
Enthält den Ausdruck für die integrierte Variable FS, entweder direkt oder als Folge
der Verwendung der -F Sepstring Möglichkeit. Der Standardwert der FS Die Variable muss eine Single sein
. Im Folgenden wird beschrieben FS Verhalten:
1. Wenn FS ist eine Nullzeichenfolge, das Verhalten ist nicht spezifiziert.
2. Wenn FS ist ein einzelnes Zeichen:
A. Ob FS Ist , Überspringen Sie das Vor- und Nachstellen Und Figuren;
Felder müssen durch Sätze von einem oder mehreren begrenzt werden oder Figuren.
B. Ansonsten, wenn FS ist ein beliebiges anderes Zeichen c, Felder müssen durch jedes getrennt werden
einmaliges Vorkommen von c.
3. Ansonsten der String-Wert von FS gilt als verlängerter regulärer Termin
Ausdruck. Jedes Vorkommen einer Sequenz, die mit dem erweiterten regulären Ausdruck übereinstimmt
soll Felder begrenzen.
Mit Ausnahme der '~' und „!~“ Betreiber und in der gsub, Spiel, gespalten und unten eingebaut
Funktionen: Der ERE-Abgleich muss auf Eingabedatensätzen basieren. das heißt, Datensatztrennzeichen
Zeichen (das erste Zeichen des Werts der Variablen). RS, standardmäßig)
kann nicht in den Ausdruck eingebettet werden und kein Ausdruck darf mit dem Datensatztrennzeichen übereinstimmen
Charakter. Wenn das Datensatztrennzeichen nicht vorhanden ist , Zeichen eingebettet in die
Ausdruck kann abgeglichen werden. Für die '~' und „!~“ Operatoren, und in diesen vier eingebaut
Funktionen, ERE-Matching soll auf Textzeichenfolgen basieren; das heißt, jedes Zeichen (einschließlich
und das Datensatztrennzeichen) können in das Muster eingebettet werden, und ein entsprechendes
Das Muster muss mit jedem Zeichen übereinstimmen. Allerdings im Großen und Ganzen awk ERE-Matching, die Verwendung eines oder
Weitere NUL-Zeichen im Muster, im Eingabedatensatz oder in der Textzeichenfolge führen zu undefinierten Zeichen
Ergebnisse angezeigt
Patterns
A Anleitungen ist irgendein gültig Ausdruck, ein Bereich, der durch zwei durch a getrennte Ausdrücke angegeben wird
Komma oder eines der beiden Sondermuster START or ENDE.
Spezial Patterns
Die awk Das Dienstprogramm soll zwei spezielle Muster erkennen, START und ENDE. Jeder START Anleitungen
muss einmal abgeglichen und die zugehörige Aktion vor dem ersten Eingabedatensatz ausgeführt werden
gelesen wird – außer möglicherweise durch die Verwendung des Getline Funktion (siehe Input / Output und Allgemein
Funktionen) in einem Prior START Aktion – und bevor die Befehlszeilenzuweisung abgeschlossen ist. Jede ENDE
Das Muster muss einmal abgeglichen und die zugehörige Aktion nach dem letzten Datensatz von ausgeführt werden
Die Eingabe wurde gelesen. Diese beiden Muster müssen verknüpfte Aktionen haben.
START und ENDE Darf nicht mit anderen Mustern kombiniert werden. Mehrere START und ENDE Muster sollen
zugelassen werden. Die damit verbundenen Aktionen START Muster werden in der Reihenfolge ausgeführt
im Programm angegeben, ebenso wie die ENDE Aktionen. Ein ENDE Muster kann vor a stehen START
Muster in einem Programm.
Wenn ein awk Das Programm besteht nur aus Aktionen mit dem Muster STARTund die START Aktion
enthält keine Getline Funktion, awk soll beim letzten Mal beendet werden, ohne seine Eingabe zu lesen
Aussage im letzten START Aktion wird ausgeführt. Wenn ein awk Das Programm besteht nur aus Aktionen
mit dem Muster ENDE oder nur Aktionen mit den Mustern START und ENDE, die Eingabe soll sein
Lesen Sie vorher die Aussagen in der ENDE Aktionen werden ausgeführt.
Ausdruck Patterns
Ein Ausdrucksmuster soll so ausgewertet werden, als wäre es ein Ausdruck in einem booleschen Kontext.
Wenn das Ergebnis wahr ist, wird davon ausgegangen, dass das Muster übereinstimmt und die damit verbundene Aktion ausgeführt wird
(sofern vorhanden) ausgeführt werden. Wenn das Ergebnis falsch ist, wird die Aktion nicht ausgeführt.
Schnittmuster Ranges
Ein Musterbereich besteht aus zwei durch Komma getrennten Ausdrücken; in diesem Fall die Aktion
wird für alle Datensätze zwischen einer Übereinstimmung des ersten Ausdrucks und dem durchgeführt
folgende Übereinstimmung des zweiten Ausdrucks, einschließlich. An diesem Punkt kann der Musterbereich
wird beginnend bei Eingabedatensätzen nach dem Ende des übereinstimmenden Bereichs wiederholt.
Aktionen
Eine Aktion ist eine Folge von Anweisungen, wie in der Grammatik in gezeigt Grammatik. Irgendeine Single
Die Anweisung kann durch eine in geschweifte Klammern eingeschlossene Anweisungsliste ersetzt werden. Die Anwendung
stellt sicher, dass Anweisungen in einer Anweisungsliste durch getrennt sind oder
Figuren. Anweisungen in einer Anweisungsliste müssen nacheinander in der Reihenfolge ausgeführt werden
dass sie erscheinen.
Die Ausdruck fungiert als Bedingung in einem if Die Aussage soll ausgewertet werden und wenn ja
ungleich Null oder ungleich Null ist, soll die folgende Anweisung ausgeführt werden; andernfalls, wenn sonst is
vorhanden, die Aussage im Anschluss an die sonst soll ausgeführt werden.
Die if, während, do...während, für , brechen und fortsetzen Die Aussagen basieren auf ISO C
Standard (siehe Abschnitt 1.1.2, Konzepte Abgeleitet von die ISO C Standard), außer dass die
Boolesche Ausdrücke werden wie in beschrieben behandelt Ausdrücke in awk, und außer in der
Fall von:
für (Variable in Array)
die iterieren und jeweils zuweisen soll Index of Array zu Variable in unbestimmter Reihenfolge.
Die Ergebnisse des Hinzufügens neuer Elemente zu Array innerhalb eines solchen für Schleife sind undefiniert. Wenn ein
brechen or fortsetzen Tritt die Anweisung außerhalb einer Schleife auf, ist das Verhalten undefiniert.
Die löschen Die Anweisung soll ein einzelnes Array-Element entfernen. Daher der folgende Code
löscht ein ganzes Array:
für (Index in Reihe)
löschen Array[Index]
Die weiter Die Anweisung soll die gesamte weitere Verarbeitung des aktuellen Eingabedatensatzes veranlassen
verlassen. Das Verhalten ist undefiniert, wenn a weiter Die Anweisung erscheint oder wird in a aufgerufen START
or ENDE Maßnahmen.
Die wunsch Die Anweisung soll alle aufrufen ENDE Aktionen in der Reihenfolge, in der sie im auftreten
Programmquelle und beenden Sie dann das Programm, ohne weitere Eingaben zu lesen. Ein wunsch
Aussage innerhalb einer ENDE Die Aktion beendet das Programm ohne weitere Ausführung von
ENDE Aktionen. Wenn ein Ausdruck in einem angegeben ist wunsch Aussage, sein numerischer Wert soll
sei der Exit-Status von awk, es sei denn, es treten Folgefehler auf oder es kommt zu einem Folgefehler wunsch
Anweisung mit einem Ausdruck wird ausgeführt.
Ausgang Statements
Beide drucken und printf Anweisungen schreiben standardmäßig in die Standardausgabe. Die Ausgabe
werden an den von angegebenen Ort geschrieben Ausgabeumleitung wenn einer mitgeliefert wird, als
folgt:
> Ausdruck
>> Ausdruck
| Ausdruck
In allen Fällen ist die Ausdruck soll ausgewertet werden, um eine Zeichenfolge zu erzeugen, die als verwendet wird
Pfadname, in den geschrieben werden soll (z '>' or „>>“) oder als auszuführender Befehl (z '|').
Bei Verwendung der ersten beiden Formen gilt: Wenn die Datei mit diesem Namen derzeit nicht geöffnet ist, ist sie geöffnet
öffnen, ggf. erstellen und das erste Formular verwenden, die Datei kürzen. Die Ausgabe
werden dann der Akte beigefügt. Solange die Datei geöffnet bleibt, sind nachfolgende Aufrufe möglich
welche Ausdruck Ergibt den gleichen Zeichenfolgenwert, wird die Ausgabe einfach an den angehängt
Datei. Die Datei bleibt bis zum geöffnet schließen Funktion (siehe Input / Output und Allgemein
Funktionen) wird mit einem Ausdruck aufgerufen, der denselben Zeichenfolgenwert ergibt.
Die dritte Form soll die Ausgabe in einen Stream schreiben, der an die Eingabe eines Befehls weitergeleitet wird. Der
Stream soll erstellt werden, wenn derzeit kein Stream mit dem Wert geöffnet ist Ausdruck als
Befehlsname. Der erstellte Stream muss einem Stream entsprechen, der durch einen Aufruf von erstellt wurde
Popen()-Funktion, definiert im System Interfaces-Band von POSIX.1-2008 mit dem Wert von
Ausdruck wie die Befehl Argument und ein Wert von w wie die Modus Streit. Solange die
Stream bleibt geöffnet, nachfolgende Aufrufe in denen Ausdruck ergibt die gleiche Zeichenfolge
Der Wert soll die Ausgabe in den vorhandenen Stream schreiben. Der Stream bleibt bis zum geöffnet
schließen Funktion (siehe Input / Output und Allgemein Funktionen) wird mit einem Ausdruck aufgerufen, der
ergibt den gleichen Stringwert. Zu diesem Zeitpunkt wird der Stream wie durch a geschlossen
Ruf an die pschließen()-Funktion, definiert im System Interfaces-Band von POSIX.1-2008.
Wie ausführlich in der Grammatik beschrieben Grammatik, diese Ausgabeanweisungen müssen a dauern
-getrennte Liste von Ausdrucks wird in der Grammatik durch das Nichtterminal bezeichnet
Symbole expr_list, print_expr_list oder print_expr_list_opt. Auf diese Liste wird hier verwiesen
wie die Ausdruck Liste, und jedes Mitglied wird als bezeichnet Ausdruck Argument.
Die drucken Die Anweisung schreibt den Wert jedes Ausdrucksarguments in das angegebene Feld
Ausgabestream getrennt durch das aktuelle Ausgabefeldtrennzeichen (siehe Variable OFS Oben),
und durch das Ausgabedatensatztrennzeichen abgeschlossen (siehe Variable ORS über). Alles Ausdruck
Argumente werden als Zeichenfolgen betrachtet und bei Bedarf konvertiert. diese Umwandlung soll
wie in beschrieben sein Ausdrücke in awk, mit der Ausnahme, dass die printf Format in OFMT
anstelle des Wertes in verwendet werden CONVFMT. Es soll eine leere Ausdrucksliste stehen
der gesamte Eingabedatensatz ($0).
Die printf Die Anweisung soll eine Ausgabe basierend auf einer Notation erzeugen, die dem Dateiformat ähnelt
Notation zur Beschreibung von Dateiformaten in diesem Band von POSIX.1-2008 (siehe Base
Definitionen Band von POSIX.1‐2008, Kapitel 5, Reichen Sie das Format Bewertung). Die Ausgabe soll sein
hergestellt wie beim ersten angegeben Ausdruck Argument als String Format und
Folge Ausdruck Argumente als Strings Arg1 zu Arg, inklusive, mit Folgendem
Ausnahmen:
1. Das Format soll eine tatsächliche Zeichenfolge und keine grafische Darstellung sein.
Daher darf es keine leeren Zeichenpositionen enthalten. Der im Format
string, in jedem anderen Kontext als a Flagge einer Konvertierungsvorgabe sein
wird wie ein gewöhnliches Zeichen behandelt, das in die Ausgabe kopiert wird.
2. Wenn der Zeichensatz a enthält '' Zeichen und dieses Zeichen erscheint in der Format
Wenn Sie eine Zeichenfolge eingeben, wird sie wie ein gewöhnliches Zeichen behandelt, das in die Ausgabe kopiert wird.
3. Das Flucht Sequenzen beginnend mit a Charakter soll behandelt werden als
Folgen gewöhnlicher Zeichen, die in die Ausgabe kopiert werden. Beachten Sie, dass diese gleich sind
Sequenzen sollen lexikalisch interpretiert werden awk wenn sie in Literalzeichenfolgen erscheinen,
aber sie sollen nicht besonders behandelt werden printf Aussage.
4. Die Feld Breite or Präzision kann als angegeben werden '*' Zeichen anstelle einer Ziffer
Zeichenfolge. In diesem Fall soll das nächste Argument aus der Ausdrucksliste abgerufen werden und
sein numerischer Wert wird als Feldbreite oder -genauigkeit angenommen.
5. Die Implementierung darf der Ausgabe des nicht vorausgehen oder folgen d or u Umwandlung
Bezeichnerzeichen mit Zeichen, die nicht von der angegeben sind Format String.
6. Die Implementierung darf der Ausgabe aus dem nicht vorausgehen o Konvertierungsspezifizierzeichen
mit führenden Nullen, die nicht von der angegeben werden Format String.
7. Für die c Konvertierungsspezifiziererzeichen: Wenn das Argument einen numerischen Wert hat, wird der
Das Zeichen, dessen Kodierung dieser Wert ist, soll ausgegeben werden. Ob der Wert Null ist oder nicht
Bei der Kodierung eines beliebigen Zeichens im Zeichensatz ist das Verhalten undefiniert. Wenn die
Wenn das Argument keinen numerischen Wert hat, muss das erste Zeichen des Zeichenfolgenwerts verwendet werden
ausgegeben werden; Wenn die Zeichenfolge keine Zeichen enthält, ist das Verhalten undefiniert.
8. Für jede Konvertierungsspezifikation, die ein Argument verbraucht, der nächste Ausdruck
Argument soll ausgewertet werden. Mit Ausnahme der c Konvertierungsspezifizierer
Zeichen muss der Wert konvertiert werden (gemäß den Regeln in
Ausdrücke in awk) in den entsprechenden Typ für die Konvertierungsspezifikation.
9. Wenn nicht genügend Ausdrucksargumente vorhanden sind, um alle Konvertierungen zu erfüllen
Spezifikationen in der Format string, das Verhalten ist undefiniert.
10. Wenn eine Zeichenfolge in der Format Zeichenfolge beginnt mit a '%' Charakter, tut es aber
keine gültige Konvertierungsspezifikation bilden, ist das Verhalten nicht spezifiziert.
Beide drucken und printf kann mindestens {LINE_MAX} Bytes ausgeben.
Funktionen
Die awk Die Sprache verfügt über eine Vielzahl integrierter Funktionen: Arithmetik, Zeichenfolge, Eingabe/Ausgabe,
und allgemein.
Arithmetik Funktionen
Die arithmetischen Funktionen, außer int, muss auf der ISO-C-Norm basieren (siehe
Abschnitt 1.1.2, Konzepte Abgeleitet von die ISO C Standard). Das Verhalten ist in nicht definiert
Fälle, in denen der ISO-C-Standard angibt, dass ein Fehler zurückgegeben wird oder dass das Verhalten korrekt ist
nicht definiert. Obwohl die Grammatik (siehe Grammatik) ermöglicht das Erscheinen integrierter Funktionen mit Nr
Argumente oder Klammern, es sei denn, das Argument oder die Klammern sind in als optional angegeben
der folgenden Liste (indem Sie sie innerhalb der anzeigen). "[]" Klammern), eine solche Verwendung ist undefiniert.
atan2(y,x)
Arkustangens von zurückgeben y/x im Bogenmaß im Bereich [−π,π].
cos(x) Rückgabekosinus von x, Wobei x ist im Bogenmaß.
Sünde(x) Rückgabesinus von x, Wobei x ist im Bogenmaß.
exp(x) Gibt die Exponentialfunktion von zurück x.
Log(x) Geben Sie den natürlichen Logarithmus von zurück x.
sqrt(x) Geben Sie die Quadratwurzel von zurück x.
int(x) Gibt das auf eine Ganzzahl gekürzte Argument zurück. Die Kürzung erfolgt in Richtung 0, wenn
x> 0.
and() Gibt eine Zufallszahl zurück n, so dass 0≤n
Sand([ausdr])
Legen Sie den Startwert für fest and zu ausdr oder nutzen Sie die Tageszeit, wenn ausdr wurde weggelassen.
Der vorherige Startwert wird zurückgegeben.
Schnur Funktionen
Die Zeichenfolgenfunktionen in der folgenden Liste werden unterstützt. Obwohl die Grammatik (siehe
Grammatik) ermöglicht die Anzeige integrierter Funktionen ohne Argumente oder Klammern, es sei denn, die
Argumente oder Klammern werden in der folgenden Liste als optional gekennzeichnet (durch Anzeige).
sie innerhalb der "[]" Klammern), eine solche Verwendung ist undefiniert.
gsub(ehe, erwidern[, in])
Benehmen wie unten (siehe unten), mit der Ausnahme, dass es alle Vorkommen von ersetzen soll
regulärer Ausdruck (wie der ed Utility Global Replacement) in $0 oder in der in
Argument, wenn angegeben.
Index(s, t)
Gibt die Position in Zeichen, beginnend mit der Nummerierung 1, in einer Zeichenfolge zurück s wo Zeichenfolge t
zuerst auftritt, oder Null, wenn es überhaupt nicht auftritt.
Länge[([s])]
Gibt die Länge seines Arguments als Zeichenfolge oder des Arguments in Zeichen zurück
gesamter Datensatz, $0, wenn kein Argument vorhanden ist.
Spiel(s, ehe)
Gibt die Position in Zeichen, beginnend mit der Nummerierung 1, in einer Zeichenfolge zurück s wo die
erweiterter regulärer Ausdruck ehe auftritt, oder Null, wenn es überhaupt nicht auftritt.
RSTART muss auf die Startposition gesetzt werden (die mit der zurückgegebenen Position identisch ist).
Wert), Null, wenn keine Übereinstimmung gefunden wird; RLENGTH wird auf die Länge des eingestellt
übereinstimmende Zeichenfolge, −1, wenn keine Übereinstimmung gefunden wird.
gespalten(s, a[, fs ])
Teilen Sie die Zeichenfolge s in Array-Elemente a[1] a[2], ..., a[n], und zurück n. Alle
Elemente des Arrays müssen gelöscht werden, bevor die Aufteilung durchgeführt wird. Der
Die Trennung erfolgt mit der ERE fs oder mit dem Feldtrenner FS if fs is
nicht angegeben. Jedes Array-Element muss beim Erstellen einen Zeichenfolgenwert haben und ggf
Gegebenenfalls muss das Array-Element als numerische Zeichenfolge betrachtet werden (siehe
Ausdrücke in awk). Die Auswirkung einer Nullzeichenfolge als Wert von fs is
nicht spezifiziert.
sprintf(fmt, ausdr, ausdr, ...)
Formatieren Sie die Ausdrücke entsprechend printf Format gegeben durch fmt und zurück
die resultierende Zeichenfolge.
unter (ehe, erwidern[, in ])
Ersetzen Sie die Zeichenfolge erwidern anstelle der ersten Instanz der erweiterten
regulärer Ausdruck EHE in Zeichenfolge in und geben Sie die Anzahl der Ersetzungen zurück. Ein
('&'), die in der Zeichenfolge erscheint erwidern wird durch die Zeichenfolge ersetzt
von in das entspricht dem ERE. Ein vorangestellt mit a soll
als wörtlich interpretiert werden Charakter. Ein Vorkommnis von zwei
aufeinanderfolgenden Zeichen sollen nur als ein einzelnes Literal interpretiert werden
Charakter. Jedes andere Vorkommen von a (Zum Beispiel,
vor einem anderen Zeichen) werden als Literal behandelt
Charakter. Beachten Sie, dass wenn erwidern ist ein String-Literal (das lexikalische Token). STRING; sehen
Grammatik), die Handhabung der Das Zeichen steht nach jedem Lexikon
Verarbeitung, einschließlich aller lexikalischen -Escape-Sequenzverarbeitung. Wenn in
angegeben ist und kein L-Wert ist (siehe Ausdrücke in awk), das Verhalten ist
nicht definiert. Wenn in wurde weggelassen, awk soll stattdessen den aktuellen Datensatz ($0) verwenden.
substr(s, m[, n ])
Geben Sie höchstens das zurück n-Zeichen-Teilzeichenfolge von s das beginnt bei position m,
Nummerierung ab 1. Wenn n weggelassen wird, oder if n gibt mehr Zeichen an als vorhanden sind
In der Zeichenfolge verbleibt die Länge der Teilzeichenfolge durch die Länge begrenzt
der Zeichenfolge s.
tolower(s)
Gibt eine Zeichenfolge basierend auf der Zeichenfolge zurück s. Jeder Charakter in s das ist ein Großbuchstabe
Buchstabe angegeben, um a zu haben tolower Kartierung durch die LC_CTYPE Kategorie der
Das aktuelle Gebietsschema wird in der zurückgegebenen Zeichenfolge durch den Kleinbuchstaben ersetzt
durch das Mapping vorgegeben. Andere Charaktere in s bleibt unverändert
zurückgegebene Zeichenfolge.
TOUPPER(s)
Gibt eine Zeichenfolge basierend auf der Zeichenfolge zurück s. Jeder Charakter in s das ist ein Kleinbuchstabe
Buchstabe angegeben, um a zu haben TOUPPER Kartierung durch die LC_CTYPE Kategorie der
Das aktuelle Gebietsschema wird in der zurückgegebenen Zeichenfolge durch den Großbuchstaben ersetzt
durch das Mapping vorgegeben. Andere Charaktere in s bleiben in der Rückgabe unverändert
String.
Alle oben genannten Funktionen übernehmen EHE Als Parameter erwarten Sie ein Muster oder einen String
Bewerteter Ausdruck, der ein regulärer Ausdruck ist, wie in definiert Normale Ausdrücke.
Input / Output und Allgemein Funktionen
Die Ein-/Ausgabe- und allgemeinen Funktionen sind:
schließen(Ausdruck)
Schließen Sie die von a geöffnete Datei oder Pipe drucken or printf Erklärung oder ein Anruf an
Getline mit demselben Zeichenfolgenwert Ausdruck. Die Begrenzung der Anzahl der offenen
Ausdruck arguments ist durch die Implementierung definiert. Wenn der Abschluss erfolgreich war, wird der
Funktion soll Null zurückgeben; andernfalls wird ein Wert ungleich Null zurückgegeben.
Ausdruck | Getline [jung]
Lesen Sie einen Eingabedatensatz aus einem Stream, der von der Ausgabe eines Befehls weitergeleitet wird. Der
Stream soll erstellt werden, wenn derzeit kein Stream mit dem Wert geöffnet ist
Ausdruck als Befehlsname. Der erstellte Stream muss einem entsprechen
erstellt durch einen Aufruf an die Popen()-Funktion mit dem Wert von Ausdruck wie die
Befehl Argument und ein Wert von r wie die Modus Streit. Solange der Stream
bleibt offen, nachfolgende Anrufe in denen Ausdruck ergibt die gleiche Zeichenfolge
value soll nachfolgende Datensätze aus dem Stream lesen. Der Stream soll bleiben
geöffnet bis zum schließen Die Funktion wird mit einem Ausdruck aufgerufen, der Folgendes ergibt
Gleicher Stringwert. Zu diesem Zeitpunkt wird der Stream wie durch einen Aufruf von geschlossen
die pschließen()-Funktion. Wenn jung wird weggelassen, $0 und NF soll gesetzt werden; ansonsten, jung
festgelegt werden und gegebenenfalls als numerische Zeichenfolge betrachtet werden (siehe
Ausdrücke in awk).
Die Getline Der Operator kann mehrdeutige Konstrukte bilden, wenn dies der Fall ist
Operatoren ohne Klammern (einschließlich Verkettung) links davon '|' (zum
Anfang des enthaltenden Ausdrucks Getline). Im Rahmen der '$'
Operator, '|' soll sich so verhalten, als hätte es eine niedrigere Priorität als '$'. Das Ergebnis
Die Möglichkeit, andere Betreiber zu bewerten, ist nicht spezifiziert, und konforme Anwendungen werden dies tun
Setzen Sie alle derartigen Verwendungen ordnungsgemäß in Klammern.
Getline Setzen Sie $0 auf den nächsten Eingabedatensatz aus der aktuellen Eingabedatei. Diese Form von
Getline soll das einstellen NF, NR und FNR Variablen.
Getline jung
Variable setzen jung zum nächsten Eingabedatensatz aus der aktuellen Eingabedatei und, falls
angemessen, jung gilt als numerische Zeichenfolge (siehe Ausdrücke in awk).
Diese Form der Getline soll das einstellen FNR und NR Variablen.
Getline [jung] < Ausdruck
Liest den nächsten Eingabedatensatz aus einer benannten Datei. Der Ausdruck sind
ausgewertet, um eine Zeichenfolge zu erzeugen, die als Pfadname verwendet wird. Wenn die Datei davon
Name ist derzeit nicht geöffnet, er soll geöffnet werden. Solange der Stream bestehen bleibt
offene, nachfolgende Anrufe in denen Ausdruck ergibt den gleichen Stringwert
liest nachfolgende Datensätze aus der Datei. Die Datei bleibt geöffnet bis
die schließen Die Funktion wird mit einem Ausdruck aufgerufen, der dasselbe ergibt
Zeichenfolgenwert. Wenn jung wird weggelassen, $0 und NF soll gesetzt werden; ansonsten, jung sind
festgelegt und gilt gegebenenfalls als numerische Zeichenfolge (siehe
Ausdrücke in awk).
Die Getline Der Operator kann mehrdeutige Konstrukte bilden, wenn dies der Fall ist
binäre Operatoren ohne Klammern (einschließlich Verkettung) rechts davon '<'
(bis zum Ende des Ausdrucks, der die enthält Getline). Das Ergebnis von
Die Bewertung eines solchen Konstrukts ist nicht spezifiziert, und konforme Anwendungen müssen dies tun
Setzen Sie alle derartigen Verwendungen ordnungsgemäß in Klammern.
fragst(Ausdruck)
Führen Sie den von gegebenen Befehl aus Ausdruck in einer Weise, die der entspricht fragst()
Funktion, die im System Interfaces-Band von POSIX.1-2008 definiert ist, und geben Sie die zurück
Exit-Status des Befehls.
Alle Formen von Getline soll 1 für erfolgreiche Eingabe, Null für Dateiende und −1 für zurückgeben
ein Fehler.
Wenn Zeichenfolgen als Name einer Datei oder Pipeline verwendet werden, muss die Anwendung dies sicherstellen
dass die Zeichenfolgen inhaltlich identisch sind. Die Terminologie „gleicher Zeichenfolgenwert“ impliziert
dass „äquivalente Zeichenfolgen“, auch solche, die sich nur durch unterscheiden Zeichen, repräsentieren
verschiedene Dateien.
Benutzerdefinierte Funktionen
Die awk Die Sprache bietet auch benutzerdefinierte Funktionen. Solche Funktionen können wie folgt definiert werden:
Funktion Name([Parameter...]) { Aussagen }
Auf eine Funktion kann überall in einer verwiesen werden awk Programm; insbesondere kann seine Verwendung
gehen seiner Definition voraus. Der Umfang einer Funktion ist global.
Funktionsparameter können, sofern vorhanden, entweder Skalare oder Arrays sein; das Verhalten ist
undefiniert, wenn ein Array-Name als Parameter übergeben wird, den die Funktion als Skalar verwendet, oder
wenn ein Skalarausdruck als Parameter übergeben wird, den die Funktion als Array verwendet.
Funktionsparameter werden als Wert übergeben, wenn sie skalar sind, und als Referenz, wenn sie Array-Namen sind.
Die Anzahl der Parameter in der Funktionsdefinition muss nicht mit der Anzahl von übereinstimmen
Parameter im Funktionsaufruf. Überschüssige formale Parameter können als lokale Variablen verwendet werden.
Wenn in einem Funktionsaufruf weniger Argumente angegeben werden als in der Funktionsdefinition,
Die zusätzlichen Parameter, die im Funktionskörper als Skalare verwendet werden, sollen als ausgewertet werden
nicht initialisierte Werte, bis sie anderweitig initialisiert werden, und die zusätzlichen Parameter, die
werden im Funktionskörper verwendet, da Arrays als nicht initialisierte Arrays behandelt werden sollen
Jedes Element ergibt den nicht initialisierten Wert, bis es anderweitig initialisiert wird.
Beim Aufruf einer Funktion darf zwischen dem Funktionsnamen und dem kein Leerzeichen stehen
öffnende Klammer. Funktionsaufrufe können verschachtelt und rekursiv aufgerufen werden
Funktionen. Bei der Rückkehr von einem verschachtelten oder rekursiven Funktionsaufruf werden die Werte aller angezeigt
Die Parameter der aufrufenden Funktion bleiben unverändert, mit Ausnahme der übergebenen Array-Parameter
durch Verweis. Der Rückkehr Die Anweisung kann verwendet werden, um einen Wert zurückzugeben. Wenn ein Rückkehr Aussage
Wenn es außerhalb einer Funktionsdefinition erscheint, ist das Verhalten undefiniert.
In der Funktionsdefinition Zeichen müssen vor der Eröffnung optional sein
Klammer und nach der schließenden Klammer. Funktionsdefinitionen können überall im Programm erscheinen
wo ein Muster-Aktion Paar ist erlaubt.
Grammatik
Die Grammatik in diesem Abschnitt und die lexikalischen Konventionen im folgenden Abschnitt gelten
beschreiben zusammen die Syntax für awk Programme. Die allgemeinen Konventionen für diesen Stil von
Grammatik sind in beschrieben Abschnitt 1.3, Grammatik Conventions. Ein gültiges Programm kann sein
dargestellt als nichtterminales Symbol Programm in der Grammatik. Diese formale Syntax soll
haben Vorrang vor der vorangehenden Beschreibung der Textsyntax.
%Zeichen NAME/FUNKTION NUMBER STRING EHE
%Zeichen FUNC_NAME /* Name gefolgt by '(' ohne Weiß Raum. */
/* Schlüsselwörter */
%token Anfang Ende
/* 'BEGIN' 'END' */
%token Pause Weiter Löschen Anderes tun
/* 'break' 'continue' 'delete' 'do' 'else' */
%token Exit für Funktion, falls vorhanden
/* 'exit' 'for' 'function' 'if' 'in' */
%token Next Print Printf Return While
/* 'next' 'print' 'printf' 'return' 'while' */
/* Reservierte Funktionsnamen */
%token BUILTIN_FUNC_NAME
/* Ein Token für Folgendes:
* atan2 cos sin exp log sqrt int rand srand
* gsub-Indexlängenübereinstimmung mit geteiltem Sprintf-Sub
* Substr tolower toupper close system
*/
%token GETLINE
/* Syntaktisch anders als andere integrierte Funktionen. */
/* Zweistellige Token. */
%token ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN POW_ASSIGN
/* '+=' '−=' '*=' '/=' '%=' '^=' */
%token OR AND NO_MATCH EQ LE GE NE INCR DECR APPEND
/* '||' '&&' '!~' '==' '<=' '>=' '!=' '++' '−−' '>>' */
/* Ein-Zeichen-Token. */
%Zeichen '{' '}' '(' ')' '[' ']' ',' ';' NEUE ZEILE
%token '+' '−' '*' '%' '^' '!' '>' '<' '|' '?' ':' ' " " ' '$' '='
%start-Programm
%%
Programm: item_list
| actionless_item_list
;
item_list: newline_opt
| actionless_item_list Elementterminator
| item_list Elementabschlusszeichen
| item_list-Aktionsterminator
;
actionless_item_list: Abschlusszeichen für item_list-Muster
| actionless_item_list-Musterterminator
;
Artikel: Musteraktion
| Funktionsname '(' param_list_opt ')'
newline_opt-Aktion
| Funktion FUNC_NAME '(' param_list_opt ')'
newline_opt-Aktion
;
param_list_opt : /* leer */
| param_list
;
param_list: NAME
| param_list '',' NAME
;
Muster: Beginnen
| Ende
| Ausdruck
| Ausdruck ',' newline_opt Ausdruck
;
Aktion: '{' newline_opt '}'
| '{' newline_opttermined_statement_list '}'
| '{' newline_opt unterterminated_statement_list '}'
;
Terminator: Terminator ';'
| Terminator NEWLINE
| ';'
| NEUE ZEILE
;
beendete_aussage_liste: beendete_aussage
| beendete_Anweisung_Liste beendete_Anweisung
;
unterterminated_statement_list : unterterminated_statement
| beendete_Anweisung_Liste unterterminierte_Anweisung
;
beendete_Anweisung: Aktion newline_opt
| If '(' expr ')' newline_opttermined_statement
| If '(' expr ')' newline_opttermined_statement
Sonst newline_opt beendete_Anweisung
| While '(' expr ')' newline_opttermined_statement
| Für '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
beendete_Anweisung
| Für '(' NAME In NAME ')' newline_opt
beendete_Anweisung
| ';' newline_opt
| terminable_statement NEWLINE newline_opt
| terminable_statement ';' newline_opt
;
unterterminated_statement: terminierbare_Anweisung
| If '(' expr ')' newline_opt unterterminated_statement
| If '(' expr ')' newline_opttermined_statement
Sonst newline_opt unterterminated_statement
| While '(' expr ')' newline_opt unterminated_statement
| Für '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
unterterminated_statement
| Für '(' NAME In NAME ')' newline_opt
unterterminated_statement
;
terminable_statement: simple_statement
| Brechen
| Weitermachen
| Nächster
| Beenden Sie expr_opt
| Rückgabe expr_opt
| Führen Sie newline_opttermined_statement While '(' expr ')' aus.
;
simple_statement_opt : /* leer */
| simple_statement
;
simple_statement: NAME '[' expr_list ']' löschen
| Ausdruck
| print_statement
;
print_statement: simple_print_statement
| simple_print_statement Ausgabeumleitung
;
simple_print_statement: print_expr_list_opt drucken
| Drucken '('multiple_expr_list')'
| Printf print_expr_list
| Printf '('multiple_expr_list')'
;
Ausgabeumleitung: '>' expr
| APPEND-Ausdruck
| '|' Ausdruck
;
expr_list_opt : /* leer */
| expr_list
;
Ausdrucksliste: Ausdruck
| multiple_expr_list
;
multiple_expr_list : expr ',' newline_opt expr
| multiple_expr_list ',' newline_opt expr
;
expr_opt : /* leer */
| Ausdruck
;
Ausdruck: unärer_Ausdruck
| non_unary_expr
;
unary_expr: '+' Ausdruck
| '−' Ausdruck
| unary_expr '^' expr
| unary_expr '*' expr
| unary_expr '/' expr
| unary_expr '%' expr
| unary_expr '+' expr
| unary_expr '−' expr
| unary_expr non_unary_expr
| unary_expr '<' expr
| unary_expr LE-Ausdruck
| unary_expr NE-Ausdruck
| unary_expr EQ-Ausdruck
| unary_expr '>' expr
| unary_expr GE expr
| unary_expr '~' expr
| unary_expr NO_MATCH expr
| unary_expr In NAME
| unary_expr UND newline_opt expr
| unary_expr ODER newline_opt expr
| unary_expr '?' Ausdruck ':' Ausdruck
| unary_input_function
;
non_unary_expr : '(' expr ')'
| '!' Ausdruck
| non_unary_expr '^' expr
| non_unary_expr '*' expr
| non_unary_expr '/' expr
| non_unary_expr '%' expr
| non_unary_expr '+' expr
| non_unary_expr '−' expr
| non_unary_expr non_unary_expr
| non_unary_expr '<' expr
| non_unary_expr LE-Ausdruck
| non_unary_expr NE-Ausdruck
| non_unary_expr EQ-Ausdruck
| non_unary_expr '>' expr
| non_unary_expr GE-Ausdruck
| non_unary_expr '~' expr
| non_unary_expr NO_MATCH expr
| non_unary_expr In NAME
| '('multiple_expr_list ')' In NAME
| non_unary_expr UND newline_opt expr
| non_unary_expr ODER newline_opt expr
| non_unary_expr '?' Ausdruck ':' Ausdruck
| NUMMER
| STRING
| lWert
| EHE
| lWert INCR
| lWert DECR
| INCR-Wert
| DECR-Wert
| lvalue POW_ASSIGN expr
| lvalue MOD_ASSIGN expr
| lWert MUL_ASSIGN Ausdruck
| lvalue DIV_ASSIGN expr
| lvalue ADD_ASSIGN expr
| lvalue SUB_ASSIGN expr
| lvalue '=' expr
| FUNC_NAME '(' expr_list_opt ')'
/* Vor '(' ist kein Leerzeichen erlaubt */
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
| non_unary_input_function
;
print_expr_list_opt : /* leer */
| print_expr_list
;
print_expr_list : print_expr
| print_expr_list ',' newline_opt print_expr
;
print_expr : unary_print_expr
| non_unary_print_expr
;
unary_print_expr: '+' print_expr
| '−' print_expr
| unary_print_expr '^' print_expr
| unary_print_expr '*' print_expr
| unary_print_expr '/' print_expr
| unary_print_expr '%' print_expr
| unary_print_expr '+' print_expr
| unary_print_expr '−' print_expr
| unary_print_expr non_unary_print_expr
| unary_print_expr '~' print_expr
| unary_print_expr NO_MATCH print_expr
| unary_print_expr In NAME
| unary_print_expr UND newline_opt print_expr
| unary_print_expr ODER newline_opt print_expr
| unary_print_expr '?' print_expr ':' print_expr
;
non_unary_print_expr : '(' expr ')'
| '!' print_expr
| non_unary_print_expr '^' print_expr
| non_unary_print_expr '*' print_expr
| non_unary_print_expr '/' print_expr
| non_unary_print_expr '%' print_expr
| non_unary_print_expr '+' print_expr
| non_unary_print_expr '−' print_expr
| non_unary_print_expr non_unary_print_expr
| non_unary_print_expr '~' print_expr
| non_unary_print_expr NO_MATCH print_expr
| non_unary_print_expr In NAME
| '('multiple_expr_list ')' In NAME
| non_unary_print_expr UND newline_opt print_expr
| non_unary_print_expr ODER newline_opt print_expr
| non_unary_print_expr '?' print_expr ':' print_expr
| NUMMER
| STRING
| lWert
| EHE
| lWert INCR
| lWert DECR
| INCR-Wert
| DECR-Wert
| lvalue POW_ASSIGN print_expr
| lvalue MOD_ASSIGN print_expr
| lvalue MUL_ASSIGN print_expr
| lvalue DIV_ASSIGN print_expr
| lvalue ADD_ASSIGN print_expr
| lvalue SUB_ASSIGN print_expr
| lvalue '=' print_expr
| FUNC_NAME '(' expr_list_opt ')'
/* Vor '(' ist kein Leerzeichen erlaubt */
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
;
lWert: NAME
| NAME '[' expr_list ']'
| '$' Ausdruck
;
non_unary_input_function: simple_get
| simple_get '<' expr
| non_unary_expr '|' simple_get
;
unary_input_function : unary_expr '|' simple_get
;
simple_get: GETLINE
| GETLINE lvalue
;
newline_opt : /* leer */
| newline_opt NEWLINE
;
Diese Grammatik weist mehrere Unklarheiten auf, die wie folgt gelöst werden sollen:
* Operatorpriorität und Assoziativität müssen wie in beschrieben sein Tisch 4-1, Ausdrücke
in Abnehmend Vorrang in awk.
* Im Falle von Unklarheiten, an sonst muss mit dem unmittelbar vorhergehenden verknüpft werden
if das würde der Grammatik genügen.
* In manchen Zusammenhängen a ('/'), das verwendet wird, um ein ERE zu umgeben, könnte auch das sein
Divisionsbetreiber. Dies ist so zu lösen, dass überall dort, wo die Teilung erfolgt
Operator könnte erscheinen, a wird als Divisionsoperator angenommen. (Es gibt kein
unärer Divisionsoperator.)
Jeder Ausdruck in einem awk Das Programm muss den Prioritäts- und Assoziativitätsregeln entsprechen.
auch wenn dies nicht zur Lösung einer Unklarheit erforderlich ist. Zum Beispiel, weil '$' hat höher
Vorrang als '++', die Saite „$x++−−“ ist nicht gültig awk Ausdruck, obwohl es so ist
eindeutig von der Grammatik analysiert als „$(x++)−−“.
Eine Konvention, die aus der formalen Grammatik möglicherweise nicht ersichtlich ist, ist das Wo
Zeichen sind akzeptabel. Es gibt mehrere offensichtliche Platzierungen, wie z. B. die Beendigung von a
Aussage und a kann zur Flucht genutzt werden Zeichen zwischen beliebigen
lexikalische Token. Zusätzlich, Zeichen ohne Charaktere können
Es folgen ein Komma, eine offene Klammer, ein logischer UND-Operator („&&“), logischer ODER-Operator ("||"),
die do Stichwort, die sonst Schlüsselwort und die schließende Klammer von an if, für oder während
Aussage. Beispielsweise:
{ drucken $ 1,
$2 }
Lexikalisch Conventions
Die lexikalischen Konventionen für awk Programme, in Bezug auf die vorangehende Grammatik, müssen sein
wie folgt:
1. Sofern nicht anders angegeben, awk soll den längstmöglichen Token- bzw. Begrenzeranfang erkennen
an einem bestimmten Punkt.
2. Ein Kommentar muss aus allen Zeichen bestehen, die mit dem beginnen Charakter
und beendet durch, jedoch mit Ausnahme des nächsten Auftretens von a . Kommentare sollen
haben keine Wirkung, außer um lexikalische Token abzugrenzen.
3. Die wird als Token anerkannt NEUE ZEILE.
4. A Zeichen unmittelbar gefolgt von a soll keine Wirkung haben.
5. Der Token STRING soll eine Stringkonstante darstellen. Eine String-Konstante soll mit beginnen
der Charakter '"'. Innerhalb einer String-Konstante a Charakter soll sein
gilt als Beginn einer Escape-Sequenz, wie in der Tabelle in der Basis angegeben
Definitionen Band von POSIX.1‐2008, Kapitel 5, Reichen Sie das Format Bewertung ('\\', '\ein', '\B',
'\F', '\n', '\R', '\t', '\v'). Darüber hinaus sind die Escape-Sequenzen in Tisch 4-2, Flucht
Sequenzen in awk werden anerkannt. A darf nicht innerhalb einer Zeichenfolge vorkommen
Konstante. Eine String-Konstante muss durch das erste nicht maskierte Vorkommen von beendet werden
der Charakter '"' nach der Konstante, mit der die Zeichenfolge beginnt. Der Wert der
string muss die Folge aller nicht maskierten Zeichen und Escape-Werte sein
Sequenzen zwischen den beiden Begrenzungen, diese jedoch nicht einschließend '"' Zeichen.
6. Der Token EHE stellt eine erweiterte reguläre Ausdruckskonstante dar. Eine ERE-Konstante
soll mit dem beginnen Charakter. Innerhalb einer ERE-Konstante a
Das Zeichen gilt als Beginn einer Escape-Sequenz, wie in der Tabelle in angegeben
der Basisdefinitionsband von POSIX.1‐2008, Kapitel 5, Reichen Sie das Format Bewertung. in
Darüber hinaus sind die Escape-Sequenzen in Tisch 4-2, Flucht Sequenzen in awk sind
anerkannt. Der Antrag muss sicherstellen, dass a kommt innerhalb einer ERE nicht vor
Konstante. Eine ERE-Konstante muss durch das erste nicht maskierte Vorkommen von beendet werden
Zeichen nach dem Zeichen, mit dem die ERE-Konstante beginnt. Der erweiterte Stammspieler
Der durch die ERE-Konstante dargestellte Ausdruck soll die Folge aller nicht maskierten sein
Zeichen und Werte von Escape-Sequenzen zwischen den beiden, diese jedoch nicht einschließend
abgrenzen Figuren.
7. A hat keine Wirkung, außer zur Abgrenzung lexikalischer Token oder innerhalb STRING or
EHE Token.
8. Der Token NUMBER soll eine numerische Konstante darstellen. Seine Form und sein numerischer Wert sollen
entweder gleichwertig sein mit dem dezimal-gleitende-Konstante Token gemäß ISO C
Standard, oder es muss eine Folge von Dezimalziffern sein und als eine ausgewertet werden
Ganzzahlkonstante im Dezimalformat. Darüber hinaus können Implementierungen numerische Konstanten akzeptieren
mit der Form und dem numerischen Wert, die dem entsprechen Hexadezimal-Konstante und
Hexadezimal-Floating-Konstante Token gemäß der ISO-C-Norm.
Wenn der Wert zu groß oder zu klein ist, um darstellbar zu sein (siehe Abschnitt 1.1.2,
Konzepte Abgeleitet von die ISO C Standard), ist das Verhalten undefiniert.
9. Eine Folge von Unterstrichen, Ziffern und Buchstaben aus dem portablen Zeichensatz
(siehe den Band „Base Definitions“ von POSIX.1‐2008, Abschnitt 6.1, Handy Charakter
Stelle den ), beginnend mit an oder alphabetisches Zeichen, gelten als a
Wort.
10. Die folgenden Wörter sind Schlüsselwörter, die als einzelne Token erkannt werden sollen; Die
Der Name des Tokens ist derselbe wie das Schlüsselwort:
START löschen ENDE Funktion in printf
brechen do wunsch Getline weiter Rückkehr
fortsetzen sonst für if drucken während
11. Die folgenden Wörter sind Namen integrierter Funktionen und werden als erkannt
Zeichen BUILTIN_FUNC_NAME:
atan2 gsub Log gespalten unten TOUPPER
schließen Index Spiel sprintf substr
cos int and sqrt fragst
exp Länge Sünde Sand tolower
Die oben aufgeführten Schlüsselwörter und Namen integrierter Funktionen gelten als reserviert
Worte.
12. Der Token NAME/FUNKTION muss aus einem Wort bestehen, das kein Schlüsselwort oder Name eines eingebauten Elements ist
Funktion und es folgt nicht unmittelbar (ohne Trennzeichen) die '('
Charakter.
13. Der Token FUNC_NAME soll aus einem Wort bestehen, das kein Schlüsselwort oder Name von a ist
integrierte Funktion, direkt gefolgt (ohne Trennzeichen) von '(' Charakter.
Die '(' Das Zeichen darf nicht Teil des Tokens sein.
14. Die folgenden zweistelligen Sequenzen werden als benannte Token erkannt:
┌───────────┬──────────┬────────────┬─── ───────┐
│Token Name │ Reihenfolge │ Token Name │ Reihenfolge │
├───────────┼──────────┼────────────┼─── ───────┤
│ADD_ASSIGN │ += │ KEINE ÜBEREINSTIMMUNG │ !~ │
│SUB_ASSIGN │ −= │ EQ │ == │
│MUL_ASSIGN │ *= │ LE │ <= │
│DIV_ASSIGN │ /= │ GE │ >= │
│MOD_ASSIGN │ %= │ NE │ != │
│POW_ASSIGN │ ^= │ ERHÖHUNG │ ++ │
│OR │ || │ DEKR │ −− │
│UND │ && │ ANHANG │ >> │
└───────────┴──────────┴────────────┴─── ───────┘
15. Die folgenden Einzelzeichen werden als Token erkannt, deren Namen die sind
Charakter:
{ } ( ) [ ] , ; + - * % ^ ! > < | ? : " " $ =
Es besteht eine lexikalische Mehrdeutigkeit zwischen dem Token EHE und die Token '/' und DIV_ASSIGN.
Wenn eine Eingabesequenz mit a beginnt Zeichen in jedem syntaktischen Kontext, in dem das
Zeichen '/' or DIV_ASSIGN könnte als nächstes Token in einem gültigen Programm erscheinen, je länger
die beiden erkennbaren Token sollen anerkannt werden. In jeder anderen Syntaktik
Kontext, in dem sich das Token befindet EHE könnte als nächstes Token in einem gültigen Programm erscheinen, das Token
EHE anerkannt werden.
EXIT STATUS
Die folgenden Exit-Werte sollen zurückgegeben werden:
0 Alle Eingabedateien wurden erfolgreich verarbeitet.
>0 Es ist ein Fehler aufgetreten.
Der Exit-Status kann innerhalb des Programms mit einem geändert werden wunsch Ausdruck.
FOLGEN OF FEHLER
Wenn überhaupt Datei Der Operand ist angegeben und auf die genannte Datei kann nicht zugegriffen werden. awk soll a schreiben
Diagnosemeldung auf Standardfehler zurücksetzen und ohne weitere Aktion beenden.
Wenn das von entweder dem angegebenen Programm Programm Operand oder a Programmdatei Operand ist kein
gültig awk Programm (wie im Abschnitt ERWEITERTE BESCHREIBUNG angegeben) ist das Verhalten
undefiniert
Die Folgende Abschnitte sind informativ.
ANWENDUNGEN ANWENDUNG
Die Index, Länge, Spiel und substr Funktionen sollten nicht mit ähnlichen verwechselt werden
Funktionen im ISO-C-Standard; Die awk Versionen befassen sich mit Zeichen, während die ISO C
Standard befasst sich mit Bytes.
Weil die Verkettungsoperation durch benachbarte Ausdrücke und nicht durch einen dargestellt wird
Wenn es sich um einen expliziten Operator handelt, ist es oft notwendig, Klammern zu verwenden, um das Richtige zu erzwingen
Bewertungspriorität.
Beispiele:
Die awk Das in der Befehlszeile angegebene Programm lässt sich am einfachsten innerhalb eines Einzelprogramms angeben.
Anführungszeichen (zum Beispiel „Programm') für Anwendungen mit shDa awk Programme häufig
enthalten spezielle Zeichen für die Shell, einschließlich doppelter Anführungszeichen. In den Fällen
wo ein awk Da das Programm einfache Anführungszeichen enthält, ist dies normalerweise am einfachsten anzugeben
Der größte Teil des Programms besteht aus Zeichenfolgen in einfachen Anführungszeichen, die von der Shell mit Anführungszeichen verkettet werden
einfache Anführungszeichen. Zum Beispiel:
awk '/'\''/ { drucken "Zitat:", $0 }'
druckt alle Zeilen aus der Standardeingabe, die ein einfaches Anführungszeichen mit Präfix enthalten
mit Angebot!:.
Im Folgenden finden Sie Beispiele für einfache awk Programme:
1. Schreiben Sie alle Eingabezeilen, bei denen Feld 3 größer als 5 ist, in die Standardausgabe:
$3 > 5
2. Schreiben Sie jede zehnte Zeile:
(Nr % 10) == 0
3. Schreiben Sie eine beliebige Zeile mit einem Teilstring, der dem regulären Ausdruck entspricht:
/(G|D)(2[0−9][[:alpha:]]*)/
4. Drucken Sie eine beliebige Zeile mit einer Teilzeichenfolge, die a enthält 'G' or 'D', gefolgt von einer Folge von
Ziffern und Zeichen. In diesem Beispiel werden Zeichenklassen verwendet Ziffer und Alpha zu entsprechen
sprachunabhängige Ziffern bzw. Buchstaben:
/(G|D)([[:digit:][:alpha:]]*)/
5. Schreiben Sie eine beliebige Zeile, in der das zweite Feld mit dem regulären Ausdruck und dem vierten übereinstimmt
Feld nicht:
$2 " " /xyz/ && $4 ! " " /xyz/
6. Schreiben Sie eine beliebige Zeile, in der das zweite Feld ein enthält :
$2 " " /\\/
7. Schreiben Sie eine beliebige Zeile, in der das zweite Feld ein enthält . Beachten Sie, dass
-Fluchtzeichen werden zweimal interpretiert; einmal bei der lexikalischen Verarbeitung der Zeichenfolge
und einmal bei der Verarbeitung des regulären Ausdrucks:
$2 " " „\\\\“
8. Schreiben Sie das vorletzte und letzte Feld in jede Zeile. Trennen Sie die Felder durch a
:
{OFS=":";print $(NF−1), $NF}
9. Schreiben Sie die Zeilennummer und die Anzahl der Felder in jede Zeile. Die drei Saiten
stellt die Zeilennummer dar, die und die Anzahl der Felder werden verkettet
und diese Zeichenfolge wird in die Standardausgabe geschrieben:
{drucken NR „“ NF}
10. Schreiben Sie Zeilen mit mehr als 72 Zeichen:
Länge($0) > 72
11. Schreiben Sie die ersten beiden Felder in entgegengesetzter Reihenfolge getrennt durch OFS:
{ drucken $ 2, $1 }
12. Dasselbe, mit durch a getrennten Eingabefeldern oder Und Zeichen, bzw
beide:
START { FS = ",[ \t]*|[ \t]+" }
{ drucken $ 2, $1 }
13. Addieren Sie die erste Spalte, drucken Sie die Summe und den Durchschnitt aus:
{s += $1 }
ENDE {drucken "Summe is ", s, " durchschnittlich ist", s/NR}
14. Schreiben Sie Felder in umgekehrter Reihenfolge, eines pro Zeile (viele Zeilen raus für jede Zeile rein):
{ für (i = NF; i > 0; −−i) drucken $i }
15. Schreiben Sie alle Zeilen zwischen den Zeichenfolgen Anfang und halt:
/Start/, /halt/
16. Schreiben Sie alle Zeilen, deren erstes Feld sich vom vorherigen unterscheidet:
$1 != Vorherige { drucken; Vorherige = $1 }
17. Simulieren Echo:
START {
für (i = 1; i < ARGC; ++i)
printf("%s%s", ARGV[i], i==ARGC−1?"\n":" ")
}
18. Schreiben Sie die darin enthaltenen Pfadpräfixe PATH Umgebungsvariable, eine pro Zeile:
START {
n = gespalten (UMGEBUNG["PFAD"], Pfad, ::)
für (i = 1; i <= n; ++i)
drucken Pfad[i]
}
19. Wenn es eine Datei mit dem Namen gibt Varianten des Eingangssignals: Enthält Seitenköpfe des Formulars: Seitennummer
und eine Datei namens Programm das beinhaltet:
/Seite/ { $2 = n++; }
{ drucken }
dann die Kommandozeile:
awk -f Programm n = 5 Varianten des Eingangssignals:
druckt die Datei Varianten des Eingangssignals:, wobei die Seitenzahlen beginnend bei 5 eingetragen werden.
RATIONALE
Diese Beschreibung basiert auf dem Neuen awk, „nawk“, (siehe die referenzierte Die AWK
Programmierung SPRACHE), das eine Reihe neuer Funktionen in das Historische einführte awk:
1. Neue Schlüsselwörter: löschen, do, Funktion, Rückkehr
2. Neue integrierte Funktionen: atan2, schließen, cos, gsub, Spiel, and, Sünde, Sand, unten, fragst
3. Neue vordefinierte Variablen: FNR, Argc, ARGV, RSTART, LÄNGE, SUBSEP
4. Neue Ausdrucksoperatoren: ?, :, ,, ^
5. Das FS Variable und das dritte Argument zu gespalten, jetzt als erweitertes reguläres Spiel behandelt
Ausdrücke.
6. Die Operatorpriorität wurde geändert, um der C-Sprache besser zu entsprechen. Zwei Beispiele
Codes, die unterschiedlich funktionieren, sind:
während ( n /= 10 > 1) ...
if (!"Woche" ~ /bwk/) ...
Basierend auf neueren Implementierungen von wurden mehrere Funktionen hinzugefügt awk:
* Mehrere Instanzen von -f Programmdatei sind erlaubt.
* Die neue Option −v Zuordnung.
* Die neue vordefinierte Variable UMWELT.
* Neue integrierte Funktionen TOUPPER und tolower.
* Weitere Formatierungsfunktionen wurden hinzugefügt printf um dem ISO-C-Standard zu entsprechen.
Das Ganze awk Die Syntax basierte schon immer auf der C-Sprache, mit einigen Funktionen von
die Shell-Befehlssprache und andere Quellen. Aus diesem Grund ist es nicht vollständig
kompatibel mit jeder anderen Sprache, was bei einigen Benutzern für Verwirrung gesorgt hat. Es ist nicht
die Absicht der Standardentwickler, solche Probleme anzugehen. Einige relativ geringfügig
Es wurden Änderungen vorgenommen, um die Sprache besser mit dem ISO-C-Standard kompatibel zu machen. am meisten
Einige dieser Änderungen basieren, wie beschrieben, auf ähnlichen Änderungen in aktuellen Implementierungen
über. Es gibt noch mehrere C-Sprachkonventionen, die nicht enthalten sind awk. Einer der
Bemerkenswert ist die Operator, der üblicherweise zur Angabe mehrerer verwendet wird
Ausdrücke in der C-Sprache für Stellungnahme. Außerdem gibt es verschiedene Orte, an denen awk is
restriktiver als die C-Sprache hinsichtlich der Art des Ausdrucks, der verwendet werden kann
einen gegebenen Kontext. Diese Einschränkungen sind auf die unterschiedlichen Funktionen zurückzuführen awk Sprache
bietet.
Reguläre Ausdrücke in awk wurden von historischen Implementierungen etwas erweitert
Machen Sie sie zu einer reinen Obermenge erweiterter regulärer Ausdrücke, wie in POSIX.1-2008 definiert (siehe
der Basisdefinitionsband von POSIX.1‐2008, Abschnitt 9.4, Verlängert Normale Ausdrücke).
Die Haupterweiterungen sind Internationalisierungsfunktionen und Intervallausdrücke. Historisch
Implementierungen von awk schon lange unterstützt -Escape-Sequenzen als Erweiterung zu
erweiterte reguläre Ausdrücke, und diese Erweiterung wurde trotz Inkonsistenz beibehalten
mit anderen Dienstprogrammen. Die Anzahl der Escape-Sequenzen, die in beiden erweiterten regulären Sequenzen erkannt werden
Ausdrücke und Zeichenfolgen variieren (im Allgemeinen mit der Zeit zunehmend) zwischen den Implementierungen.
Der durch POSIX.1-2008 spezifizierte Satz umfasst die meisten Sequenzen, von denen bekannt ist, dass sie von populären unterstützt werden
Implementierungen und durch den ISO-C-Standard. Eine Sequenz, die nicht unterstützt wird, ist
Hexadezimalwert wird mit Escapezeichen versehen, beginnend mit '\X'. Dies würde Werte ermöglichen, die in mehr ausgedrückt werden
als 9 Bits verwendet werden awk wie im ISO-C-Standard. Da diese Syntax jedoch
eine nicht deterministische Länge hat, lässt es nicht zu, dass das nachfolgende Zeichen ein a ist
Hexadezimale Ziffer. Diese Einschränkung kann in der C-Sprache durch die Verwendung von umgangen werden
lexikalische Zeichenfolgenverkettung. Im awk Sprache könnte auch eine Verkettung eine Lösung sein
für Strings, aber nicht für erweiterte reguläre Ausdrücke (entweder lexikalische ERE-Tokens oder
(Strings, die dynamisch als reguläre Ausdrücke verwendet werden). Aufgrund dieser Einschränkung ist die Funktion
wurde nicht zu POSIX.1-2008 hinzugefügt.
Wenn eine Zeichenfolgenvariable in einem Kontext verwendet wird, in dem normalerweise ein erweiterter regulärer Ausdruck verwendet wird
erscheint (wo das lexikalische Token ERE in der Grammatik verwendet wird), enthält die Zeichenfolge nicht
das wörtliche Figuren.
Einige Versionen von awk Erlaube das Formular:
Funkt name(Argumente, ... ) { Aussagen }
Dies wurde von den Autoren der Sprache abgelehnt, die darum gebeten haben, dies nicht zu tun
spezifiziert.
Historische Implementierungen von awk einen Fehler erzeugen, wenn a weiter Die Anweisung wird in a ausgeführt
START Aktion und Ursache awk kündigen, wenn a weiter Die Anweisung wird in einem ausgeführt ENDE Maßnahmen.
Dieses Verhalten wurde nicht dokumentiert und es wurde nicht angenommen, dass es notwendig war
standardisieren Sie es.
Die Spezifikation der Konvertierungen zwischen String- und numerischen Werten ist wesentlich detaillierter
als in der Dokumentation historischer Implementierungen oder in den Referenzen Die AWK
Programmierung SPRACHE. Obwohl der größte Teil des Verhaltens auf Intuition ausgelegt ist, ist das
Details sind erforderlich, um ein kompatibles Verhalten verschiedener Implementierungen sicherzustellen. Das
ist in relationalen Ausdrücken besonders wichtig, da es sich um die Typen der Operanden handelt
Bestimmen Sie, ob ein Zeichenfolgen- oder ein numerischer Vergleich durchgeführt wird. Aus der Sicht eines
Als Anwendungsentwickler reicht es in der Regel aus, intuitives Verhalten zu erwarten und zu erzwingen
Konvertierungen (durch Hinzufügen von Nullen oder Verketten einer Nullzeichenfolge) beim Typ eines Ausdrucks
entspricht offensichtlich nicht dem Bedarf. Die Absicht bestand darin, die Geschichte zu spezifizieren
Praxis in fast allen Fällen. Die einzige Ausnahme besteht darin, dass in historischen Implementierungen
Variablen und Konstanten behalten sowohl Zeichenfolgen- als auch numerische Werte nach ihrem ursprünglichen Wert bei
wird durch jede Verwendung umgewandelt. Dies bedeutet, dass der Verweis auf eine Variable oder Konstante erfolgen kann
unerwartete Nebenwirkungen. Beispielsweise mit historischen Implementierungen wie folgt
Programm:
{
a = +2
b = 2
if (Nr % 2)
c = a + b
if (a == b)
drucken „numerisch Vergleich"
sonst
drucken "Zeichenfolge Vergleich"
}
würde für jede ungerade Zahl einen numerischen Vergleich durchführen (und einen numerischen Vergleich ausgeben).
Zeile, aber führen Sie einen String-Vergleich (und Ausgabe-String-Vergleich) für jede gerade Zeile durch.
nummerierte Zeile. POSIX.1-2008 stellt sicher, dass Vergleiche bei Bedarf numerisch sind. Mit
Historische Umsetzungen, folgendes Programm:
START {
OFMT = „%e“
drucken 3.14
OFMT = "%F"
drucken 3.14
}
würde ausgeben „3.140000e+00“ zweimal, denn im zweiten drucken Aussage die Konstante
"3.14" hätte einen String-Wert aus der vorherigen Konvertierung. POSIX.1-2008 erfordert dies
die Ausgabe des zweiten drucken Aussage sein "3.140000". Das Verhalten historischer
Implementierungen wurden als zu unintuitiv und unvorhersehbar angesehen.
Es wurde darauf hingewiesen, dass mit den in frühen Entwürfen enthaltenen Regeln das folgende Skript erstellt wurde
würde nichts drucken:
START {
y[1.5] = 1
OFMT = „%e“
drucken y[1.5]
}
Daher eine neue Variable, CONVFMT, wurde vorgestellt. Die OFMT Die Variable ist nun auf beschränkt
Auswirkungen auf die Ausgabekonvertierungen von Zahlen in Zeichenfolgen und CONVFMT wird für interne Zwecke verwendet
Konvertierungen wie Vergleiche oder Array-Indizierung. Der Standardwert ist derselbe
für OFMT, also es sei denn, ein Programm ändert sich CONVFMT (was kein historisches Programm tun würde), es
erhält das historische Verhalten im Zusammenhang mit internen String-Konvertierungen.
Die POSIX awk lexikalische und syntaktische Konventionen werden formaler spezifiziert als in anderen
Quellen. Auch hier bestand die Absicht darin, die historische Praxis zu spezifizieren. Eine Konvention, die vielleicht
nicht wie in anderen verbalen Beschreibungen aus der formalen Grammatik ersichtlich sein
Zeichen sind akzeptabel. Es gibt mehrere offensichtliche Platzierungen, wie z. B. die Beendigung von a
Aussage und a kann zur Flucht genutzt werden Zeichen zwischen beliebigen
lexikalische Token. Zusätzlich, Zeichen ohne Charaktere können
Es folgen ein Komma, eine offene Klammer, ein logischer UND-Operator („&&“), ein logischer ODER-Operator
("||"), Die do Stichwort, die sonst Schlüsselwort und die schließende Klammer von an if, für oder
während Aussage. Beispielsweise:
{ drucken $ 1,
$2 }
Die Anforderung, dass awk Fügen Sie ein Ende hinzu zum Programmargument text ist to
Vereinfachen Sie die Grammatik und passen Sie sie in der Form an eine Textdatei an. Es gibt keine Möglichkeit für eine
Anwendung oder Testsuite, um festzustellen, ob ein Literal vorliegt hinzugefügt wird oder ob awk
verhält sich einfach so, als ob es so wäre.
POSIX.1-2008 erfordert zur Unterstützung mehrere Änderungen gegenüber historischen Implementierungen
Internationalisierung. Die wohl subtilste davon ist die Verwendung des Dezimalpunkts
Charakter, definiert durch die LC_NUMERIC Kategorie des Gebietsschemas, in Darstellungen von
Gleitkommazahlen. Dieses gebietsschemaspezifische Zeichen wird zur Erkennung von Zahlen verwendet
Eingabe, beim Konvertieren zwischen Zeichenfolgen und numerischen Werten und beim Formatieren der Ausgabe.
Unabhängig vom Standort gilt jedoch: Zeichen (das Dezimalzeichen des
POSIX-Gebietsschema) ist das bei der Verarbeitung erkannte Dezimalzeichen awk Programme
(einschließlich Zuweisungen in Befehlszeilenargumenten). Dies ist im Wesentlichen die gleiche Konvention
wie im ISO-C-Standard verwendet. Der Unterschied besteht darin, dass die C-Sprache Folgendes enthält
setlocale()-Funktion, die es einer Anwendung ermöglicht, ihr Gebietsschema zu ändern. Aus diesem Grund
Mit dieser Fähigkeit beginnt eine C-Anwendung mit der Ausführung, wobei ihr Gebietsschema auf das C-Gebietsschema eingestellt ist, und zwar nur
wird nach einem expliziten Aufruf von im von der Umgebung angegebenen Gebietsschema ausgeführt setlocale().
Das Hinzufügen einer so aufwändigen neuen Funktion zum awk Sprache wurde als angesehen
ungeeignet für POSIX.1‐2008. Es ist möglich, eine auszuführen awk Programm explizit in jedem
Sie können das gewünschte Gebietsschema festlegen, indem Sie die Umgebung in der Shell festlegen.
Das undefinierte Verhalten, das sich aus NULs in erweiterten regulären Ausdrücken ergibt, ermöglicht Zukunft
Erweiterungen für das GNU gaffen Programm zur Verarbeitung binärer Daten.
Das Verhalten im Falle einer Ungültigkeit awk Programme (einschließlich lexikalischer, syntaktischer und
semantische Fehler) ist undefiniert, da es als übermäßig einschränkend für Implementierungen angesehen wurde
konkretisieren. In den meisten Fällen kann davon ausgegangen werden, dass solche Fehler zu einer Diagnose führen und nicht
Null-Exit-Status. Einige Implementierungen entscheiden sich jedoch möglicherweise dafür, die Sprache auf bestimmte Weise zu erweitern
die bestimmte ungültige Konstrukte verwenden. Andere ungültige Konstrukte könnten als ungültig erachtet werden
eine Warnung wert sind, ansonsten aber ein vernünftiges Verhalten hervorrufen. Noch andere Konstrukte
kann in einigen Implementierungen sehr schwer zu erkennen sein. Auch unterschiedliche Implementierungen
könnte einen bestimmten Fehler während einer ersten Analyse des Programms erkennen (bevor er einen Fehler liest).
Eingabedateien), während andere es möglicherweise erkennen, wenn sie das Programm ausführen, nachdem sie einige gelesen haben
Eingang. Implementierer sollten sich darüber im Klaren sein, dass Fehler so früh wie möglich diagnostiziert werden müssen
Die Erstellung nützlicher Diagnosen kann das Debuggen von Anwendungen erleichtern und somit eine Verbesserung ermöglichen
Implementierung benutzerfreundlicher.
Das nicht spezifizierte Verhalten bei der Verwendung mehrerer Zeichen RS Werte sollen eine mögliche Zukunft ermöglichen
Erweiterungen basierend auf erweiterten regulären Ausdrücken, die für Datensatztrennzeichen verwendet werden. Historisch
Implementierungen nehmen das erste Zeichen der Zeichenfolge und ignorieren die anderen.
Nicht spezifiziertes Verhalten, wenn gespalten(Schnur,Array, ) wird verwendet, um eine vorgeschlagene Zukunft zu ermöglichen
Erweiterung, die eine Zeichenfolge in ein Array einzelner Zeichen aufteilen würde.
Im Rahmen der Getline Funktion, gleich gute Argumente für unterschiedliche Präzedenzfälle
| und < Operatoren können erstellt werden. Die historische Praxis war Folgendes:
Getline < "ein" "b"
wird analysiert als:
( Getline < "ein" ) "b"
obwohl viele argumentieren würden, dass die Absicht darin bestand, dass die Datei ab sollte gelesen werden. Jedoch:
Getline < "x" + 1
analysiert als:
Getline < ( "x" + 1 )
Ähnliche Probleme treten mit dem auf | Version von Getline, insbesondere in Kombination mit $.
Beispielsweise:
$"echo Hallo " | Getline
(Diese Situation ist besonders problematisch, wenn sie in a verwendet wird drucken Aussage, wo die
|getline Ein Teil könnte eine Umleitung des sein drucken.)
Da solche Konstrukte in den meisten Fällen nicht verwendet werden (oder zumindest nicht verwendet werden sollten) (weil sie
haben eine natürliche Mehrdeutigkeit, für die es kein herkömmliches Parsen gibt), die Bedeutung dieser
Konstrukte wurden explizit nicht spezifiziert. (Der Effekt ist, dass eine konforme
Die Anwendung, bei der das Problem auftritt, muss Klammern setzen, um die Mehrdeutigkeit zu beseitigen.) Dort
Es schien, wenn überhaupt, nur wenige tatsächliche Verwendungsmöglichkeiten solcher Konstrukte zu geben.
Es können Grammatiken geschrieben werden, die unter diesen Umständen einen Fehler verursachen würden. Wo
Abwärtskompatibilität spielt keine große Rolle, Implementierer möchten sie möglicherweise verwenden
Grammatiken.
Einige historische Implementierungen ermöglichten den Aufruf einiger integrierter Funktionen ohne
eine Argumentliste, wobei das Ergebnis eine Standardargumentliste ist, die auf „vernünftige“ Weise ausgewählt wurde.
Weg. Gebrauch von Länge als Synonym für Länge($0) ist die einzige dieser Formen
vermutlich weithin bekannt oder weit verbreitet; Diese besondere Form ist in verschiedenen Dokumenten dokumentiert
Orte (zum Beispiel die meisten historisch awk Referenzseiten, jedoch nicht in den referenzierten Seiten
Die AWK Programmierung SPRACHE) als legitime Praxis. Mit dieser Ausnahme Standard
Argumentlisten waren schon immer undokumentiert und vage definiert, und das ist überhaupt nicht der Fall
klar, wie (oder ob) sie auf benutzerdefinierte Funktionen verallgemeinert werden sollten. Sie fügen nichts Nützliches hinzu
Funktionalität und schließen mögliche zukünftige Erweiterungen aus, die möglicherweise die Benennung von Funktionen erfordern
ohne sie anzurufen. Sie nicht zu standardisieren scheint der einfachste Weg zu sein. Der Standard
Entwickler haben das berücksichtigt Länge verdient jedoch eine Sonderbehandlung, da dies der Fall ist
in der Vergangenheit dokumentiert und findet möglicherweise erhebliche Verwendung in historischen Programmen.
Dementsprechend wurde diese Verwendung legitimiert, aber Ausgabe 5 entfernte die veraltete Verwendung
Markierung für XSI-konforme Implementierungen und viele ansonsten konforme Anwendungen
hängen von dieser Funktion ab.
In unten und gsubWenn erwidern ist ein String-Literal (das lexikalische Token). STRING), dann zwei
aufeinanderfolgenden Es sollten in der Zeichenfolge Zeichen verwendet werden, um ein einzelnes Zeichen sicherzustellen
wird dem vorausgehen wenn die resultierende Zeichenfolge an übergeben wird
Funktion. (Zum Beispiel, um ein Literal anzugeben Verwenden Sie in der Ersatzzeichenfolge
gsub(EHE, „\\&“)).
Historisch gesehen ist das einzige Sonderzeichen in der erwidern Argument oder unten und gsub Schnur
Funktionen war die ('&') Zeichen und davor das
Das Zeichen wurde verwendet, um seine besondere Bedeutung auszuschalten.
Die Beschreibung im ISO POSIX-2:1993-Standard führte ein Verhalten ein, das dazu führt, dass
Das Zeichen war ein weiteres Sonderzeichen und es wurde nicht spezifiziert, ob es vorhanden war
waren irgendwelche anderen Sonderzeichen. Diese Beschreibung führte mehrere Portabilitäten ein
Probleme, von denen einige im Folgenden beschrieben werden, wurden daher durch weitere ersetzt
historische Beschreibung. Zu den Problemen zählen unter anderem:
* Früher konnte zum Erstellen der Ersatzzeichenfolge ein Skript verwendet werden gsub(EHE, „\\&“),
aber mit dem ISO POSIX-2:1993-Standardwortlaut war es notwendig, zu verwenden gsub(EHE,
„\\\\&“). Der Zeichen werden hier verdoppelt, da dies bei allen String-Literalen der Fall ist
Gegenstand einer lexikalischen Analyse, die jedes Paar reduzieren würde Zeichen zu
ein einzelner bevor es weitergegeben wird gsub.
* Da nicht spezifiziert wurde, welche Sonderzeichen für portable Skripte verwendet werden sollen
Um sicherzustellen, dass Zeichen wörtlich gedruckt werden, musste jedem Zeichen vorangestellt werden
mit einem . (Zum Beispiel musste ein portables Skript verwendet werden gsub(EHE, "\\Hi") Um
Erzeugen Sie eine Ersatzzeichenfolge von "Hallo".)
Die Beschreibung für Vergleiche im ISO POSIX-2:1993-Standard war nicht richtig beschrieben
historische Praxis aufgrund der Art und Weise, wie numerische Zeichenfolgen als Zahlen verglichen werden. Der
Aktuelle Regeln verursachen den folgenden Code:
if (0 == "000")
drucken "seltsam, aber WAHR"
sonst
drucken "nicht WAHR"
um einen numerischen Vergleich durchzuführen, der dazu führt, dass if erfolgreich sein. Es sollte intuitiv offensichtlich sein
dass dies ein falsches Verhalten ist und in der Tat keine historische Umsetzung davon darstellt awk berührt das Schneidwerkzeug
verhält sich so.
Um dieses Problem zu beheben, ist die Definition von numerisch Schnur wurde erweitert, um nur diese einzuschließen
Werte, die aus bestimmten Umständen (hauptsächlich externen Quellen) stammen, wo dies nicht der Fall ist
Es lässt sich eindeutig feststellen, ob der Wert ein String oder ein Wert sein soll
numerisch.
Variablen, die einer numerischen Zeichenfolge zugewiesen sind, werden ebenfalls als numerische Zeichenfolge behandelt.
(Zum Beispiel kann der Begriff einer numerischen Zeichenfolge über Zuweisungen hinweg weitergegeben werden.) In
Bei Vergleichen sind alle Variablen mit dem nicht initialisierten Wert als numerisch zu behandeln
Operand, der den numerischen Wert Null ergibt.
Zu den nicht initialisierten Variablen gehören alle Arten von Variablen, einschließlich Skalare, Array-Elemente,
und Felder. Die Definition eines nicht initialisierten Werts in Variablen und Spezial Variablen is
notwendig, um den Wert zu beschreiben, der nicht initialisierten Variablen und Feldern zugewiesen wird
gültig (zum Beispiel < $ Nf), aber keine Zeichen enthalten und um zu beschreiben, wie diese
Variablen sollen in Vergleichen verwendet werden. Ein gültiges Feld, z. B $1, das keine Zeichen hat
darin kann aus einer Eingabezeile von abgerufen werden „\t\t“ wann FS='\t'. Historisch gesehen ist die
Vergleich (1 $10) erfolgte numerisch nach der Auswertung $1 auf den Wert Null.
Der Satz „... soll auch den numerischen Wert der numerischen Zeichenfolge haben“ wurde entfernt
aus mehreren Abschnitten des ISO POSIX-2:1993-Standards, da dieser eine Unnötigkeit spezifiziert
Implementierungsdetails. Für POSIX.1-2008 ist es nicht erforderlich, diese Objekte anzugeben
zwei unterschiedliche Werte zugewiesen werden. Es muss lediglich angegeben werden, dass diese Objekte zulässig sind
je nach Kontext zu zwei unterschiedlichen Werten auswerten.
Historische Implementierungen von awk Hexadezimale Ganzzahlen oder Gleitkommakonstanten wurden nicht analysiert
Google Trends, Amazons Bestseller „0xa“ und „0xap0“. Aufgrund eines Versehens sind die Ausgaben 2001 bis 2004 davon betroffen
Standardmäßig erforderliche Unterstützung für hexadezimale Gleitkommakonstanten. Dies lag daran, dass
Bezug auf atof(). Diese Version des Standards erlaubt, erfordert aber nicht
zu verwendende Implementierungen atof() und enthält eine Beschreibung der Funktionsweise von Gleitkommazahlen
als Alternative zum historischen Verhalten anerkannt. Der Zweck dieser Änderung besteht darin,
Ermöglichen Sie Implementierungen, Gleitkommakonstanten gemäß entweder dem zu erkennen
ISO/IEC 9899:1990-Standard oder ISO/IEC 9899:1999-Standard und um zu ermöglichen (aber nicht zu erfordern)
Implementierungen zur Erkennung hexadezimaler Ganzzahlkonstanten.
Historische Implementierungen von awk unterstützte keine Gleitkomma-Unendlichkeiten und NaNs in
numerisch Streicher;; z.B, „−INF“ und „NaN“. Implementierungen, die die verwenden atof() oder
strtod()-Funktionen zur Durchführung der Konvertierung haben Unterstützung für diese Werte erhalten, wenn sie a verwendet haben
ISO/IEC 9899:1999-Standardversion der Funktion anstelle eines ISO/IEC 9899:1990-Standards
Ausführung. Aufgrund eines Versehens war dies in den Ausgaben 2001 bis 2004 dieser Norm nicht der Fall
Erlauben Sie die Unterstützung für Unendlichkeiten und NaNs, aber in dieser Revision ist die Unterstützung erlaubt (aber nicht).
erforderlich). Dies ist eine stille Verhaltensänderung von awk Programme; zum Beispiel in der
POSIX-Locale den Ausdruck:
("-INF" + 0 < 0)
Hatte früher den Wert 0, weil „−INF“ in 0 konvertiert, kann aber nun den Wert 0 haben oder
1.
ZUKUNFT Anfahrt
Keine zusätzlichen Tools.
Nutzen Sie awkposix online über die Dienste von onworks.net