Awk

Från Wiki.linux.se
Version från den 13 maj 2023 kl. 11.50 av Admin (diskussion | bidrag)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

NAMN

mawk - mönsterskanning och textbearbetningsspråk

SYNOPSIS

mawk [-W alternativ] [-F värde] [-v var=värde] [--] 'program text' [fil ...]

mawk [-W alternativ] [-F värde] [-v var=värde] [-f program-fil] [--] [fil ...]

BESKRIVNING

mawk är en tolk för programmeringsspråket AWK. AWK-språket är användbart för manipulering av datafiler, texthämtning och bearbetning,och för prototyper och experimenterande med algoritmer. mawk är en ny awk vilket betyder att den implementerar AWK-språket som definierats i Aho, ernighan och  Weinberger, The AWK Programming Language, Addison-Wesley Publishing, 1988 (hädanefter kallad AWK-boken.) mawk överensstämmer med POSIX  1003.2 (utkast 11.3) definition av AWK-språket som innehåller några funktioner som inte beskrivs i AWK-boken, och mawk tillhandahåller ett litet antal förlängningar. Ett AWK-program är en sekvens av mönster {action}-par och funktionsdefinitioner. Korta program skrivs in på kommandoraden som vanligtvis är innesluten i   ' ' för att undvika skaltolkning. Längre program kan läsas in från en fil med alternativet -f. Datainmatning läses från listan över filer på  kommandoraden eller från standardinmatning när listan är tom. Inmatningen delas upp i poster som bestäms av postseparatorvariabeln, RS. Inledningsvis är RS = "\n" och poster är synonyma med linjer. Varje post jämförs mot varje mönster och om det stämmer överens, programtexten  för {action} exekveras.

ALTERNATIV

-F värde ställer in fältseparatorn, FS, till värde.

-f fil  Programtext läses från filen istället för från kommandoraden. Flera -f-alternativ är tillåtna.

-v var=värde  tilldelar värde till programvariabel var.

Alternativen ovan kommer att vara tillgängliga med alla POSIX-kompatibla implementeringar av AWK. Implementeringsspecifika alternativ inleds med -W. mawk tillhandahåller dessa:

--    indikerar det entydiga slutet av alternativen.

       -W dump   skriver en assembler-liknande lista över programmets interna representation till stdout och avslutar 0 (vid framgångsrik kompilering).

       -W exec file Programtext läses från fil och detta är det sista alternativet.

Detta är ett användbart alternativ till -f på system som stöder #! "magiskt nummer"-konvention för körbara skript. De  implicerade

skicka in sökvägen till själva skriptet som den sista parametern och förvänta dig inte mer än ett "-"-alternativ på #! linje. Därför att

mawk kan kombinera flera -W-alternativ separerade med kommatecken, du kan använda det här alternativet när ett extra -W-alternativ behövs.

-W help skriver ut ett användningsmeddelande till stderr och avslutar (samma som "-W usage").      

-W interactive ställer in obuffrad skrivning till stdout och linjebuffrad läsning från stdin. Poster från stdin är linjer oavsett värdet på RS.

-W posix_space tvingar mawk att inte betrakta '\n' som utrymme.

-W random=num anropar srand med den givna parametern (och åsidosätter beteendet för automatisk seeding).

-W sprintf=num justerar storleken på mawks interna sprintf-buffert till antal byte. Mer än sällsynt användning av det här alternativet indikerar att mawk bör kompileras om.

-W usage      skriver ut ett användningsmeddelande till stderr och avslutar (samma som "-W help").

-W version     mawk skriver sin version och upphovsrätt till stdout och kompilerade gränser till stderr och avslutar 0.

mawk accepterar förkortningar för något av dessa alternativ, t.ex. "-W v" och "-Wv" säger båda till mawk att visa sin version.

mawk 

DET AWK SPRÅKET

    1. Programstruktur

        Ett AWK-program är en sekvens av mönster {action}-par och användarfunktionsdefinitioner.

        Ett mönster kan vara:

             BÖRJA

             SLUTET

             uttryck

             uttryck, uttryck

En, men inte båda, av mönster {action} kan utelämnas. Om {action} utelämnas är det implicit { print }. Om mönstret utelämnas är det im‐

uttryckligen matchade. BEGIN- och END-mönster kräver en åtgärd.

Uttalandet avslutas med nya rader, semikolon eller båda. Grupper av satser som åtgärder eller loopkroppar blockeras via { ... } som i C.

Den sista satsen i ett block behöver ingen terminator. Tomma linjer har ingen betydelse; en tom sats avslutas med semikolon. Lång uttalanden kan fortsätta med ett snedstreck, \. Ett uttalande kan brytas utan ett snedstreck efter kommatecken, vänster klammerparentes, &&, ||, gör, annars, höger parentes för en if, while eller for-sats, och höger parentes för en funktionsdefinition. En kommentar börjar med # och sträcker sig till, men inkluderar inte slutet av raden.


Följande satser styr programflödet inuti block.

if ( expr ) påstående

if ( expr ) påstående else påstående

while ( expr ) påstående

do påstående while ( expr )

for ( opt_expr ; opt_expr ; opt_expr ) påstående

for ( var in array ) påstående

continue

break

2. Datatyper, konvertering och jämförelse

Det finns två grundläggande datatyper, numerisk och sträng. Numeriska konstanter kan vara heltal som -2, decimal som 1,08 eller i vetenskaplig notation som -1.1e4 eller .28E-3. Alla tal representeras internt och alla beräkningar görs i float‐ing-punktsaritmetik.

Så till exempel är uttrycket 0.2e2 == 20 sant och sant representeras som 1.0. Strängkonstanter omges av dubbla citattecken. "Detta är en sträng med en nyrad i slutet.\n" Strängar kan fortsätta över en linje genom att escape (\) den nya raden. Följande flyktsekvenser känns igen.


