Dit is de opdracht awkposix die kan worden uitgevoerd in de gratis hostingprovider van OnWorks met behulp van een van onze meerdere gratis online werkstations zoals Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator
PROGRAMMA:
NAAM
awk — patroonscan- en verwerkingstaal
KORTE INHOUD
awk [F sepstring] [v toewijzing]... programma [argument...]
awk [F sepstring] f profiel [f profiel]... [v toewijzing]...
[argument...]
PRODUCTBESCHRIJVING
De awk hulpprogramma voert programma's uit die zijn geschreven in de awk programmeertaal, dat is
gespecialiseerd in tekstuele datamanipulatie. Een awk programma is een reeks patronen en
bijbehorende acties. Wanneer invoer wordt gelezen die overeenkomt met een patroon, wordt de actie geassocieerd
met dat patroon wordt uitgevoerd.
De invoer moet worden geïnterpreteerd als een reeks records. Standaard is een record een regel, minder
het eindigt , maar dit kan worden gewijzigd met behulp van de RS ingebouwde variabele. Elk
Het record van de invoer wordt op zijn beurt vergeleken met elk patroon in het programma. Voor elk
patroon overeenkomt, wordt de bijbehorende actie uitgevoerd.
De awk hulpprogramma interpreteert elk invoerrecord als een reeks velden waarin, door
standaard is een veld een reeks niet- niet- karakters. Deze standaard
En veldscheidingsteken kan worden gewijzigd met behulp van de FS ingebouwde variabele of de F
sepstring optie. De awk utility geeft het eerste veld in een record $1 aan, het tweede
$ 2, enzovoort. Het symbool $0 verwijst naar het gehele record; een ander veld instellen
veroorzaakt de herwaardering van $0. Als u $0 toewijst, worden de waarden van alle andere velden opnieuw ingesteld
en NF ingebouwde variabele.
OPTIES
De awk hulpprogramma zal voldoen aan het Base Definitions-volume van POSIX.1‐2008, sectie
12.2, utility Syntaxis Richtlijnen.
De volgende opties worden ondersteund:
F sepstring
Definieer het invoerveldscheidingsteken. Deze optie is gelijkwaardig aan:
-v FS =sepstring
behalve dat als F sepstring en v FS =sepstring worden beide gebruikt, het is niet gespecificeerd
of de FS opdracht die voortvloeit uit F sepstring wordt in opdracht verwerkt
regelvolgorde of wordt na de laatste verwerkt v FS =sepstring. Zie de beschrijving
van de FS ingebouwde variabele, en hoe deze wordt gebruikt, in de UITGEBREIDE BESCHRIJVING
pagina.
f profiel
Geef de padnaam van het bestand op profiel met een awk programma. Een padnaam
of '−' geeft de standaardinvoer aan. Als er meerdere exemplaren van deze optie zijn
opgegeven, de aaneenschakeling van de bestanden die zijn opgegeven als profiel in de volgorde
gespecificeerd is de awk programma. De awk programma kan ook zijn
opgegeven in de opdrachtregel als één argument.
v toewijzing
De aanvraag zorgt ervoor dat de toewijzing argument heeft dezelfde vorm als
an toewijzing operand. De gespecificeerde toewijzing van variabelen moet vóór plaatsvinden
uitvoeren van de awk programma, inclusief de bijbehorende acties BEGINNEN patronen
(indien aanwezig). Er kunnen meerdere exemplaren van deze optie worden opgegeven.
OPERANDEN
De volgende operanden worden ondersteund:
programma Zo nee f optie is opgegeven, de eerste operand naar awk is de tekst van de
awk programma. De aanvraag levert de programma operand als één
argument voor awk. Als de tekst niet eindigt op een , awk zal interpreteren
de tekst alsof dat zo is.
argument Een van de volgende twee soorten argument kan worden gemengd:
filet Een padnaam van een bestand dat de te lezen invoer bevat, namelijk
afgestemd op de reeks patronen in het programma. Als Nee filet
operanden zijn opgegeven, of als a filet operand is '−', de standaard
invoer wordt gebruikt.
toewijzing
Een operand die begint met an of alfabetisch teken
uit de draagbare tekenset (zie de tabel in de Basisdefinities
volume van POSIX.1‐2008, sectie 6.1, Draagbaar Karakter Zet de), gevolgd
door een reeks onderstrepingstekens, cijfers en alfabetische tekens uit de
draagbare tekenset, gevolgd door de '=' karakter, specificeert a
variabele toewijzing in plaats van een padnaam. De karakters vóór de
'=' vertegenwoordigt de naam van een awk variabel; als die naam een awk
gereserveerd woord (zie Grammatica) het gedrag is niet gedefinieerd. De karakters
volgens de worden geïnterpreteerd alsof ze verschenen
in de awk programma voorafgegaan en gevolgd door een dubbel aanhalingsteken (''')
karakter, als een STRING teken (zie Grammatica), behalve als het de laatste is
karakter is een onontkoombaar karakter , zal het worden geïnterpreteerd als een
letterlijk in plaats van als het eerste teken van de reeks
"\"". De variabele krijgt de waarde daarvan toegewezen STRING teken
en wordt, indien van toepassing, beschouwd als een numerieke snaar (Zie
Uitdrukkingen in awk), krijgt de variabele ook zijn numerieke waarde toegewezen
waarde. Elke dergelijke toewijzing van variabelen zal plaatsvinden vlak vóór de
verwerking van het volgende filet, indien aanwezig. Een opdracht vooraf dus
de eerste filet argument wordt uitgevoerd na de BEGINNEN acties (als
elk), terwijl een opdracht na de laatste ligt filet argument zal optreden
voor de EINDE acties (indien aanwezig). Als er geen filet argumenten,
toewijzingen moeten worden uitgevoerd voordat de standaardinvoer wordt verwerkt.
STDIN
De standaardinvoer mag alleen worden gebruikt als er geen filet operanden zijn opgegeven, of als a filet
operand is '−', of als een profiel optie-argument is '−'; zie de sectie INPUTBESTANDEN. Als
the awk programma bevat geen acties en geen patronen, maar is verder geldig awk programma,
standaardinvoer en eventuele filet operanden mogen niet worden gelezen en awk zal eindigen met een terugkeer
status van nul.
INVOER FILES
Voer bestanden in naar de awk programma uit een van de volgende bronnen zijn tekstbestanden:
* Ieder filet operanden of hun equivalenten, bereikt door het wijzigen van de awk variabelen ARGV
en ARGC
* Standaardinvoer bij afwezigheid ervan filet operanden
* Argumenten voor de getlijn functie
Of het nu gaat om de variabele RS is ingesteld op een andere waarde dan a of niet, voor deze bestanden,
implementaties ondersteunen records die zijn beëindigd met het opgegeven scheidingsteken tot
{LINE_MAX} bytes en ondersteunt mogelijk langere records.
If f profiel is gespecificeerd, zorgt de toepassing ervoor dat de bestanden met de naam van elk van
the profiel optie-argumenten zijn tekstbestanden en hun aaneenschakeling, in dezelfde volgorde als
ze verschijnen in de argumenten, is een awk programma.
MILIEU VARIABELEN
De volgende omgevingsvariabelen zijn van invloed op de uitvoering van: awk:
TAAL Geef een standaardwaarde op voor de internationaliseringsvariabelen die niet zijn ingesteld of
nul. (Zie het volume Basisdefinities van POSIX.1‐2008, sectie 8.2,
internationalisering Variabelen voor de prioriteit van internationalisering
variabelen die worden gebruikt om de waarden van landinstellingen te bepalen.)
LC_ALL Indien ingesteld op een niet-lege tekenreekswaarde, overschrijf dan de waarden van alle andere
internationaliseringsvariabelen.
LC_COLLATE
Bepaal de landinstelling voor het gedrag van bereiken, equivalentieklassen en multi-
tekenverzamelingselementen binnen reguliere expressies en in vergelijkingen van
tekenreeks waarden.
LC_CTYPE Bepaal de landinstelling voor de interpretatie van reeksen bytes tekstgegevens
als tekens (bijvoorbeeld single-byte in plaats van multi-byte tekens in
argumenten en invoerbestanden), het gedrag van tekenklassen binnen reguliere
uitdrukkingen, de identificatie van karakters als letters en het in kaart brengen van
hoofdletters en kleine letters voor de toupeer en verlagen functies.
LC_MESSAGES
Bepaal de landinstelling die moet worden gebruikt om het formaat en de inhoud van te beïnvloeden
diagnostische berichten geschreven naar standaardfout.
LC_NUMERIC
Bepaal het radix-teken dat wordt gebruikt bij het interpreteren van numerieke invoer, uitvoeren
conversies tussen numerieke waarden en tekenreekswaarden, en het opmaken van numerieke uitvoer.
Ongeacht de locatie, de teken (het decimaalteken van de
POSIX-landinstelling) is het decimaalteken dat wordt herkend tijdens de verwerking awk
programma's (inclusief toewijzingen in opdrachtregelargumenten).
NLSPAT Bepaal de locatie van berichtencatalogi voor de verwerking van: LC_MESSAGES.
PATH Bepaal het zoekpad bij het zoeken naar opdrachten die worden uitgevoerd door system(uitdrukken), of
invoer- en uitvoerleidingen; zie het Base Definitions-volume van POSIX.1-2008, Hoofdstuk
8, Milieu Variabelen.
Bovendien moeten alle omgevingsvariabelen zichtbaar zijn via de awk variabele MILIEU.
ASYNCHROON EVENEMENTEN
Standaard.
STDOUT
De aard van de uitvoerbestanden is afhankelijk van de awk programma.
STDERR
De standaardfout wordt alleen gebruikt voor diagnostische berichten.
OUTPUT FILES
De aard van de uitvoerbestanden is afhankelijk van de awk programma.
UITGEBREID PRODUCTBESCHRIJVING
globaal Programma Structuur
An awk programma is samengesteld uit paren van de vorm:
patroon { actie }
Zowel het patroon als de actie (inclusief de omringende accoladetekens) kan dat zijn
overgeslagen.
Een ontbrekend patroon moet overeenkomen met elke invoerregistratie, en een ontbrekende actie zal dat ook zijn
gelijk aan:
{ print }
uitvoering van de awk programma begint met het eerst uitvoeren van de bijbehorende acties
allen BEGINNEN patronen in de volgorde waarin ze in het programma voorkomen. Dan elk filet operand (of
standaardinvoer als er geen bestanden zijn opgegeven) worden op hun beurt verwerkt door gegevens uit te lezen
het bestand totdat een recordscheidingsteken wordt gezien ( standaard). Vóór de eerste
verwijzing naar een veld in het record wordt geëvalueerd, wordt het record opgesplitst in velden,
volgens de regels van Normaal Uitdrukkingen, met behulp van de waarde van FS dat was actueel op
het tijdstip waarop het record werd gelezen. Elk patroon in het programma wordt vervolgens geëvalueerd in de
volgorde van voorkomen en de actie die bij elk patroon hoort dat overeenkomt met de huidige
plaat uitgevoerd. De actie voor een passend patroon moet vóór de evaluatie worden uitgevoerd
daaropvolgende patronen. Ten slotte de acties die met alles verband houden EINDE patronen zullen zijn
uitgevoerd in de volgorde waarin ze in het programma voorkomen.
Uitdrukkingen in awk
Expressies beschrijven berekeningen die worden gebruikt in patronen en acties. In de volgende tabel,
geldige expressiebewerkingen worden gegeven in groepen van de hoogste prioriteit eerst naar de laagste
prioriteit als laatste, met operatoren met gelijke prioriteit gegroepeerd tussen horizontale lijnen. In
evaluatie van uitdrukkingen, waarbij de grammatica formeel dubbelzinnig is, hogere prioriteit
Operators worden beoordeeld vóór operators met een lagere prioriteit. In deze tabel uitdrukken, uitdr1,
uitdr2en uitdr3 vertegenwoordigen elke uitdrukking, terwijl lvalue elke entiteit vertegenwoordigt die kan zijn
toegewezen aan (dat wil zeggen, aan de linkerkant van een toewijzingsoperator). De precieze syntaxis van
uitdrukkingen worden gegeven Grammatica.
tafel 4-1: Uitdrukkingen in Afnemende Voorrang in awk
┌─────────────────────┬───────────────── ────────┬─ ───────────────┬──────────────┐
│ Syntaxis │ Naam │ Type of Resultaat │Associativiteit │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│( uitdrukken ) │Groepering │Type uitdrukken │nvt │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│$uitdrukken │Veldreferentie │String │N.v.t. │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│lwaarde ++ │Post-verhoging │Numeriek │N.v.t. │
│lwaarde −− │Post-verlaging │Numeriek │N.v.t. │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│++ lwaarde │Voorverhogen │Numeriek │N.v.t. │
│−− lwaarde │Voorverlagen │Numeriek │N.v.t. │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken ^ uitdrukken │Exponentiatie │Numeriek │Rechts │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│! uitdrukken │Logisch niet │Numeriek │N.v.t. │
│+ uitdrukken │Unair plus │Numeriek │N.v.t. │
│− uitdrukken │Unair min │Numeriek │N.v.t. │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken * uitdrukken │Vermenigvuldigen │Numeriek │Links │
│uitdrukken / uitdrukken │Divisie │Numeriek │Links │
│uitdrukken % uitdrukken │Modulus │Numeriek │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken + uitdrukken │Optelling │Numeriek │Links │
│uitdrukken - uitdrukken │Aftrekken │Numeriek │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken uitdrukken │String-aaneenschakeling │String │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken < uitdrukken │Minder dan │Numeriek │Geen │
│uitdrukken <= uitdrukken │Kleiner dan of gelijk aan │Numeriek │Geen │
│uitdrukken != uitdrukken │Niet gelijk aan │Numeriek │Geen │
│uitdrukken == uitdrukken │Gelijk aan │Numeriek │Geen │
│uitdrukken > uitdrukken │Groter dan │Numeriek │Geen │
│uitdrukken >= uitdrukken │Groter dan of gelijk aan │Numeriek │Geen │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken ~ uitdrukken │ERE komt overeen met │Numeriek │Geen │
│uitdrukken !~ uitdrukken │ERE komt niet overeen │Numeriek │Geen │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken in array │Array-lidmaatschap │Numeriek │Links │
│( index ) in reeks │Meerdimensionale array │Numeriek │Links │
│ │lidmaatschap │ │ │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken && uitdrukken │Logisch EN │Numeriek │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdrukken || uitdrukken │Logisch OF │Numeriek │Links │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│uitdr1 ? uitdr2 : uitdr3│Voorwaardelijke expressie │Type geselecteerd│Rechts │
│ │uitdr2 or uitdr3 │
├─────────────────────┼───────────────── ────────┼─ ───────────────┼──────────────┤
│lwaarde ^= uitdrukken │Exponentiatietoewijzing│Numeriek │Rechts │
│lwaarde %= uitdrukken │Modulustoewijzing │Numeriek │Rechts │
│lwaarde *= uitdrukken │Toewijzing van vermenigvuldiging│Numeriek │Rechts │
│lwaarde /= uitdrukken │Divisietoewijzing │Numeriek │Rechts │
│lwaarde += uitdrukken │Optellingsopdracht │Numeriek │Rechts │
│lwaarde −= uitdrukken │Aftrekopdracht │Numeriek │Rechts │
│lwaarde = uitdrukken │Opdracht │Soort uitdrukken │Juist │
└─────────────────────┴───────────────── ────────┴─ ───────────────┴──────────────┘
Elke expressie moet een tekenreekswaarde, een numerieke waarde of beide hebben. Behalve als
opgegeven voor specifieke contexten, zal de waarde van een uitdrukking impliciet worden omgezet naar
het type dat nodig is voor de context waarin het wordt gebruikt. Een tekenreekswaarde wordt geconverteerd naar
een numerieke waarde, hetzij door het equivalent van de volgende aanroepen van functies gedefinieerd door
de ISO C-norm:
plaats instellen(LC_NUMERIC, "");
numerieke waarde = op(tekenreekswaarde);
of door het eerste gedeelte van de tekenreeks naar type te converteren verdubbelen vertegenwoordiging als
volgt:
De invoerreeks wordt opgesplitst in twee delen: een initiële, mogelijk lege, reeks
van witruimtetekens (zoals gespecificeerd door isruimte()) en een onderwerpreeks
geïnterpreteerd als een drijvende-kommaconstante.
De verwachte vorm van de onderwerpreeks is optioneel '+' or '−' teken, dan een
niet-lege reeks cijfers die eventueel a bevatten , dan een optioneel
exponent deel. Een exponentgedeelte bestaat uit 'e' or 'E', gevolgd door een optioneel
teken, gevolgd door een of meer decimale cijfers.
De reeks die begint met het eerste cijfer of de (wat zich het eerst voordoet)
wordt geïnterpreteerd als een zwevende constante van de C-taal, en indien geen van beide een exponent
deel noch een verschijnt, een Er wordt aangenomen dat dit volgt op het laatste cijfer in de
snaar. Als de onderwerpreeks begint met een minteken, resulteert de waarde uit
de conversie wordt tenietgedaan.
Een numerieke waarde die exact gelijk is aan de waarde van een geheel getal (zie sectie 1.1.2,
Concepts Afgeleid vanaf the ISO C Standaard) zal door het equivalent naar een string worden geconverteerd
van een oproep aan de sprint functie (zie Draad Functies) met het touwtje "%NS" de fmt
argument en de numerieke waarde wordt als eerste en enige geconverteerd uitdrukken argument. Elk
andere numerieke waarden worden geconverteerd naar een string door het equivalent van een aanroep naar de
sprint functie met de waarde van de variabele CONVFMT de fmt betoog en de
numerieke waarde die als eerste en enige wordt geconverteerd uitdrukken argument. Het resultaat van de
conversie is niet gespecificeerd als de waarde van CONVFMT is geen drijvende-komma-indeling
specificatie. Dit deel van POSIX.1-2008 specificeert geen expliciete conversies tussen
cijfers en strings. Een toepassing kan afdwingen dat een expressie als een getal wordt behandeld door
door er nul aan toe te voegen, of te forceren dat het als een string wordt behandeld door de nul aaneen te schakelen
snaar ("") eraan.
Een stringwaarde wordt beschouwd als a numerieke snaar als het afkomstig is van een van de volgende zaken:
1. Veldvariabelen
2. Invoer van de getlijn() functie
3. BESTANDSNAAM
4. ARGV array-elementen
5. MILIEU array-elementen
6. Array-elementen gemaakt door de spleet() functie
7. Een opdrachtregelvariabeletoewijzing
8. Variabeletoewijzing vanuit een andere numerieke stringvariabele
en een implementatie-afhankelijke voorwaarde die overeenkomt met geval (a) of (b) hieronder is
leerde kennen.
A. Na het equivalent van de volgende aanroepen van functies gedefinieerd door de ISO C
standaard, string_waarde_einde van zou verschillen tekenreekswaarde, en eventuele tekens daarvoor
het afsluitende nulteken in string_waarde_einde zou zijn karakters:
verkolen *string_waarde_einde;
plaats instellen(LC_NUMERIC, "");
numerieke waarde = strtod (tekenreekswaarde, &string_waarde_end);
B. Nadat alle volgende conversies zijn toegepast, zou de resulterende tekenreeks dat doen
lexicaal herkend worden als a NUMMER token zoals beschreven door de lexicale conventies in
Grammatica:
- Allemaal leidend en achteraan karakters worden weggegooid.
-- Als de eerste niet- is '+' or '−', het wordt weggegooid.
-- Elke keer dat het decimaalteken uit de huidige landinstelling voorkomt, wordt dit gewijzigd
naar een .
In geval (a) is de numerieke waarde van de numerieke snaar zal de waarde zijn die zou zijn
teruggestuurd door de strtod() telefoongesprek. In geval (b) als de eerste niet- is '−', het numerieke
waarde van de numerieke snaar zal de ontkenning zijn van de numerieke waarde van het herkende
NUMMER teken; anders is de numerieke waarde van de numerieke snaar zal het numerieke zijn
waarde van de erkende NUMMER teken. Of een string wel of niet een numerieke snaar zal zijn
alleen relevant in contexten waarin die term in deze sectie wordt gebruikt.
Wanneer een expressie in een Booleaanse context wordt gebruikt en deze een numerieke waarde heeft, wordt de waarde van
nul wordt als onwaar behandeld en elke andere waarde wordt als waar behandeld. Anders, een
stringwaarde van de null-string zal als false worden behandeld en elke andere waarde zal dat zijn
als waar behandeld. Een Booleaanse context zal een van de volgende zijn:
* De eerste subexpressie van een voorwaardelijke expressie
* Een expressie die wordt uitgevoerd met logische NOT, logische AND of logische OR
* De tweede uitdrukking van a voor verklaring
* De uitdrukking van een if verklaring
* De uitdrukking van de en clausule in a en or do...en verklaring
* Een uitdrukking die als patroon wordt gebruikt (zoals in de algemene programmastructuur)
Alle rekenkunde moet de semantiek van de drijvende-kommaberekening volgen, zoals gespecificeerd door de
ISO C-norm (zie sectie 1.1.2, Concepts Afgeleid vanaf the ISO C Standaard).
De waarde van de uitdrukking:
uitdr1 ^ uitdr2
moet gelijkwaardig zijn aan de waarde die wordt geretourneerd door de ISO C-standaardfunctieaanroep:
pow(uitdr1, uitdr2)
De uitdrukking:
waardevalu ^= uitdrukken
moet gelijkwaardig zijn aan de ISO C-standaarduitdrukking:
waardevalu = pow(lwaarde, uitdrukken)
behalve dat lvalue slechts één keer zal worden geëvalueerd. De waarde van de uitdrukking:
uitdr1 % uitdr2
moet gelijkwaardig zijn aan de waarde die wordt geretourneerd door de ISO C-standaardfunctieaanroep:
fmod(uitdr1, uitdr2)
De uitdrukking:
waardevalu %= uitdrukken
moet gelijkwaardig zijn aan de ISO C-standaarduitdrukking:
waardevalu = fmod(lwaarde, uitdrukken)
behalve dat lvalue slechts één keer zal worden geëvalueerd.
Variabelen en velden worden ingesteld door de toewijzingsinstructie:
waardevalu = uitdrukking
en het type uitdrukking bepaalt het resulterende variabeletype. De opdracht
omvat de rekenkundige opdrachten ("+=", "-=", "*=", "/=", "%=", "^=", "++", "--") alle
waarvan een numeriek resultaat zal opleveren. De linkerkant van een opdracht en de
Het doel van de operatoren voor verhogen en verlagen kan een variabele zijn, een array met index,
of een veldselector.
De awk taal levert arrays die worden gebruikt voor het opslaan van getallen of tekenreeksen. Arrays
hoeft niet aangegeven te worden. Ze zullen in eerste instantie leeg zijn en hun afmetingen zullen veranderen
dynamisch. De subscripts, of element-ID's, zijn strings, die een type van
associatieve array-mogelijkheden. Een arraynaam gevolgd door een subscript tussen vierkante haakjes
kan worden gebruikt als een lwaarde en dus als een uitdrukking, zoals beschreven in de grammatica; zien
Grammatica. Niet-onderschreven arraynamen kunnen alleen in de volgende contexten worden gebruikt:
* Een parameter in een functiedefinitie of functieaanroep
* De NAAM token na elk gebruik van het trefwoord in zoals gespecificeerd in de grammatica (zie
Grammatica); als de naam die in deze context wordt gebruikt geen arraynaam is, is het gedrag dat wel
Gulf Driller VI
Een geldige array index bestaat uit één of meer -gescheiden uitdrukkingen, vergelijkbaar met
de manier waarop multidimensionale arrays in sommige programmeertalen worden geïndexeerd.
Omdat awk arrays zijn echt eendimensionaal, zoals a -gescheiden lijst zal zijn
geconverteerd naar een enkele tekenreeks door de tekenreekswaarden van de afzonderlijke tekenreeksen samen te voegen
expressies, elk van elkaar gescheiden door de waarde van de SUBSEP variabel. Dus de
de volgende twee indexbewerkingen zijn gelijkwaardig:
var[uitdr1, uitdr2, ... uit]
var[uitdr1 SUBSEP uitdr2 SUBSEP ... SUBSEP uit]
De aanvraag moet ervoor zorgen dat een multidimensionaal index gebruikt met de in exploitant is
tussen haakjes. De in operator, die test op het bestaan van een bepaalde array
element, zal er niet voor zorgen dat dat element bestaat. Elke andere verwijzing naar een niet-bestaande array
element zal het automatisch aanmaken.
Vergelijkingen (met de '<', "<=", "!=", "==", '>'en ">=" exploitanten) worden gemaakt
numeriek als beide operanden numeriek zijn, als de ene numeriek is en de andere een string heeft
waarde die een numerieke tekenreeks is, of als de ene numeriek is en de andere niet-geïnitialiseerd is
waarde. Anders worden operanden indien nodig omgezet in strings en een string
de vergelijking moet worden gemaakt met behulp van de landspecifieke sorteervolgorde. De waarde van de
vergelijkingsexpressie is 1 als de relatie waar is, of 0 als de relatie onwaar is.
Variabelen en Speciaal Variabelen
Variabelen kunnen worden gebruikt in een awk programma door ernaar te verwijzen. Met uitzondering van
functieparameters (zie Gebruiker gedefinieerde Functies), worden ze niet expliciet vermeld.
Namen van functieparameters moeten lokaal zijn voor de functie; alle andere namen van variabelen zullen zijn
globaal. Dezelfde naam mag niet zowel als functieparameternaam als als naam worden gebruikt
van een functie of een bijzonderheid awk variabel. Dezelfde naam mag niet zowel als a. worden gebruikt
variabelenaam met globaal bereik en als de naam van een functie. Dezelfde naam zal dat niet zijn
gebruikt binnen hetzelfde bereik, zowel als scalaire variabele als als array. Niet-geïnitialiseerd
variabelen, inclusief scalaire variabelen, array-elementen en veldvariabelen, moeten een
niet-geïnitialiseerde waarde. Een niet-geïnitialiseerde waarde heeft zowel een numerieke waarde nul als a
tekenreekswaarde van de lege tekenreeks. Evaluatie van variabelen met een niet-geïnitialiseerde waarde, to
string of numeriek, wordt bepaald door de context waarin ze worden gebruikt.
Veldvariabelen worden aangegeven met a '$' gevolgd door een getal of numerieke uitdrukking.
Het effect van het veldnummer uitdrukking evalueren tot iets anders dan een niet-negatief
geheel getal is niet gespecificeerd; niet-geïnitialiseerde variabelen of tekenreekswaarden hoeven niet te worden geconverteerd
numerieke waarden in deze context. Nieuwe veldvariabelen kunnen worden aangemaakt door er een waarde aan toe te kennen
hen. Verwijzingen naar niet-bestaande velden (dat wil zeggen velden na $NF), zal evalueren naar de
niet-geïnitialiseerde waarde. Dergelijke verwijzingen mogen geen nieuwe velden creëren. Echter, het toewijzen aan a
niet-bestaand veld (bijvoorbeeld $(NF+2)=5) verhoogt de waarde van NF; maak er een
tussenliggende velden met de niet-geïnitialiseerde waarde; en ervoor zorgen dat de waarde $0 is
opnieuw berekend, waarbij de velden worden gescheiden door de waarde van FSO. Elke veldvariabele
zal een tekenreekswaarde of een niet-geïnitialiseerde waarde hebben wanneer deze wordt gemaakt. Veldvariabelen zullen
hebben de niet-geïnitialiseerde waarde wanneer deze is gemaakt op basis van $0 met behulp van FS en de variabele niet
geen tekens bevatten. Indien van toepassing wordt de veldvariabele als numeriek beschouwd
touwtje (zie Uitdrukkingen in awk).
Implementaties zullen de volgende andere speciale variabelen ondersteunen die worden ingesteld door awk:
ARGC Het aantal elementen in de ARGV matrix.
ARGV Een reeks opdrachtregelargumenten, exclusief opties en de programma argument,
genummerd van nul tot ARGC-1.
De argumenten binnen ARGV kan worden gewijzigd of aangevuld; ARGC kan worden gewijzigd. Zoals elke
invoerbestand eindigt, awk behandelt het volgende niet-nulelement van ARGV, op naar de
huidige waarde van ARGC−1, inclusief, als de naam van het volgende invoerbestand. Dus,
een element instellen ARGV nul betekent dat het niet als een
Invoer bestand. De naam '−' geeft de standaardinvoer aan. Als een argument overeenkomt
het formaat van een toewijzing operand, wordt dit argument behandeld als een
toewijzing In plaats van a filet argument.
CONVFMT De printf formaat voor het converteren van getallen naar tekenreeksen (behalve voor uitvoer
verklaringen, waar OFMT is gebruikt); "%.6g" standaard.
MILIEU Een array die de waarde van de omgeving vertegenwoordigt, zoals beschreven in de exec
functies gedefinieerd in het System Interfaces-volume van POSIX.1-2008. De indexen
van de array bestaan uit strings die bestaan uit de namen van de omgeving
variabelen, en de waarde van elk array-element zal een string zijn bestaande uit
de waarde van die variabele. Indien van toepassing zal de omgevingsvariabele zijn
beschouwd als een numerieke snaar (Zie Uitdrukkingen in awk); het array-element zal
hebben ook een numerieke waarde.
In alle gevallen waarin het gedrag van awk wordt beïnvloed door omgevingsvariabelen
(inclusief de omgeving van alle opdrachten die awk voert uit via de system
functie of via pijplijnomleidingen met de print verklaring, de printf
verklaring, of de getlijn functie), is de gebruikte omgeving de
omgeving destijds awk begon met uitvoeren; het is implementatiegedefinieerd
of er sprake is van een wijziging MILIEU heeft invloed op deze omgeving.
BESTANDSNAAM Een padnaam van het huidige invoerbestand. Binnen een BEGINNEN actie de waarde is
ongedefinieerd. Binnen een EINDE actie De waarde zal de naam zijn van de laatste invoer
bestand verwerkt.
FNR Het volgnummer van de huidige record in het huidige bestand. Binnen een BEGINNEN
actie zal de waarde nul zijn. Binnen een EINDE actie, de waarde is de
nummer van het laatst verwerkte record in het laatst verwerkte bestand.
FS Reguliere expressie als scheidingsteken voor invoervelden; A standaard.
NF Het aantal velden in de huidige record. Binnen een BEGINNEN actie, het gebruik van NF
is ongedefinieerd, tenzij a getlijn functioneren zonder een var betoog wordt uitgevoerd
eerder. Binnen een EINDE actie, NF behoudt de waarde die het voor het laatst had
record gelezen, tenzij een volgende, omgeleide, getlijn functioneren zonder een var
argument wordt uitgevoerd voordat het EINDE actie.
NR Het volgnummer van de huidige record vanaf het begin van de invoer. Binnen een
BEGINNEN actie zal de waarde nul zijn. Binnen een EINDE actie zal de waarde zijn
het nummer van de laatst verwerkte record.
OFMT De printf formaat voor het converteren van getallen naar strings in uitvoerinstructies (zie
uitgang verklaringen); "%.6g" standaard. Het resultaat van de conversie is
niet gespecificeerd als de waarde van OFMT is geen specificatie voor het drijvende-kommaformaat.
FSO De print instructie-uitvoerveldscheidingsteken; standaard.
ORS De print statement-uitvoer recordscheidingsteken; A standaard.
RLENGTE De lengte van de tekenreeks komt overeen met de match functie.
RS Het eerste teken van de tekenreekswaarde van RS zal het invoerrecord zijn
scheidingsteken; A standaard. Als RS bevat meer dan één teken, de
resultaten zijn niet gespecificeerd. Als RS nul is, worden records gescheiden door reeksen
bestaande uit een plus een of meer lege regels, voor- of achteraan
blanco regels mogen niet resulteren in lege records aan het begin of einde van de
invoer, en een moet altijd een veldscheidingsteken zijn, ongeacht het
waarde van FS hij precies is.
RSTART De startpositie van de string die overeenkomt met de match functie, nummering
vanaf 1. Deze is altijd gelijk aan de retourwaarde van de match
functie.
SUBSEP De subscript-scheidingstekenreeks voor multidimensionale arrays; de standaardwaarde
is implementatiegedefinieerd.
Normaal Uitdrukkingen
De awk utility zal gebruik maken van de uitgebreide reguliere expressie-notatie (zie de Base
Definities volume van POSIX.1‐2008, sectie 9.4, Extended Normaal Uitdrukkingen) behalve dat
het zal het gebruik van C-taalconventies toestaan voor het ontsnappen van speciale tekens binnenin
de ERE’s, zoals gespecificeerd in de tabel in het Base Definitions-volume van POSIX.1-2008,
Hoofdstuk 5, Dien in Formaat schrijfwijze ('\\', '\A', '\B', '\F', '\n', '\R', '\t', '\v') en de
volgende tabel; deze ontsnappingssequenties moeten zowel binnen als buiten worden herkend
haakje-uitdrukkingen. Houd er rekening mee dat records niet hoeven te worden gescheiden door karakters en
tekenreeksconstanten kunnen bevatten karakters, dus zelfs de "\n" reeks is geldig in
awk ERE's. Gebruik maken van een karakter binnen een ERE vereist de ontsnapping getoond in de
volgende tabel.
tafel 4-2: Ontsnappen Sequenties in awk
┌─────────┬───────────────────────────── ───────┬── ──────────────────────────────────┐
│ Ontsnappen │ │
│Volgorde │ BESCHRIJVING │ Betekenis │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\" │ │ karakter │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\/ │ │ karakter │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\ddd │ A teken gevolgd │ Het teken waarvan de codering │ is
│ │ door de langste reeks van één, │ weergegeven door de één, twee of │
│ │ twee of drie octale cijfers │ driecijferig octaal geheel getal. Multi- │
│ │ tekens (01234567). Als alle │ bytetekens meerdere tekens vereisen, │
│ │ de cijfers zijn 0 (dat wil zeggen, │ aaneengeschakelde ontsnappingsreeksen van │
│ │ vertegenwoordiging van de NUL │ dit type, inclusief de leidende │
│ │ karakter), het gedrag is │ voor elke byte. │
│ │ ongedefinieerd. │ │
├─────────┼───────────────────────────── ───────┼── ──────────────────────────────────┤
│\c │ EEN karakter gevolgd │ Ongedefinieerd │
│ │ door een teken dat niet is beschreven in │ │
│ │ deze tabel of in de tabel in de │ │
│ │ Basisdefinities volume van │ │
│ │ POSIX.1-2008, Hoofdstuk 5, Dien in │
│ Formaat schrijfwijze ('\\', '\A', '\B', │ │
│ '\F', '\n', '\R', '\t', '\v'). │
└─────────┴───────────────────────────── ───────┴── ──────────────────────────────────┘
Een reguliere expressie kan worden vergeleken met een specifiek veld of een specifieke tekenreeks door een van de volgende te gebruiken:
twee matchingoperatoren voor reguliere expressies, '~' en "!~". Deze operators zullen tolken
hun rechteroperand als reguliere expressie en hun linkeroperand als string.
Als de reguliere expressie overeenkomt met de tekenreeks, wordt de '~' expressie zal resulteren in een waarde
van 1, en de "!~" expressie zal resulteren in een waarde van 0. (De reguliere expressie
de matchingoperatie is zoals gedefinieerd door de term matched in het Basisdefinities-volume van
POSIX.1-2008, sectie 9.1, Normaal Expressie Definities, waar een match plaatsvindt op een willekeurige
deel van de tekenreeks, tenzij de reguliere expressie beperkt is tot de of
speciale tekens.) Als de reguliere expressie niet overeenkomt met de tekenreeks,
the '~' expressie zal resulteren in een waarde van 0, en de "!~" expressie zal evalueren
op een waarde van 1. Als de rechter operand een andere uitdrukking is dan het lexicale token
ERE, zal de tekenreekswaarde van de expressie worden geïnterpreteerd als een uitgebreide reguliere waarde
expressie, inclusief de hierboven beschreven ontsnappingsconventies. Merk op dat deze dezelfde ontsnapping
conventies zullen ook worden toegepast bij het bepalen van de waarde van een letterlijke tekenreeks (de
lexicale token STRING), en zal dus een tweede keer worden toegepast als een tekenreeks letterlijk is
in deze context gebruikt.
wanneer een ERE token verschijnt als een uitdrukking in elke andere context dan als de rechterhand van
the '~' or "!~" operator of als een van de ingebouwde functieargumenten die hieronder worden beschreven, the
waarde van de resulterende uitdrukking zal het equivalent zijn van:
$0 " " /Functies/
De Functies argument tegen de gsub, match, beneden functies, en de fs argument tegen de spleet
functie (zie Draad Functies) worden geïnterpreteerd als uitgebreide reguliere expressies.
Dit kunnen beide zijn ERE tokens of willekeurige uitdrukkingen, en zullen worden geïnterpreteerd in de
op dezelfde manier als de rechterkant van de '~' or "!~" operator.
Een uitgebreide reguliere expressie kan worden gebruikt om velden te scheiden door een string toe te wijzen
met de expressie voor de ingebouwde variabele FS, direct of als gevolg daarvan
van het gebruik van de F sepstring keuze. De standaardwaarde van de FS variabele moet enkelvoudig zijn
. Het volgende beschrijft FS gedrag:
1. Als FS een nulreeks is, is het gedrag niet gespecificeerd.
2. Als FS is een enkel teken:
A. Indien FS is , sla voor- en achteraan over En karakters;
velden worden begrensd door sets van een of meer of karakters.
B. Anders, als FS is een ander karakter c, worden de velden door elk gescheiden
enkel voorkomen van c.
3. Anders de tekenreekswaarde van FS wordt beschouwd als een uitgebreide reguliere
uitdrukking. Elke keer dat een reeks voorkomt die overeenkomt met de uitgebreide reguliere expressie
zal velden afbakenen.
Behalve de '~' en "!~" exploitanten, en in de gsub, match, spleeten beneden ingebouwd
functies zal ERE-matching gebaseerd zijn op invoerrecords; dat wil zeggen, recordscheidingsteken
tekens (het eerste teken van de waarde van de variabele RS, standaard)
kan niet in de expressie worden ingesloten en geen enkele expressie mag overeenkomen met het recordscheidingsteken
karakter. Als het recordscheidingsteken dat niet is , karakters ingebed in de
expressie kan worden gecombineerd. Voor de '~' en "!~" operators, en in die vier ingebouwde
functies zal ERE-matching gebaseerd zijn op tekstreeksen; dat wil zeggen, elk karakter (inclusief
en de recordscheidingsteken) kunnen in het patroon worden ingebed, en een passende
patroon moet overeenkomen met elk karakter. Echter, in totaal awk ERE-matching, het gebruik van één of
meer NUL-tekens in het patroon, de invoerrecord of de tekstreeks levert ongedefinieerd op
resultaten.
Patronen
A patroon is enig geldig uitdrukking, een bereik gespecificeerd door twee expressies gescheiden door a
komma, of een van de twee speciale patronen BEGINNEN or EINDE.
Speciaal Patronen
De awk nutsbedrijven zullen twee speciale patronen herkennen, BEGINNEN en EINDE. Elk BEGINNEN patroon
wordt één keer gematcht en de bijbehorende actie wordt uitgevoerd vóór de eerste record van invoer
wordt gelezen, behalve mogelijk door gebruik te maken van de getlijn functie (zie Input / Output en Snel naar
Functies) in een voorafgaande BEGINNEN actie – en voordat de opdrachtregeltoewijzing is voltooid. Elk EINDE
Het patroon wordt één keer gematcht en de bijbehorende actie wordt uitgevoerd na de laatste record van
invoer is gelezen. Deze twee patronen zullen bijbehorende acties hebben.
BEGINNEN en EINDE mag niet gecombineerd worden met andere patronen. Meerdere BEGINNEN en EINDE patronen zullen
toegestaan. De acties die verband houden met de BEGINNEN patronen worden in de bestelling uitgevoerd
gespecificeerd in het programma, evenals de EINDE acties. Een EINDE patroon kan voorafgaan aan a BEGINNEN
patroon in een programma.
Indien een awk programma bestaat alleen uit acties met het patroon BEGINNENEn BEGINNEN actie
bevat geen getlijn functie, awk zal afsluiten zonder de invoer te lezen wanneer de laatste
verklaring in de laatste BEGINNEN actie wordt uitgevoerd. Als een awk programma bestaat alleen uit acties
met het patroon EINDE of alleen acties met de patronen BEGINNEN en EINDE, zal de invoer zijn
lees vóór de uitspraken in de EINDE acties worden uitgevoerd.
Expressie Patronen
Een expressiepatroon moet worden geëvalueerd alsof het een expressie in een Booleaanse context is.
Als het resultaat waar is, wordt het patroon geacht overeen te komen, en de bijbehorende actie
(indien van toepassing) zal worden uitgevoerd. Als het resultaat onwaar is, wordt de actie niet uitgevoerd.
Patronen Ranges
Een patroonbereik bestaat uit twee uitdrukkingen, gescheiden door een komma; in dit geval de actie
wordt uitgevoerd voor alle records tussen een match van de eerste expressie en de
volgende overeenkomst van de tweede uitdrukking, inclusief. Op dit punt kan het patroonbereik
worden herhaald vanaf invoerrecords na het einde van het overeenkomende bereik.
Acties
Een actie is een reeks uitspraken zoals weergegeven in de grammatica in Grammatica. Elke single
statement kan worden vervangen door een statementlijst tussen accolades. De applicatie
zorgt ervoor dat verklaringen in een lijst met verklaringen worden gescheiden door of
karakters. Verklaringen in een lijst met verklaringen moeten opeenvolgend in de volgorde worden uitgevoerd
dat ze verschijnen.
De uitdrukking fungeert als voorwaarde in een if verklaring zal worden geëvalueerd en of dit het geval is
niet-nul of niet-null is, zal de volgende instructie worden uitgevoerd; anders, als anders is
aanwezig, de verklaring volgend op de anders zullen worden uitgevoerd.
De if, en, do...en, voor , brekenen voortzetten uitspraken zijn gebaseerd op de ISO C
standaard (zie sectie 1.1.2, Concepts Afgeleid vanaf the ISO C Standaard), behalve dat de
Booleaanse expressies worden behandeld zoals beschreven in Uitdrukkingen in awk, en behalve in de
sprake van:
voor (variabele in reeks)
die zal herhalen, waarbij elk wordt toegewezen index of reeks naar variabele in een niet gespecificeerde volgorde.
De resultaten van het toevoegen van nieuwe elementen aan reeks binnen zo'n voor lus zijn niet gedefinieerd. Als een
breken or voortzetten statement buiten een lus plaatsvindt, is het gedrag ongedefinieerd.
De verwijderen statement verwijdert een afzonderlijk array-element. Dus de volgende code
verwijdert een volledige array:
voor (inhoudsopgave in reeks)
verwijderen array[index]
De volgende statement zal ervoor zorgen dat alle verdere verwerking van het huidige invoerrecord plaatsvindt
verlaten. Het gedrag is ongedefinieerd als a volgende verklaring verschijnt of wordt aangeroepen in a BEGINNEN
or EINDE actie.
De afrit verklaring zal alles aanroepen EINDE acties in de volgorde waarin ze plaatsvinden in de
programmabron en beëindig het programma vervolgens zonder verdere invoer te lezen. Een afrit
verklaring binnen een EINDE actie zal het programma beëindigen zonder verdere uitvoering van
EINDE acties. Als een expressie is opgegeven in een afrit verklaring, zal de numerieke waarde ervan zijn
de uitgangsstatus zijn van awk, tenzij er daaropvolgende fouten optreden of een volgende afrit
statement met een expressie wordt uitgevoerd.
uitgang verklaringen
Beiden print en printf instructies worden standaard naar standaarduitvoer geschreven. Het resultaat
wordt geschreven naar de locatie die is opgegeven door uitvoer_omleiding als er een wordt geleverd, zoals
volgt:
> uitdrukking
>> uitdrukking
| uitdrukking
In alle gevallen is de uitdrukking wordt geëvalueerd om een string te produceren die wordt gebruikt als een
padnaam waarnaar moet worden geschreven (voor '>' or ">>") of als een uit te voeren commando (for '|').
Als u de eerste twee formulieren gebruikt, zal het bestand met die naam momenteel niet geopend zijn
geopend, indien nodig aangemaakt en met behulp van het eerste formulier het bestand ingekort. Het resultaat
wordt vervolgens aan het dossier toegevoegd. Zolang het bestand geopend blijft, komen volgende oproepen binnen
welke uitdrukking evalueert naar dezelfde stringwaarde, voegt eenvoudigweg de uitvoer toe aan de
bestand. Het bestand blijft geopend totdat de dichtbij functie (zie Input / Output en Snel naar
Functies) wordt aangeroepen met een expressie die resulteert in dezelfde tekenreekswaarde.
Het derde formulier schrijft uitvoer naar een stroom die naar de invoer van een commando wordt geleid. De
stream wordt aangemaakt als er momenteel geen stream open is met de waarde van uitdrukking als
opdrachtnaam. De gecreëerde stream zal gelijkwaardig zijn aan een stream die is gecreëerd door een aanroep naar de
openen() functie gedefinieerd in het System Interfaces-volume van POSIX.1-2008 met de waarde van
uitdrukking de commando argument en een waarde van w de mode argument. Zolang de
stream blijft open, volgende oproepen waarin uitdrukking evalueert naar dezelfde string
waarde schrijft uitvoer naar de bestaande stream. De beek blijft open tot de
dichtbij functie (zie Input / Output en Snel naar Functies) wordt aangeroepen met de uitdrukking that
evalueert naar dezelfde tekenreekswaarde. Op dat moment wordt de stroom afgesloten als bij a
bel naar de sluit() functie gedefinieerd in het System Interfaces-volume van POSIX.1-2008.
Zoals in detail beschreven door de grammatica in Grammatica, zullen deze uitvoerinstructies a aannemen
-gescheiden lijst van uitdrukkings waarnaar in de grammatica wordt verwezen door de niet-terminal
symbolen expr_lijst, print_expr_lijstof print_expr_list_opt. Naar deze lijst wordt hier verwezen
de uitdrukking lijst, en elk lid wordt een uitdrukking argument.
De print statement schrijft de waarde van elk expressieargument naar het aangegeven
uitvoerstroom gescheiden door het huidige uitvoerveldscheidingsteken (zie variabele FSO bovenstaand),
en beëindigd door het uitvoerrecordscheidingsteken (zie variabele ORS boven). Allemaal expressie
argumenten worden opgevat als tekenreeksen en worden indien nodig geconverteerd; deze conversie zal
zijn zoals beschreven in Uitdrukkingen in awk, met uitzondering dat de printf formaat in OFMT
wordt gebruikt in plaats van de waarde in CONVFMT. Een lege uitdrukkingslijst staat voor
het gehele invoerrecord ($0).
De printf statement zal uitvoer produceren op basis van een notatie die vergelijkbaar is met het bestandsformaat
Notatie die wordt gebruikt om bestandsformaten te beschrijven in dit deel van POSIX.1-2008 (zie de Base
Definities volume van POSIX.1‐2008, Hoofdstuk 5, Dien in Formaat schrijfwijze). Uitvoer moet zijn
geproduceerd zoals gespecificeerd bij de eerste uitdrukking argument als tekenreeks formaat en
volgend uitdrukking argumenten als tekenreeksen arg1 naar arg, inclusief, met het volgende
uitzonderingen:
1. De formaat zal een daadwerkelijke tekenreeks zijn in plaats van een grafische weergave.
Daarom kan het geen lege tekenposities bevatten. De in de formaat
string, in elke andere context dan a vlag van een conversiespecificatie, moet zijn
behandeld als een gewoon teken dat naar de uitvoer wordt gekopieerd.
2. Als de tekenset een '' karakter en dat karakter verschijnt in de formaat
string, zal het worden behandeld als een gewoon teken dat naar de uitvoer wordt gekopieerd.
3. De ontsnappen sequenties beginnend met een karakter wordt behandeld als
reeksen gewone tekens die naar de uitvoer worden gekopieerd. Merk op dat deze hetzelfde zijn
reeksen worden lexicaal geïnterpreteerd door awk wanneer ze in letterlijke tekenreeksen verschijnen,
maar zij zullen niet speciaal worden behandeld door de printf verklaring.
4. De veld- Breedte or precisie kan worden opgegeven als de '*' teken in plaats van een cijfer
snaar. In dit geval wordt het volgende argument uit de expressielijst opgehaald en
de numerieke waarde ervan wordt genomen als de veldbreedte of precisie.
5. De implementatie gaat niet vooraf aan of volgt niet op de output van de d or u Conversie
specificatietekens met tekens die niet zijn gespecificeerd door de formaat string.
6. De implementatie gaat niet vooraf aan de output van de o conversiespecificatieteken
met voorloopnullen die niet zijn gespecificeerd door de formaat string.
7. Voor de c conversiespecificatieteken: als het argument een numerieke waarde heeft, wordt de
teken waarvan de codering deze waarde is, wordt uitgevoerd. Of de waarde nul is of niet
Bij de codering van elk teken in de tekenset is het gedrag ongedefinieerd. Als de
argument heeft geen numerieke waarde; het eerste teken van de tekenreekswaarde moet dat wel doen
uitvoer zijn; als de string geen tekens bevat, is het gedrag ongedefinieerd.
8. Voor elke conversiespecificatie die een argument gebruikt, de volgende expressie
argument zal worden beoordeeld. Met uitzondering van de c conversiespecificatie
teken, wordt de waarde geconverteerd (volgens de regels gespecificeerd in
Uitdrukkingen in awk) naar het juiste type voor de conversiespecificatie.
9. Als er onvoldoende expressieargumenten zijn om aan alle conversies te voldoen
specificaties in de formaat string, het gedrag is niet gedefinieerd.
10. Als er een tekenreeks in de formaat tekenreeks begint met een '%' karakter, maar dat doet het wel
geen geldige conversiespecificatie vormen, is het gedrag niet gespecificeerd.
Beiden print en printf kan ten minste {LINE_MAX} bytes uitvoeren.
Functies
De awk taal heeft een verscheidenheid aan ingebouwde functies: rekenkunde, tekenreeks, invoer/uitvoer,
en algemeen.
Rekenkunde Functies
De rekenkundige functies, behalve int, zal gebaseerd zijn op de ISO C-norm (zie
sectie 1.1.2, Concepts Afgeleid vanaf the ISO C Standaard). Het gedrag is ongedefinieerd
gevallen waarin de ISO C-standaard specificeert dat er een fout wordt geretourneerd of dat het gedrag zich voordoet
ongedefinieerd. Hoewel de grammatica (zie Grammatica) maakt het mogelijk dat ingebouwde functies verschijnen met nr
argumenten of haakjes, tenzij het argument of de haakjes als optioneel zijn aangegeven in
de volgende lijst (door ze weer te geven in de "[]" haakjes), dergelijk gebruik is niet gedefinieerd.
atan2(y,x)
Retour boogtangens van y/x in radialen in het bereik [−π,π].
cos(x) Retourcosinus van x, Waar x staat in radialen.
zonde(x) Retour sinus van x, Waar x staat in radialen.
exp(x) Retourneert de exponentiële functie van x.
inloggen(x) Retourneert de natuurlijke logaritme van x.
vierkante meter(x) Retourneert de vierkantswortel van x.
int(x) Retourneert het argument afgekapt tot een geheel getal. De afknotting moet richting 0 zijn wanneer
x> 0.
rand() Retourneert een willekeurig getal n, zodat 0≤n
zand([uitdrukken])
Stel de startwaarde in voor rand naar uitdrukken of gebruik de tijd van de dag als uitdrukken is weggelaten.
De vorige startwaarde wordt geretourneerd.
Draad Functies
De stringfuncties in de volgende lijst worden ondersteund. Hoewel de grammatica (zie
Grammatica) staat toe dat ingebouwde functies verschijnen zonder argumenten of haakjes, tenzij de
argument of haakjes worden in de volgende lijst als optioneel aangegeven (door weer te geven
ze binnen de "[]" haakjes), dergelijk gebruik is niet gedefinieerd.
gsub(Functies, antwoord[, in])
Gedraag zoals beneden (zie hieronder), behalve dat het alle exemplaren van de
reguliere expressie (zoals de ed globale vervanger voor nutsvoorzieningen) in $0 of in de in
argument, indien gespecificeerd.
index(s, t)
Retourneer de positie, in tekens, genummerd vanaf 1, in tekenreeks s waar touwtje t
het eerst voorkomt, of nul als het helemaal niet voorkomt.
lengte[([s])]
Retourneert de lengte, in tekens, van het argument genomen als een string, of van de
hele record, $0, als er geen argument is.
match(s, Functies)
Retourneer de positie, in tekens, genummerd vanaf 1, in tekenreeks s waarbij de
uitgebreide reguliere expressie Functies voorkomt, of nul als het helemaal niet voorkomt.
RSTART wordt ingesteld op de startpositie (die hetzelfde is als de geretourneerde positie).
waarde), nul als er geen overeenkomst wordt gevonden; RLENGTH wordt ingesteld op de lengte van de
overeenkomende tekenreeks, −1 als er geen overeenkomst is gevonden.
spleet(s, a[, fs ])
Splits de tekenreeks s in array-elementen a[1], a[2], ..., a[n], En terugkomen n. Alle
elementen van de array moeten worden verwijderd voordat de splitsing wordt uitgevoerd. De
scheiding gebeurt met de ERE fs of met de veldscheider FS if fs is
niet gegeven. Elk array-element moet een tekenreekswaarde hebben wanneer het wordt gemaakt en, indien
van toepassing, zal het array-element worden beschouwd als een numerieke reeks (zie
Uitdrukkingen in awk). Het effect van een nultekenreeks als de waarde van fs is
niet gespecificeerd.
sprint(fmt, uitdrukken, uitdrukken, ...)
Formatteer de expressies volgens de printf formaat gegeven door fmt En terugkomen
de resulterende tekenreeks.
sub(Functies, antwoord[, in ])
Vervang de tekenreeks antwoord in plaats van de eerste instantie van de verlengde
reguliere expressie ERE op touw in en retourneer het aantal vervangingen. Een
('&') die in de tekenreeks voorkomen antwoord wordt vervangen door de string
vanaf in dat overeenkomt met de ERE. Een voorafgegaan door een zullen
als letterlijk worden geïnterpreteerd karakter. Een gebeurtenis van twee
opeenvolgend karakters worden geïnterpreteerd als slechts één letterlijke letter
karakter. Elke andere gebeurtenis van a (Bijvoorbeeld,
dat voorafgaat aan een ander teken) wordt als een letterlijk teken behandeld
karakter. Merk op dat als antwoord is een letterlijke tekenreeks (het lexicale token STRING; zien
Grammatica), de afhandeling van de karakter komt voor na elk lexicaal
verwerking, inclusief eventuele lexicale -escape-reeksverwerking. Als in
is gespecificeerd en het is geen lwaarde (zie Uitdrukkingen in awk), het gedrag is
ongedefinieerd. Als in wordt weggelaten, awk zal in plaats daarvan het huidige record ($0) gebruiken.
substr(s, m[, n ])
Geef het hoogstens terug n-tekenreeks van s dat begint bij positie m,
nummering vanaf 1. Als n wordt weggelaten, of als n specificeert meer tekens dan er zijn
links in de string, wordt de lengte van de substring beperkt door de lengte
van de string s.
verlagen(s)
Retourneert een tekenreeks op basis van de tekenreeks s. Elk personage erin s dat is een hoofdletter
brief gespecificeerd om een verlagen in kaart brengen door LC_CTYPE categorie van de
de huidige landinstelling moet in de geretourneerde tekenreeks worden vervangen door de kleine letter
gespecificeerd door de mapping. Andere karakters binnen s blijft ongewijzigd in de
geretourneerde tekenreeks.
toupeer(s)
Retourneert een tekenreeks op basis van de tekenreeks s. Elk personage erin s dat is een kleine letter
brief gespecificeerd om een toupeer in kaart brengen door LC_CTYPE categorie van de
huidige landinstelling wordt in de geretourneerde tekenreeks vervangen door de hoofdletter
gespecificeerd door de mapping. Andere karakters binnen s zijn onveranderd in de geretourneerde
string.
Alle voorgaande functies die nodig zijn ERE verwacht als parameter een patroon of een string
gewaardeerde expressie die een reguliere expressie is zoals gedefinieerd in Normaal Uitdrukkingen.
Input / Output en Snel naar Functies
De invoer/uitvoer en algemene functies zijn:
dichtbij(uitdrukking)
Sluit het bestand of de pipe geopend door a print or printf verklaring of een oproep naar
getlijn met dezelfde stringwaarde uitdrukking. De limiet op het aantal open
uitdrukking argumenten zijn implementatiegedefinieerd. Als de afsluiting succesvol was, werd de
functie retourneert nul; anders zal het niet-nul retourneren.
uitdrukking | getlijn [var]
Lees een invoerrecord van een stream die wordt doorgesluisd vanaf de uitvoer van een opdracht. De
stream wordt aangemaakt als er momenteel geen stream open is met de waarde van
uitdrukking als de opdrachtnaam. De gecreëerde stream moet gelijkwaardig zijn aan één
gemaakt door een oproep naar de openen() functie met de waarde van uitdrukking de
commando argument en een waarde van r de mode argument. Zolang de stroom
blijft open, volgende oproepen waarin uitdrukking evalueert naar dezelfde string
waarde zal volgende records uit de stream lezen. De stroom zal blijven
geopend tot de dichtbij functie wordt aangeroepen met een expressie die resulteert in de
dezelfde tekenreekswaarde. Op dat moment wordt de stream gesloten als bij een oproep naar
the sluit() functie. Als var wordt weggelaten, $0 en NF wordt ingesteld; anders, var
worden ingesteld en, indien van toepassing, worden beschouwd als een numerieke reeks (zie
Uitdrukkingen in awk).
De getlijn operator kan dubbelzinnige constructies vormen als die er zijn
operatoren zonder haakjes (inclusief aaneengeschakeld) links van de '|' (naar de
begin van de uitdrukking die bevat getlijn). In het kader van de '$'
exploitant, '|' zal zich gedragen alsof het een lagere prioriteit heeft dan '$' Het resultaat
van het beoordelen van andere exploitanten is niet gespecificeerd, en conforme aanvragen wel
Zet al dit soort gebruik op de juiste manier tussen haakjes.
getlijn Stel $0 in op het volgende invoerrecord uit het huidige invoerbestand. Deze vorm van
getlijn stelt de NF, NRen FNR variabelen.
getlijn var
Variabele instellen var naar het volgende invoerrecord uit het huidige invoerbestand en, indien
gepast, var wordt beschouwd als een numerieke reeks (zie Uitdrukkingen in awk).
Deze vorm van getlijn stelt de FNR en NR variabelen.
getlijn [var] < uitdrukking
Lees het volgende invoerrecord uit een benoemd bestand. De uitdrukking zal zijn
geëvalueerd om een tekenreeks te produceren die als padnaam wordt gebruikt. Als het bestand van dat
naam is momenteel niet geopend, deze zal worden geopend. Zolang de stroom maar blijft bestaan
open, daaropvolgende oproepen waarin uitdrukking evalueert naar dezelfde tekenreekswaarde
volgende records uit het bestand lezen. Het dossier blijft open tot
the dichtbij functie wordt aangeroepen met een expressie die hetzelfde oplevert
tekenreekswaarde. Als var wordt weggelaten, $0 en NF wordt ingesteld; anders, var zal zijn
ingesteld en, indien van toepassing, zal het worden beschouwd als een numerieke reeks (zie
Uitdrukkingen in awk).
De getlijn operator kan dubbelzinnige constructies vormen als die er zijn
binaire operatoren zonder haakjes (inclusief aaneengeschakeld) rechts van de '<'
(tot aan het einde van de expressie die de getlijn). Het resultaat van
Het evalueren van een dergelijke constructie is niet gespecificeerd, en overeenkomstige toepassingen wel
Zet al dit soort gebruik op de juiste manier tussen haakjes.
system(uitdrukking)
Voer het commando uit dat gegeven is door uitdrukking op een manier die gelijkwaardig is aan de system()
functie gedefinieerd in het System Interfaces-volume van POSIX.1-2008 en retourneer de
exit-status van de opdracht.
Alle vormen van getlijn retourneert 1 voor succesvolle invoer, nul voor end-of-file en −1 voor
een foutmelding.
Wanneer strings worden gebruikt als de naam van een bestand of pijplijn, zorgt de toepassing ervoor
dat de strings tekstueel identiek zijn. De terminologie ``dezelfde tekenreekswaarde'' impliceert dit
die ``equivalente strings'', zelfs diegene die alleen maar verschillen karakters, vertegenwoordigen
verschillende bestanden.
Gebruiker gedefinieerde Functies
De awk taal biedt ook door de gebruiker gedefinieerde functies. Dergelijke functies kunnen worden gedefinieerd als:
functie naam([parameter, ...]) { verklaringen }
Er kan overal in een functie naar een functie worden verwezen awk programma; in het bijzonder kan het gebruik ervan
gaat vooraf aan de definitie ervan. De reikwijdte van een functie is mondiaal.
Functieparameters kunnen, indien aanwezig, scalairen of arrays zijn; het gedrag is
ongedefinieerd als een arraynaam wordt doorgegeven als parameter die de functie als scalair gebruikt, of
als een scalaire expressie wordt doorgegeven als parameter die de functie als array gebruikt.
Functieparameters moeten worden doorgegeven op waarde als scalair en op verwijzing als de arraynaam.
Het aantal parameters in de functiedefinitie hoeft niet overeen te komen met het aantal
parameters in de functieaanroep. Overtollige formele parameters kunnen als lokale variabelen worden gebruikt.
Als er in een functieaanroep minder argumenten worden opgegeven dan in de functiedefinitie,
de extra parameters die in de functietekst als scalairen worden gebruikt, zullen resulteren in de
niet-geïnitialiseerde waarde totdat ze op een andere manier worden geïnitialiseerd, en de extra parameters die daarbij horen
worden gebruikt in de hoofdtekst van de functie, aangezien arrays worden behandeld als niet-geïnitialiseerde arrays waarbij
elk element evalueert naar de niet-geïnitialiseerde waarde totdat het anders wordt geïnitialiseerd.
Bij het aanroepen van een functie mag er geen witruimte tussen de functienaam en de
haakje openen. Functieaanroepen kunnen worden genest en er kunnen recursieve oproepen worden gedaan
functies. Bij terugkeer van een geneste of recursieve functieaanroep worden de waarden van alle
de parameters van de aanroepende functie blijven ongewijzigd, behalve de doorgegeven arrayparameters
door verwijzing. De terugkeer statement kan worden gebruikt om een waarde terug te geven. Als een terugkeer verklaring
buiten een functiedefinitie verschijnt, is het gedrag ongedefinieerd.
In de functiedefinitie wordt karakters zijn optioneel vóór de opening
beugel en na de sluitbeugel. Functiedefinities kunnen overal in het programma voorkomen
waar patroon-actie koppel is toegestaan.
Grammatica
De grammatica in deze sectie en de lexicale conventies in de volgende sectie zullen dat zijn
beschrijven samen de syntaxis voor awk programma's. De algemene conventies voor deze stijl van
grammatica wordt beschreven in sectie 1.3, Grammatica conventies. Een geldig programma kan zijn
weergegeven als het niet-terminale symbool programma in de grammatica. Deze formele syntaxis zal
hebben voorrang op de voorgaande tekstsyntaxisbeschrijving.
%teken NAAM NUMMER STRING ERE
%teken FUNC_NAME /* Naam gevolgd by '(' zonder wit ruimte. */
/* Trefwoorden */
%token Begin Einde
/* 'BEGIN' 'EINDE' */
%token Onderbreken Doorgaan Verwijderen Doe anders
/* 'onderbreken' 'doorgaan' 'verwijderen' 'doen' 'anders' */
%token Exit voor functie If In
/* 'exit' 'voor' 'functie' 'if' 'in' */
%token Volgende afdruk Afdrukkenf Terug Terwijl
/* 'volgende' 'print' 'printf' 'return' 'terwijl' */
/* Gereserveerde functienamen */
%token BUILTIN_FUNC_NAME
/* Eén token voor het volgende:
* atan2 cos sin exp log sqrt int rand srand
* gsub indexlengte match split sprintf sub
*onder-naar-boven-sluitsysteem
*/
%token GETLINE
/* Syntactisch anders dan andere ingebouwde programma's. */
/* Tokens van twee tekens. */
%token ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN POW_ASSIGN
/* '+=' '-=' '*=' '/=' '%=' '^=' */
%token OF EN NO_MATCH EQ LE GE NE INCR DECR APPEND
/* '||' '&&' '!~' '==' '<=' '>=' '!=' '++' '−−' '>>' */
/* Tokens van één teken. */
%token '{' '}' '(' ')' '[' ']' ',' ';' NIEUWE LIJN
%token '+' '-' '*' '%' '^' '!' '>' '<' '|' '?' ':' ' " " ' '$' '='
%programma starten
%%
programma: item_list
| actieloze_item_lijst
;
item_list: nieuwelijn_opt
| actionless_item_list item-terminator
| item_list item-terminator
| item_list actie-terminator
;
actionless_item_list: item_list patroonterminator
| actionless_item_list patroonterminator
;
item: patroonactie
| Functie NAAM '(' param_list_opt ')'
actie newline_opt
| Functie FUNC_NAME '(' param_list_opt ')'
actie newline_opt
;
param_list_opt: /* leeg */
| param_lijst
;
param_list : NAAM
| param_list ',' NAAM
;
patroon: Begin
| Einde
| uitdr
| expr ',' newline_opt expr
;
actie: '{' newline_opt '}'
| '{' newline_opt beëindigd_statement_list '}'
| '{' newline_opt niet-beëindigde_statement_list '}'
;
terminator: terminator ';'
| terminator NEWLINE
| ';'
| NIEUWE LIJN
;
beëindigde_verklaring_lijst: beëindigde_verklaring
| beëindigde_verklaring_lijst beëindigde_verklaring
;
niet-beëindigde_verklaring_lijst: niet-beëindigde_verklaring
| beëindigde_verklaring_lijst niet-beëindigde_verklaring
;
beëindigde_statement: actie newline_opt
| Als '(' expr ')' newline_opt beëindigd_statement
| Als '(' expr ')' newline_opt beëindigd_statement
Anders newline_opt beëindigd_statement
| Terwijl '(' expr ')' newline_opt beëindigd_statement
| Voor '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
beëindigde_verklaring
| Voor '(' NAAM In NAAM ')' newline_opt
beëindigde_verklaring
| ';' newline_opt
| terminatorable_statement NEWLINE newline_opt
| beëindigbare_verklaring ';' newline_opt
;
niet-beëindigde_verklaring: beëindigbare_verklaring
| If '(' expr ')' newline_opt unterminating_statement
| Als '(' expr ')' newline_opt beëindigd_statement
Anders newline_opt unterminating_statement
| Terwijl '(' expr ')' newline_opt unterminating_statement
| Voor '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
niet-beëindigde_verklaring
| Voor '(' NAAM In NAAM ')' newline_opt
niet-beëindigde_verklaring
;
beëindigbare_verklaring: eenvoudige_verklaring
| Pauze
| Doorgaan
| De volgende
| Expr_opt afsluiten
| Retourneer expr_opt
| Voer newline_opt beëindigd_statement uit terwijl '(' expr ')'
;
simple_statement_opt: /* leeg */
| eenvoudige_verklaring
;
simple_statement: NAAM '[' expr_list ']' verwijderen
| uitdr
| print_verklaring
;
print_statement : simpel_print_statement
| simple_print_statement output_redirection
;
simple_print_statement : Afdrukken print_expr_list_opt
| Afdrukken '(' meerdere_expr_lijst ')'
| Printf print_expr_lijst
| Printf '(' meerdere_expr_lijst ')'
;
output_redirection: '>' expr
| TOEVOEGEN uitdr
| '|' uitspr
;
expr_list_opt: /* leeg */
| expr_lijst
;
expr_lijst: expr
| meerdere_expr_lijst
;
multiple_expr_list: expr ',' newline_opt expr
| multiple_expr_list ',' newline_opt expr
;
expr_opt: /* leeg */
| uitdr
;
expr: unaire_expr
| niet-unaire_expr
;
unary_expr: '+' expr
| '-' uitdr
| unaire_expr '^' expr
| unary_expr '*' expr
| unary_expr '/' expr
| unary_expr '%' expr
| unary_expr '+' expr
| unary_expr '-' expr
| unaire_expr niet_unaire_expr
| unary_expr '<' expr
| unary_expr LE expr
| unary_expr NO expr
| unary_expr EQ expr
| unary_expr '>' expr
| unary_expr GE expr
| unaire_expr '~' expr
| unary_expr GEEN_MATCH expr
| unary_expr In NAAM
| unary_expr EN newline_opt expr
| unary_expr OF newline_opt expr
| unary_expr '?' expr ':' expr
| unaire_invoer_functie
;
non_unary_expr: '(' expr ')'
| '!' uitspr
| 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 niet_unary_expr
| non_unary_expr '<' expr
| non_unary_expr LE expr
| non_unary_expr NE expr
| non_unary_expr EQ expr
| non_unary_expr '>' expr
| non_unary_expr GE expr
| non_unary_expr '~' expr
| non_unary_expr NO_MATCH expr
| non_unary_expr In NAAM
| '('multiple_expr_list ')' In NAAM
| non_unary_expr EN newline_opt expr
| non_unary_expr OF newline_opt expr
| non_unary_expr '?' expr ':' expr
| NUMMER
| SNAAR
| waarde
| ERE
| Waarde INCR
| Waarde DECR
| INCR waarde
| DECR lwaarde
| lwaarde POW_ASSIGN expr
| lwaarde MOD_ASSIGN expr
| lwaarde MUL_ASSIGN expr
| lwaarde DIV_ASSIGN expr
| lwaarde ADD_ASSIGN expr
| lwaarde SUB_ASSIGN expr
| lwaarde '=' expr
| FUNC_NAME '(' expr_list_opt ')'
/* geen witruimte toegestaan vóór '(' */
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
| niet-unaire_invoerfunctie
;
print_expr_list_opt: /* leeg */
| print_expr_lijst
;
print_expr_lijst: print_expr
| print_expr_list ',' newline_opt print_expr
;
print_expr : unaire_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 niet_unary_print_expr
| unary_print_expr '~' print_expr
| unary_print_expr GEEN_MATCH print_expr
| unary_print_expr In NAAM
| unary_print_expr EN newline_opt print_expr
| unary_print_expr OF 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 GEEN_MATCH print_expr
| non_unary_print_expr In NAAM
| '('multiple_expr_list ')' In NAAM
| non_unary_print_expr EN newline_opt print_expr
| non_unary_print_expr OF newline_opt print_expr
| non_unary_print_expr '?' print_expr ':' print_expr
| NUMMER
| SNAAR
| waarde
| ERE
| Waarde INCR
| Waarde DECR
| INCR waarde
| DECR lwaarde
| lwaarde POW_ASSIGN print_expr
| lwaarde MOD_ASSIGN print_expr
| lwaarde MUL_ASSIGN print_expr
| lwaarde DIV_ASSIGN print_expr
| lwaarde ADD_ASSIGN print_expr
| lwaarde SUB_ASSIGN print_expr
| lwaarde '=' print_expr
| FUNC_NAME '(' expr_list_opt ')'
/* geen witruimte toegestaan vóór '(' */
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
;
lwaarde : NAAM
| NAAM '[' expr_list ']'
| '$' expr
;
non_unary_input_function: simple_get
| simple_get '<' expr
| non_unary_expr '|' simpel_get
;
unary_input_function: unary_expr '|' simpel_get
;
simple_get: GETLINE
| GETLINE lwaarde
;
newline_opt: /* leeg */
| newline_opt NEWLINE
;
Deze grammatica kent verschillende dubbelzinnigheden die als volgt moeten worden opgelost:
* Operatorprioriteit en associativiteit zullen zijn zoals beschreven in tafel 4-1, Uitdrukkingen
in Afnemende Voorrang in awk.
*In geval van onduidelijkheid, an anders wordt geassocieerd met het meest onmiddellijk voorafgaande
if dat zou de grammatica bevredigen.
*In sommige contexten kan a ('/') die wordt gebruikt om een ERE te omringen, kan ook de
operator van de divisie. Dit zal op zodanige wijze worden opgelost dat waar ook de verdeeldheid ontstaat
operator zou kunnen verschijnen, a wordt verondersteld de divisieoperator te zijn. (Er is geen
operator voor unaire delingen.)
Elke uitdrukking in een awk programma moet voldoen aan de voorrangs- en associativiteitsregels,
zelfs als dit niet nodig is om een onduidelijkheid op te lossen. Bijvoorbeeld omdat '$' is hoger
voorrang dan '++', de snaar "$x++−−" is geen geldige awk uitdrukking, ook al is dat zo
ondubbelzinnig ontleed door de grammatica als "$(x++)−−".
Een conventie die misschien niet duidelijk blijkt uit de formele grammatica is waar
karakters zijn acceptabel. Er zijn verschillende voor de hand liggende plaatsingen, zoals het beëindigen van een
verklaring, en een kan worden gebruikt om te ontsnappen tekens tussen elk
lexicale tokens. In aanvulling, karakters zonder karakters kunnen
volg een komma, een accolade open, een logische AND-operator ("&&"), logische OR-operator ("||"),
the do trefwoord, de anders trefwoord en het haakje sluiten van an if, voor of en
uitspraak. Bijvoorbeeld:
{ print $ 1,
$2 }
Lexicale conventies
De lexicale conventies voor awk programma's, met betrekking tot de voorgaande grammatica, zullen zijn
als volgt:
1. Behalve zoals aangegeven, awk herkent het langst mogelijke token- of scheidingstekenbegin
op een bepaald punt.
2. Een commentaar bestaat uit alle tekens die beginnen met de karakter
en beëindigd door, maar met uitsluiting van de volgende gebeurtenis van: . Opmerkingen zullen
hebben geen effect, behalve om lexicale tokens af te bakenen.
3. De wordt herkend als het token NIEUWE LIJN.
4. EEN teken onmiddellijk gevolgd door een zal geen effect hebben.
5. Het teken STRING vertegenwoordigt een stringconstante. Een stringconstante begint met
het personage '''. Binnen een stringconstante, a karakter zal zijn
wordt beschouwd als het begin van een ontsnappingsreeks zoals gespecificeerd in de tabel in de basis
Definities volume van POSIX.1‐2008, Hoofdstuk 5, Dien in Formaat schrijfwijze ('\\', '\A', '\B',
'\F', '\n', '\R', '\t', '\v'). Bovendien zijn de ontsnappingssequenties in tafel 4-2, Ontsnappen
Sequenties in awk zal worden erkend. A mag niet binnen een string voorkomen
constante. Een stringconstante wordt beëindigd door het eerste niet-geëscapede voorkomen van
het personage ''' na degene waarmee de tekenreeksconstante begint. De waarde van de
string is de reeks van alle tekens zonder escapetekens en escape-waarden
reeksen tussen, maar niet inclusief, de twee begrenzende gebieden ''' tekens.
6. Het teken ERE vertegenwoordigt een uitgebreide reguliere expressieconstante. Een ERE-constante
zal beginnen met de karakter. Binnen een ERE-constante geldt a
teken wordt geacht een ontsnappingsreeks te beginnen, zoals gespecificeerd in de tabel in
het volume Basisdefinities van POSIX.1‐2008, Hoofdstuk 5, Dien in Formaat schrijfwijze. in
Bovendien zijn de ontsnappingssequenties in tafel 4-2, Ontsnappen Sequenties in awk zal zijn
erkend. De aanvraag waarborgt dat a komt niet voor binnen een ERE
constante. Een ERE-constante wordt beëindigd door de eerste onontkoombare gebeurtenis van de
teken na het teken waarmee de ERE-constante begint. De uitgebreide reguliere
expressie vertegenwoordigd door de ERE-constante zal de reeks zijn van alle niet-ontsnapte
tekens en waarden van ontsnappingsreeksen tussen, maar niet inclusief, de twee
afbakenen karakters.
7. EEN heeft geen effect, behalve om lexicale tokens of daarbinnen af te bakenen STRING or
ERE tokens.
8. Het teken NUMMER vertegenwoordigt een numerieke constante. De vorm en numerieke waarde ervan zullen
hetzij gelijkwaardig zijn aan de decimaal-zwevende-constante token zoals gespecificeerd door de ISO C
standaard, of het is een reeks decimale cijfers en wordt geëvalueerd als een
gehele constante in decimalen. Bovendien kunnen implementaties numerieke constanten accepteren
met de vorm en numerieke waarde gelijk aan de hexadecimaal-constante en
hexadecimaal-zwevende-constante tokens zoals gespecificeerd door de ISO C-standaard.
Als de waarde te groot of te klein is om representatief te zijn (zie sectie 1.1.2,
Concepts Afgeleid vanaf the ISO C Standaard), is het gedrag niet gedefinieerd.
9. Een reeks onderstrepingstekens, cijfers en alfabetische tekens uit de draagbare tekenset
(zie het Base Definitions-volume van POSIX.1‐2008, sectie 6.1, Draagbaar Karakter
Zet de), beginnend met een of alfabetisch teken, wordt beschouwd als een
woord.
10. De volgende woorden zijn trefwoorden die als individuele tokens worden herkend; de
naam van het token is hetzelfde als het trefwoord:
BEGINNEN verwijderen EINDE functie in printf
breken do afrit getlijn volgende terugkeer
voortzetten anders voor if print en
11. De volgende woorden zijn namen van ingebouwde functies en worden herkend als de
teken BUILTIN_FUNC_NAME:
atan2 gsub inloggen spleet beneden toupeer
dichtbij index match sprint substr
cos int rand vierkante meter system
exp lengte zonde zand verlagen
De hierboven genoemde trefwoorden en namen van ingebouwde functies worden als gereserveerd beschouwd
woorden.
12. Het teken NAAM moet bestaan uit een woord dat geen trefwoord of een naam van een ingebouwd bestand is
functie en wordt niet onmiddellijk gevolgd (zonder scheidingstekens) door de '('
karakter.
13. Het teken FUNC_NAME zal bestaan uit een woord dat geen trefwoord is of een naam van een
ingebouwde functie, onmiddellijk gevolgd (zonder scheidingstekens) door de '(' karakter.
De '(' karakter mag niet worden opgenomen als onderdeel van het token.
14. De volgende reeksen van twee tekens worden herkend als de benoemde tokens:
┌───────────┬──────────┬────────────┬─── ───────┐
│Token Naam │ Volgorde │ Token Naam │ Volgorde │
├───────────┼──────────┼────────────┼─── ───────┤
│TOEVOEGEN_ASSIGN │ += │ GEEN MATCH │ !~ │
│SUB_ASSIGN │ −= │ EQ │ == │
│MUL_ASSIGN │ *= │ LE │ <= │
│DIV_ASSIGN │ /= │ GE │ >= │
│MOD_ASSIGN │ %= │ NE │ != │
│POW_ASSIGN │ ^= │ INCR │ ++ │
│OR │ || │ DECR │ −− │
│EN │ && │ APPEND │ >> │
└───────────┴──────────┴────────────┴─── ───────┘
15. De volgende afzonderlijke karakters worden herkend als tokens waarvan de namen de zijn
karakter:
{ } ( ) [ ] , ; + - * % ^ ! > < | ? : " " $ =
Er is een lexicale dubbelzinnigheid tussen het token ERE en de tokens '/' en DIV_ASSIGN.
Wanneer een invoerreeks begint met a karakter in elke syntactische context waarin de
teken '/' or DIV_ASSIGN kan verschijnen als het volgende token in een geldig programma, hoe langer dan ook
die twee tokens die kunnen worden herkend, zullen worden herkend. In elke andere syntactische zin
context waar het token ERE kan verschijnen als het volgende token in een geldig programma, het token
ERE zal worden erkend.
EXIT STATUS
De volgende exit-waarden worden geretourneerd:
0 Alle invoerbestanden zijn succesvol verwerkt.
>0 Er is een fout opgetreden.
De uitgangsstatus kan binnen het programma worden gewijzigd met behulp van een afrit expressie.
GEVOLGEN OF FOUTEN
Als er een is filet operand is opgegeven en het benoemde bestand is niet toegankelijk, awk zal a . schrijven
diagnostisch bericht naar standaardfout en beëindigen zonder enige verdere actie.
Als het programma dat is opgegeven door de programma operand of a profiel operand is geen
geldig awk programma (zoals gespecificeerd in de sectie UITGEBREIDE BESCHRIJVING), het gedrag is
ongedefinieerd.
De volgend secties zijn informatief.
TOEPASSING GEBRUIK
De index, lengte, matchen substr functies moeten niet worden verward met soortgelijke
functies in de ISO C-standaard; de awk versies gaan over karakters, terwijl de ISO C
standaard gaat over bytes.
Omdat de aaneenschakelingsbewerking wordt weergegeven door aangrenzende expressies in plaats van door een
expliciete operator, is het vaak nodig om haakjes te gebruiken om de juiste waarde af te dwingen
evaluatie prioriteit.
Voorbeelden
De awk programma dat op de opdrachtregel is opgegeven, kan het gemakkelijkst worden opgegeven binnen
aanhalingstekens (bijvoorbeeld 'programma') voor toepassingen die gebruikmaken van shomdat awk programma's vaak
tekens bevatten die speciaal zijn voor de shell, inclusief dubbele aanhalingstekens. In de gevallen
waar een awk programma tekens met enkele aanhalingstekens bevat, is dit meestal het gemakkelijkst op te geven
het grootste deel van het programma als tekenreeksen tussen enkele aanhalingstekens, aaneengeschakeld door de shell met aanhalingstekens
tekens met enkele aanhalingstekens. Bijvoorbeeld:
awk '/'\''/ { print "citaat:", $0 }'
drukt alle regels uit de standaardinvoer af die een enkel aanhalingsteken bevatten, voorafgegaan
with citeren:.
Hieronder volgen voorbeelden van eenvoudig awk programma's:
1. Schrijf naar de standaarduitvoer alle invoerregels waarvoor veld 3 groter is dan 5:
$3 > 5
2. Schrijf op elke tiende regel:
(NR % 10) == 0
3. Schrijf een regel met een subtekenreeks die overeenkomt met de reguliere expressie:
/(G|D)(2[0−9][[:alpha:]]*)/
4. Druk een willekeurige regel af met een subtekenreeks die a bevat 'G' or 'D', gevolgd door een reeks van
cijfers en karakters. In dit voorbeeld worden tekenklassen gebruikt cijfer en alpha bijpassende
taalonafhankelijke cijfers en alfabetische tekens:
/(G|D)([[:cijfer:][:alfa:]]*)/
5. Schrijf een regel waarin het tweede veld overeenkomt met de reguliere expressie en het vierde
veld niet:
$2 " " /xyz/ && $4 ! " " /xyz/
6. Schrijf een willekeurige regel waarin het tweede veld een bevat :
$2 " " /\\/
7. Schrijf een willekeurige regel waarin het tweede veld een bevat . Let daar op
-ontsnappingen worden tweemaal geïnterpreteerd; eenmaal in de lexicale verwerking van de string
en eenmaal bij het verwerken van de reguliere expressie:
$2 " " "\\\\"
8. Schrijf het tweede tot het laatste en het laatste veld op elke regel. Scheid de velden door a
:
{OFS=";afdrukken $(NF−1), $NF}
9. Schrijf het regelnummer en het aantal velden op elke regel. De drie snaren
die het regelnummer vertegenwoordigt, de en het aantal velden wordt samengevoegd
en die string wordt naar standaarduitvoer geschreven:
{afdrukken NR "" NF}
10. Schrijf regels langer dan 72 tekens:
lengte($0) > 72
11. Schrijf de eerste twee velden in omgekeerde volgorde, gescheiden door FSO:
{ print $ 2, $1 }
12. Hetzelfde, met invoervelden gescheiden door een of En karakters, of
beide:
BEGINNEN { FS = ",[ \t]*|[ \t]+" }
{ print $ 2, $1 }
13. Tel de eerste kolom op, print de som en het gemiddelde:
{s += $1 }
EINDE {afdrukken "som is ", s, " gemiddelde is", s/NR}
14. Schrijf velden in omgekeerde volgorde, één per regel (veel regels uit voor elke regel in):
{ voor (i = NF; i > 0; −−ik) print $i }
15. Schrijf alle regels tussen de strings begin en stoppen:
/begin/, /stoppen/
16. Schrijf alle regels waarvan het eerste veld verschilt van het vorige:
$1 != vorige { afdrukken; vorige = $1 }
17. Simuleren echo:
BEGINNEN {
voor (i = 1; i < ARGC; ++ ik)
printf("%s%s", ARGV[i], i==ARGC−1?"\n": ")
}
18. Schrijf de padvoorvoegsels in het PATH omgevingsvariabele, één per regel:
BEGINNEN {
n = spleet (OMGEVING["PAD"], pad, teken)
voor (i = 1; i <= n; ++ ik)
print pad[ik]
}
19. Als er een bestand is met de naam invoer met paginakoppen van het formulier: Pagina #
en een bestand met de naam programma dat bezit:
/Bladzijde/ { $2 = n++; }
{ print }
dan de opdrachtregel:
awk f programma n = 5 invoer
drukt het bestand af invoer, paginanummers invullen vanaf 5.
BEWEEGREDENEN
Deze beschrijving is gebaseerd op de nieuwe awk, ``nawk'', (zie het document waarnaar wordt verwezen De AWK
Programming Taal), dat een aantal nieuwe kenmerken in het historische introduceerde awk:
1. Nieuwe trefwoorden: verwijderen, do, functie, terugkeer
2. Nieuwe ingebouwde functies: atan2, dichtbij, cos, gsub, match, rand, zonde, zand, beneden, system
3. Nieuwe vooraf gedefinieerde variabelen: FNR, ARGC, ARGV, RSTART, RLENGTE, SUBSEP
4. Nieuwe expressieoperatoren: ?, :, ,, ^
5. De FS variabele en het derde argument voor spleet, nu behandeld als verlengd regulier
uitdrukkingen.
6. De prioriteit van de operator, gewijzigd om beter overeen te komen met de C-taal. Twee voorbeelden
van code die anders werken zijn:
en ( n /= 10 > 1) ...
if (!"wk" ~ /bwk/) ...
Er zijn verschillende functies toegevoegd op basis van nieuwere implementaties van awk:
* Meerdere exemplaren van f profiel zijn toegestaan.
* De nieuwe optie v opdracht.
* De nieuwe vooraf gedefinieerde variabele MILIEU.
* Nieuwe ingebouwde functies toupeer en verlagen.
* Er zijn meer opmaakmogelijkheden toegevoegd printf voldoen aan de ISO C-norm.
Het geheel awk De syntaxis is altijd gebaseerd geweest op de C-taal, met een paar functies uit
de shell-opdrachttaal en andere bronnen. Hierdoor is het niet helemaal
compatibel met elke andere taal, wat bij sommige gebruikers voor verwarring heeft gezorgd. Het is niet
de bedoeling van de standaardontwikkelaars om dergelijke problemen aan te pakken. Een paar relatief kleine
Er zijn wijzigingen aangebracht om de taal beter compatibel te maken met de ISO C-standaard; meest
van deze wijzigingen zijn gebaseerd op soortgelijke wijzigingen in recente implementaties, zoals beschreven
boven. Er zijn nog steeds verschillende C-taalconventies die niet in de taal staan awk. Een van de
opmerkelijke is de operator, die vaak wordt gebruikt om meerdere op te geven
uitdrukkingen in de C-taal voor stelling. Ook zijn er diverse plekken waar awk is
restrictiever dan de C-taal wat betreft het type expressie dat kan worden gebruikt
een gegeven context. Deze beperkingen zijn te wijten aan de verschillende functies die de awk taal
biedt wel.
Reguliere expressies in awk zijn enigszins uitgebreid van historische implementaties naar
maak ze tot een pure superset van uitgebreide reguliere expressies, zoals gedefinieerd door POSIX.1-2008 (zie
het volume Basisdefinities van POSIX.1‐2008, sectie 9.4, Extended Normaal Uitdrukkingen).
De belangrijkste uitbreidingen zijn internationaliseringskenmerken en intervaluitdrukkingen. Historisch
implementaties van awk al lang gesteund -escape-reeksen als uitbreiding op
uitgebreide reguliere expressies, en deze extensie is ondanks inconsistentie behouden gebleven
met andere nutsvoorzieningen. Het aantal ontsnappingsreeksen dat in beide uitgebreide reguliere reeksen wordt herkend
expressies en tekenreeksen variëren (in het algemeen toenemend met de tijd) tussen implementaties.
De door POSIX.1-2008 gespecificeerde set bevat de meeste sequenties waarvan bekend is dat ze door de populaire groep worden ondersteund
implementaties en volgens de ISO C-standaard. Er is één reeks die niet wordt ondersteund
hexadecimale waarde begint met '\X'. Hierdoor zouden waarden in meer termen kunnen worden uitgedrukt
dan 9 bits om binnen te gebruiken awk zoals in de ISO C-standaard. Omdat deze syntaxis
een niet-deterministische lengte heeft, staat het niet toe dat het volgende teken a is
hexadecimaal cijfer. Deze beperking kan in de C-taal worden verholpen door het gebruik van
aaneenschakeling van lexicale tekenreeksen. In de awk taal, aaneenschakeling zou ook een oplossing kunnen zijn
voor tekenreeksen, maar niet voor uitgebreide reguliere expressies (lexicale ERE-tokens of
tekenreeksen die dynamisch worden gebruikt als reguliere expressies). Vanwege deze beperking is de feature
is niet toegevoegd aan POSIX.1-2008.
Wanneer een stringvariabele wordt gebruikt in een context waarin normaal gesproken een uitgebreide reguliere expressie wordt gebruikt
verschijnt (waar het lexicale token ERE in de grammatica wordt gebruikt), bevat de string niet
de letterlijke karakters.
Sommige versies van awk laat de vorm toe:
func naam(argumenten, ... ) { verklaringen }
Dit is afgekeurd door de auteurs van de taal, die vroegen dat dit niet zo zou zijn
gespecificeerd.
Historische implementaties van awk een fout opleveren als a volgende statement wordt uitgevoerd in a
BEGINNEN actie en oorzaak awk beëindigen als a volgende statement wordt uitgevoerd in een EINDE actie.
Dit gedrag is niet gedocumenteerd en men geloofde ook niet dat dit nodig was
standaardiseer het.
De specificatie van conversies tussen string- en numerieke waarden is veel gedetailleerder
dan in de documentatie van historische implementaties of in de referenties De AWK
Programming Taal. Hoewel het meeste gedrag intuïtief is ontworpen, is de
details zijn nodig om compatibel gedrag van verschillende implementaties te garanderen. Dit
is vooral belangrijk in relationele expressies vanwege de typen operanden
bepalen of een string- of numerieke vergelijking wordt uitgevoerd. Vanuit het perspectief van een
applicatieontwikkelaar is het meestal voldoende om intuïtief gedrag te verwachten en te forceren
conversies (door nul toe te voegen of een null-tekenreeks aaneen te schakelen) wanneer het type expressie
sluit uiteraard niet aan bij wat nodig is. De bedoeling was om historisch te specificeren
praktijk in bijna alle gevallen. De enige uitzondering is dat, in historische implementaties,
variabelen en constanten behouden zowel tekenreeks- als numerieke waarden na hun oorspronkelijke waarde
wordt door elk gebruik omgezet. Dit betekent dat het verwijzen naar een variabele of constante kan hebben
onverwachte bijwerkingen. Bij historische implementaties geldt bijvoorbeeld het volgende
programma:
{
a = '+2'
b = 2
if (NR % 2)
c = a + b
if (a == b)
print "numeriek vergelijking"
anders
print "snaar vergelijking"
}
zou een numerieke vergelijking uitvoeren (en een numerieke vergelijking uitvoeren) voor elke oneven genummerde waarde
regel, maar voer een stringvergelijking (en uitvoerstringvergelijking) uit voor elke even-
genummerde lijn. POSIX.1-2008 zorgt ervoor dat vergelijkingen indien nodig numeriek zijn. Met
historische implementaties, het volgende programma:
BEGINNEN {
OFMT = "%e"
print 3.14
OFMT = "%F"
print 3.14
}
zou uitbrengen "3.140000e+00" twee keer, omdat in de tweede print verklaring van de constante
"3.14" zou een tekenreekswaarde uit de vorige conversie hebben. POSIX.1-2008 vereist dat
de uitvoer van de tweede print verklaring zijn "3.140000". Het gedrag van historisch
implementaties werden gezien als te onintuïtief en onvoorspelbaar.
Er werd op gewezen dat met de regels in vroege concepten het volgende script ontstond
zou niets afdrukken:
BEGINNEN {
j[1.5] = 1
OFMT = "%e"
print j[1.5]
}
Daarom een nieuwe variabele, CONVFMT, werd geïntroduceerd. De OFMT variabele is nu beperkt tot
die van invloed zijn op de uitvoerconversies van getallen naar tekenreeksen en CONVFMT wordt gebruikt voor intern
conversies, zoals vergelijkingen of array-indexering. De standaardwaarde is hetzelfde
voor OFMT, dus tenzij een programma verandert CONVFMT (wat geen enkel historisch programma zou doen), het
ontvangt het historische gedrag dat is gekoppeld aan interne tekenreeksconversies.
De POSIX awk lexicale en syntactische conventies worden formeler gespecificeerd dan in andere
bronnen. Opnieuw was het de bedoeling om de historische praktijk te specificeren. Eén conventie die dat wel kan
niet duidelijk zijn uit de formele grammatica zoals in andere verbale beschrijvingen is waar
karakters zijn acceptabel. Er zijn verschillende voor de hand liggende plaatsingen, zoals het beëindigen van een
verklaring, en een kan worden gebruikt om te ontsnappen tekens tussen elk
lexicale tokens. In aanvulling, karakters zonder karakters kunnen
volg een komma, een accolade open, een logische AND-operator ("&&"), een logische OR-operator
("||"), De do trefwoord, de anders trefwoord en het haakje sluiten van an if, voor of
en uitspraak. Bijvoorbeeld:
{ print $ 1,
$2 }
De eis dat: awk voeg een vervolg toe naar de programmaargumenttekst is to
vereenvoudig de grammatica, waardoor deze qua vorm overeenkomt met een tekstbestand. Er is geen mogelijkheid voor een
applicatie of testsuite om te bepalen of een letterlijke wordt toegevoegd of zo awk
doet gewoon alsof het zo is.
POSIX.1-2008 vereist verschillende wijzigingen ten opzichte van historische implementaties om te ondersteunen
internationalisering. Waarschijnlijk de meest subtiele hiervan is het gebruik van de komma
karakter, gedefinieerd door de LC_NUMERIC categorie van de landinstelling, in representaties van
getallen met drijvende komma. Dit landspecifieke teken wordt gebruikt bij het herkennen van numerieke tekens
invoer, bij het converteren tussen tekenreeksen en numerieke waarden, en bij het opmaken van uitvoer.
Ongeacht de locatie kan de teken (het decimaalteken van de
POSIX-landinstelling) is het decimaalteken dat wordt herkend tijdens de verwerking awk programma's
(inclusief toewijzingen in opdrachtregelargumenten). Dit is in wezen dezelfde conventie
zoals gebruikt in de ISO C-standaard. Het verschil is dat de C-taal de
plaats instellen() functie, waarmee een toepassing de landinstelling kan wijzigen. Daarom
-mogelijkheid begint een C-toepassing met uitvoeren terwijl de locale is ingesteld op de C-locale, en alleen
wordt uitgevoerd in de door de omgeving opgegeven landinstelling na een expliciete aanroep naar plaats instellen().
Het toevoegen van zo'n uitgebreide nieuwe functie aan de awk taal werd gezien als
ongepast voor POSIX.1-2008. Het is mogelijk om een awk programma expliciet in elk
gewenste landinstelling door de omgeving in de shell in te stellen.
Het ongedefinieerde gedrag dat voortkomt uit NUL's in uitgebreide reguliere expressies maakt toekomst mogelijk
extensies voor de GNU gapen programma om binaire gegevens te verwerken.
Het gedrag in het geval van ongeldig awk programma's (inclusief lexicale, syntactische en
semantische fouten) is niet gedefinieerd omdat het als te beperkend voor implementaties werd beschouwd
specificeren. In de meeste gevallen kan van dergelijke fouten worden verwacht dat ze een diagnostische en een niet-
nul exit-status. Sommige implementaties kunnen er echter voor kiezen om de taal op manieren uit te breiden
die gebruik maken van bepaalde ongeldige constructies. Andere ongeldige constructies kunnen in aanmerking worden genomen
een waarschuwing waard zijn, maar anderszins redelijk gedrag veroorzaken. Nog andere constructies
kan in sommige implementaties erg moeilijk te detecteren zijn. Ook verschillende uitvoeringen
kan een bepaalde fout detecteren tijdens een eerste parsering van het programma (voordat er een fout wordt gelezen).
invoerbestanden), terwijl anderen het kunnen detecteren bij het uitvoeren van het programma nadat ze er enkele hebben gelezen
invoer. Uitvoerders moeten zich ervan bewust zijn dat fouten zo vroeg mogelijk worden gediagnosticeerd
Het produceren van nuttige diagnostiek kan het debuggen van applicaties vergemakkelijken en zo een
implementatie bruikbaarder.
Het niet-gespecificeerde gedrag van het gebruik van meerdere tekens RS waarden is om een mogelijke toekomst mogelijk te maken
extensies gebaseerd op uitgebreide reguliere expressies die worden gebruikt voor recordscheidingstekens. Historisch
implementaties nemen het eerste teken van de string en negeren de andere.
Ongespecificeerd gedrag wanneer spleet(snaar,reeks, ) wordt gebruikt om een voorgestelde toekomst mogelijk te maken
extensie die een string opsplitst in een array van individuele karakters.
In de context van de getlijn functie, even goede argumenten voor verschillende prioriteiten
van de | en < operatoren kunnen worden gemaakt. De historische praktijk is dat:
getlijn < "A" "B"
wordt geparseerd als:
( getlijn < "A" ) "B"
hoewel velen zouden beweren dat het de bedoeling was dat het bestand ab gelezen moet worden. Echter:
getlijn < "x" + 1
parseert als:
getlijn < ( "x" + 1 )
Soortgelijke problemen doen zich voor bij de | versie getlijn, vooral in combinatie met $.
Bijvoorbeeld:
$"echo Hoi" | getlijn
(Deze situatie is vooral problematisch bij gebruik in een print verklaring, waarbij de
|getlijn een deel kan een omleiding zijn van de print.)
Aangezien dergelijke constructies in de meeste gevallen niet worden gebruikt (of in ieder geval niet mogen worden gebruikt) (omdat ze
een natuurlijke ambiguïteit hebben waarvoor geen conventionele analyse mogelijk is), de betekenis hiervan
constructies is expliciet niet gespecificeerd gemaakt. (Het effect is dat een conformerend
toepassing die het probleem tegenkomt, moet tussen haakjes staan om de dubbelzinnigheid op te lossen.) Daar
Er leken weinig of geen daadwerkelijke toepassingen van dergelijke constructies te zijn.
Er kunnen grammatica's worden geschreven die onder deze omstandigheden tot fouten zouden leiden. Waar
achterwaartse compatibiliteit is geen grote overweging; implementeerders willen daar misschien gebruik van maken
grammatica's.
Bij sommige historische implementaties konden sommige ingebouwde functies zonder worden aangeroepen
een argumentenlijst, waarbij het resultaat een standaardargumentenlijst is, gekozen in een aantal ``redelijke''
manier. Gebruik van lengte als synoniem voor lengte($0) is de enige van deze vormen die dat wel is
vermoedelijk algemeen bekend of algemeen gebruikt; deze specifieke vorm is gedocumenteerd in verschillende
plaatsen (bijvoorbeeld de meeste historische awk referentiepagina's, hoewel niet in de referentiepagina's
De AWK Programming Taal) als legitieme praktijk. Met deze uitzondering: standaard
Argumentenlijsten zijn altijd ongedocumenteerd en vaag gedefinieerd geweest, en dat is helemaal niet het geval
duidelijk hoe (en of) ze moeten worden gegeneraliseerd naar door de gebruiker gedefinieerde functies. Ze voegen niets nuttigs toe
functionaliteit en sluit mogelijke toekomstige uitbreidingen uit die mogelijk functies moeten benoemen
zonder ze te bellen. Het niet standaardiseren ervan lijkt de eenvoudigste weg. De standaard
ontwikkelaars hebben daar rekening mee gehouden lengte verdiende echter een speciale behandeling, omdat het dat al was
gedocumenteerd in het verleden en wordt mogelijk substantieel gebruikt in historische programma's.
Dienovereenkomstig is dit gebruik legitiem gemaakt, maar in nummer 5 is het verouderde verwijderd
markering voor XSI-conforme implementaties en vele anderszins conforme toepassingen
afhankelijk van deze functie.
In beneden en gsub, als antwoord is een letterlijke tekenreeks (het lexicale token STRING), en vervolgens twee
opeenvolgend tekens moeten in de string worden gebruikt om een single te garanderen
zal voorafgaan aan de wanneer de resulterende string wordt doorgegeven aan de
functie. (Als u bijvoorbeeld één letterlijke waarde wilt opgeven in de vervangende string, gebruik
gsub(ERE, "\\&")).
Historisch gezien was dit het enige speciale personage in de antwoord argument van beneden en gsub snaar
functies was de ('&') teken en laat het voorafgaan door het
karakter werd gebruikt om de speciale betekenis ervan uit te schakelen.
De beschrijving in de ISO POSIX-2:1993-standaard introduceerde gedrag zodanig dat de
karakter was een ander speciaal karakter en het was niet gespecificeerd of dat er was
waren er nog andere speciale karakters. Deze beschrijving introduceerde verschillende draagbaarheid
problemen, waarvan sommige hieronder worden beschreven, en daarom is het vervangen door meer
historische beschrijving. Enkele van de problemen zijn onder meer:
* Historisch gezien kon een script een script gebruiken om de vervangende tekenreeks te maken gsub(ERE, "\\&"),
maar met de standaardformulering ISO POSIX-2:1993 was het noodzakelijk om deze te gebruiken gsub(ERE,
"\\\\&"). De tekens worden hier verdubbeld omdat alle letterlijke tekenreeksen dat zijn
onderworpen aan lexicale analyse, waardoor elk paar zou worden verminderd karakters aan
een voordat er aan wordt doorgegeven gsub.
* Omdat niet gespecificeerd was wat de speciale karakters waren, voor draagbare scripts
garanderen dat tekens letterlijk worden afgedrukt, elk teken moest worden voorafgegaan
met een . (Er moest bijvoorbeeld een draagbaar script worden gebruikt gsub(ERE, "\\Hoi") Om
maak een vervangende string van "Hoi".)
De beschrijving voor vergelijkingen in de ISO POSIX-2:1993-standaard beschrijft niet goed
historische praktijk vanwege de manier waarop numerieke reeksen als getallen worden vergeleken. De
huidige regels veroorzaken de volgende code:
if (0 == "000")
print "vreemd, maar WAAR"
anders
print "niet WAAR"
om een numerieke vergelijking uit te voeren, waardoor de if slagen. Het moet intuïtief duidelijk zijn
dat dit onjuist gedrag is, en inderdaad geen historische implementatie ervan awk werkelijk
gedraagt zich op deze manier.
Om dit probleem op te lossen, is de definitie van numerieke snaar werd uitgebreid om alleen deze op te nemen
waarden verkregen uit specifieke omstandigheden (meestal externe bronnen) waar dit niet het geval is
Het is mogelijk om ondubbelzinnig te bepalen of de waarde bedoeld is als string of als a
numeriek.
Variabelen die aan een numerieke string zijn toegewezen, worden ook als een numerieke string behandeld.
(Het idee van een numerieke reeks kan bijvoorbeeld over toewijzingen worden verspreid.) In
vergelijkingen moeten alle variabelen met de niet-geïnitialiseerde waarde als numeriek worden behandeld
operand die evalueert tot de numerieke waarde nul.
Niet-geïnitialiseerde variabelen omvatten alle soorten variabelen, inclusief scalairen, array-elementen,
en velden. De definitie van een niet-geïnitialiseerde waarde in Variabelen en Speciaal Variabelen is
nodig om de waarde te beschrijven die wordt geplaatst op niet-geïnitialiseerde variabelen en op velden die dat wel zijn
geldig (bijvoorbeeld < $ NF) maar bevatten geen karakters en om te beschrijven hoe deze
Bij vergelijkingen moeten variabelen worden gebruikt. Een geldig veld, zoals $1, dat geen karakters heeft
daarin kan worden verkregen uit een invoerregel van "\t\t" wanneer FS='\t'. Historisch gezien is de
vergelijking ($110) werd na evaluatie numeriek uitgevoerd $1 naar de waarde nul.
De zinsnede ``... zal ook de numerieke waarde van de numerieke reeks'' hebben, is verwijderd
uit verschillende secties van de ISO POSIX-2:1993-standaard omdat deze een onnodige specificeert
uitvoeringsdetail. Het is niet nodig dat POSIX.1‐2008 specificeert dat deze objecten
twee verschillende waarden toegewezen krijgen. Het is alleen nodig om te specificeren dat deze objecten dat wel mogen
evalueren naar twee verschillende waarden, afhankelijk van de context.
Historische implementaties van awk heeft geen hexadecimale gehele getallen of zwevende constanten ontleed
als "0xa" en "0xap0". Vanwege een vergissing zijn de edities van 2001 tot en met 2004 hiervan verschenen
standaard vereiste ondersteuning voor hexadecimale zwevende constanten. Dit kwam door de
verwijzing naar op(). Deze versie van de standaard staat dit toe, maar vereist dit niet
implementaties te gebruiken op() en bevat een beschrijving van hoe getallen met drijvende komma zijn
erkend als een alternatief om historisch gedrag te evenaren. De bedoeling van deze wijziging is om
zorgen ervoor dat implementaties drijvende-kommaconstanten kunnen herkennen op basis van de
ISO/IEC 9899:1990-norm of ISO/IEC 9899:1999-norm, en toestaan (maar niet vereisen)
implementaties om hexadecimale gehele constanten te herkennen.
Historische implementaties van awk ondersteunde geen drijvende-komma-oneindigheden en NaN's in
numerieke strings; bijv. "-INF" en "NaN". Echter, implementaties die gebruik maken van de op() of
strtod() functies om de conversie uit te voeren, kregen ondersteuning voor deze waarden als ze a gebruikten
ISO/IEC 9899:1999 standaardversie van de functie in plaats van een ISO/IEC 9899:1990-standaard
versie. Vanwege een vergissing deden de edities van 2001 tot en met 2004 dit niet
ondersteuning voor oneindigheden en NaN's toestaan, maar in deze herziening is ondersteuning toegestaan (maar niet
vereist). Dit is een stille verandering in het gedrag van awk programma's; bijvoorbeeld in de
POSIX localiseert de expressie:
("-INF" + 0 < 0)
had voorheen de waarde 0 omdat "-INF" omgezet naar 0, maar nu kan het de waarde 0 of hebben
1.
TOEKOMST ROUTEBESCHRIJVING
Geen.
Gebruik awkposix online met behulp van onworks.net-services