Strängkonstanter omges av dubbla citattecken.

"Detta är en sträng med en nyrad i slutet.\n"

       Strängar kan fortsätta över en linje genom att escape (\) den nya raden. Följande flyktsekvenser känns igen.

            \\ \

            \" "

            \a alert, ascii 7

            \b backsteg, ascii 8

            \t tab, ascii 9

            \n nyrad, ascii 10

            \v vertikal flik, ascii 11

            \f formfeed, ascii 12

            \r vagnretur, ascii 13

            \ddd 1, 2 eller 3 oktala siffror för ascii ddd

            \xhh 1 eller 2 hexadecimala siffror för ascii hh

 Om du escape någon annan karaktär \c, får du \c, d.v.s. mawk ignorerar escape.

Det finns egentligen tre grundläggande datatyper; den tredje är nummer och sträng som har både ett numeriskt värde och ett strängvärde på samma gång. Användardefinierade variabler uppstår när de först refereras och initieras till null, ett tal och strängvärde som har numeriskt värde 0 och strängvärde "". Icke-trivialt antal och strängtypade data kommer från indata och lagras vanligtvis i fält. (Se avsnitt 4).

Strängkonstanter omges av dubbla citattecken.

"Detta är en sträng med en nyrad i slutet.\n"

Strängar kan fortsätta över en linje genom att escape (\) den nya raden. Följande flyktsekvenser känns igen.

 \\ \

 \" "

 \a alert, ascii 7

 \b backsteg, ascii 8

 \t tab, ascii 9

\n nyrad, ascii 10

 \v vertikal flik, ascii 11

 \f formfeed, ascii 12

 \r vagnretur, ascii 13

 \ddd 1, 2 eller 3 oktala siffror för ascii ddd

  \xhh 1 eller 2 hexadecimala siffror för ascii hh

  Om du escape någon annan karaktär \c, får du \c, d.v.s. mawk ignorerar flykt. Det finns egentligen tre grundläggande datatyper; den tredje är nummer och sträng som har både ett numeriskt värde och ett strängvärde på samma gång. Användardefinierade variabler uppstår när de först refereras och initieras till null, ett ta och strängvärde som har numeriskt värde 0 och strängvärde "". Icke-trivialt antal och strängtypade data kommer från indata och lagras allmänt i fält. (Se avsnitt 4).

3. Vanliga uttryck

        I AWK-språket testas ofta poster, fält och strängar för att matcha ett reguljärt uttryck. Reguljära uttryck bifogas

        i snedstreck, och

             expr ~ /r/

är ett AWK-uttryck som utvärderas till 1 om expr "matchar" r, vilket betyder att en delsträng av expr finns i uppsättningen strängar som definieras av r.  Utan matchning evalueras uttrycket till 0; ersätter ~ med operatorn "matchar inte", !~ , vänder innebörden. Som mönsterhandling par,

/r/ { action } och $0 ~ /r/ { action }

är desamma, och för varje indatapost som matchar r, exekveras åtgärd. Faktum är att /r/ är ett AWK-uttryck som motsvarar ($0 ~ /r/) var som helst utom när på höger sida av en matchningsoperator eller skickas som ett argument till en inbyggd funktion som förväntar sig en reguljära uttrycksargument.

AWK använder utökade reguljära uttryck som med alternativet -E för grep(1). De reguljära uttryckets metatecken, dvs de med special betydelse i reguljära uttryck är

             \ ^ $ . [ ] | ( ) * + ?

        Reguljära uttryck byggs upp av tecken enligt följande:

             c matchar alla icke-metatecken c.

             \c matchar ett tecken som definieras av samma escape-sekvenser som används i strängkonstanter eller det bokstavliga tecknet c om \c är inte en flyktsekvens.

             . matchar alla tecken (inklusive nyrad).

             ^ matchar framsidan av en sträng.

             $ matchar baksidan av en sträng.

             [c1c2c3...] matchar alla tecken i klassen c1c2c3... . Ett teckenintervall betecknas c1-c2 i en klass [...].

[^c1c2c3...] matchar alla tecken som inte ingår i klassen c1c2c3...

        Reguljära uttryck byggs upp från andra reguljära uttryck enligt följande:

             r1r2 matchar r1 följt omedelbart av r2 (konkatenering).

             r1 | r2 matchar r1 eller r2 (alternering).

             r* matchar r som upprepas noll eller fler gånger.

             r+ matchar r som upprepas en eller flera gånger.

             r? matchar r noll eller en gång.

             (r) matchar r, tillhandahåller gruppering.

        Operatörernas ökande företräde är alternering, sammanlänkning och unär (*, + eller ?).

        Till exempel,

             /^[_a-zA-Z][_a-zA-Z0-9]*$/ och

             /^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$ /

        matchas av AWK-identifierare respektive AWK-numeriska konstanter. Anteckna det "." måste undvikas för att identifieras som en decimal

        punkt, och att metatecken inte är speciella inuti karaktärsklasser.

        Vilket uttryck som helst kan användas på höger sida om operatorerna ~ eller !~ eller skickas till en inbyggd som förväntar sig ett reguljärt uttryck.

        Om det behövs konverteras det till sträng och tolkas sedan som ett reguljärt uttryck. Till exempel,

             BEGIN { identifier = "[_a-zA-Z][_a-zA-Z0-9]*" }

             $0 ~ "^" identifierare

        skriver ut alla rader som börjar med en AWK-identifierare.

mawk känner igen det tomma reguljära uttrycket, //, som matchar den tomma strängen och därför matchas av valfri sträng framtill, baktill och mellan varje karaktär. Till exempel,

             echo abc | mawk { gsub(//, "X"); print }

             XaXbXcX