AWK

AWK
Alfred Aho , Brian Kernighan og Peter J. Weinberger
bell labs
Generell informasjon
Paradigme Hendelsesdrevet programmering , imperativ programmering
Dukket opp i 1977, siste revisjon 1985, gjeldende POSIX-versjon er IEEE Std 1003.1-2004
Designet av Alfred A ho , Peter Weinberger og Brian Kernighan _ _
type system svak, dynamisk
implementeringer awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (kompilator), Awka (kompilator)
dialekter old awk oawk 1977, new awk nawk 1985, GNU Awk
påvirket av C , Bourne shell , SNOBOL
har påvirket Perl , Korn shell ( ksh93 , dtksh , tksh ), JavaScript
Operativsystem Multiplattform

AWK er et programmeringsspråk designet for å behandle tekstbaserte data, det være seg filer eller datastrømmer. Navnet AWK stammer fra initialene til etternavnene til forfatterne : Alfred Aho , Peter Weinberger og Brian Kernighan . awk , når det er skrevet med små bokstaver, refererer til Unix- eller Plan 9 - programmet som tolker programmer skrevet i AWK - programmeringsspråket .

AWK er et eksempel på et programmeringsspråk som gjør omfattende bruk av den assosiative listedatatypen (det vil si lister indeksert av nøkkelstrenger) og regulære uttrykk . Kraften, kortheten og begrensningene til AWK-programmer og sed - manus inspirerte Larry Wall til å skrive Perl . På grunn av deres tette notasjon, brukes alle disse språkene ofte til å skrive programmer med én linje .

AWK var et av de første verktøyene som dukket opp på Unix (i versjon 3) og ble populær som en måte å legge til funksjonalitet til Unix- rør . Implementeringen av en eller annen versjon av AWK-språket er standard på nesten alle moderne Unix-lignende operativsystemer . AWK er oppført i Single UNIX-spesifikasjonen som et av de nødvendige verktøyene for hvert Unix -operativsystem . AWK-implementeringer kan installeres på nesten alle andre operativsystemer.

Struktur av AWK-programmer

Generelt sett gis AWK to deler av data: en kommandofil og en primær inndatafil. En kommandofil (som kan være en ekte fil, eller kan inkluderes i kommandolinjepåkallelsen til AWK ) inneholder en rekke kommandoer som forteller AWK hvordan inndatafilen skal behandles. Den primære inndatafilen er normalt tekstformatert på en eller annen måte; det kan være i en ekte fil, eller det kan leses av AWK fra standard input (tastatur). Et typisk AWK-program består av en serie linjer, hver av skjemaet

/ mønster / { handling }

der mønster er et regulært uttrykk og handling er en kommando. De fleste AWK-implementeringer bruker utvidede regulære uttrykk som standard. AWK ser gjennom inndatafilen; når den finner en linje som samsvarer med "mønsteret", utfører den kommandoen(e) angitt i "handling". Alternative former inkluderer:

START { handling } Utfør handlingskommandoer i begynnelsen av utførelse, før dataene begynner å bli behandlet. AVSLUTT { handling } Ligner på forrige skjema, men utfør handlingskommandoene etter at alle dataene er behandlet. / mønster / Skriv ut linjene i henhold til mønsteret . { handling } Utfør handling for hver linje i inngangen.

Hver av disse figurene kan inkluderes flere ganger i en fil. Filen behandles gradvis, så hvis det er to "BEGIN"-setninger, vil innholdet deres bli utført i rekkefølge etter utseende. "BEGIN" og "END"-setningene trenger ikke å være i orden.

AWK ble opprettet som en erstatning for algoritmer skrevet i C for tekstanalysemetoder.

AWK-kommandoer

AWK-kommandoer er setningene som erstattes med handling i eksemplene ovenfor. AWK-kommandoer kan inkludere funksjonskall, variabeltilordninger, beregninger eller en hvilken som helst kombinasjon av disse. AWK inneholder egen støtte for mange funksjoner; mange andre leveres av forskjellige versjoner av AWK. Noen versjoner støtter til og med inkludering av dynamisk koblede biblioteker, som kan gi enda mer funksjonalitet.

For klarhetens skyld vil parentesene ( { } ) utelates i de følgende eksemplene.

Skriv ut kommandoen

Skriv ut kommandoen brukes til å skrive ut tekst . Den enkleste formen for denne kommandoen er

skrive ut

Dette viser innholdet i den behandlede linjen. I AWK er linjene delt inn i felt , og disse kan betjenes individuelt:

skriv ut $1 Viser det første feltet i gjeldende linje skriv ut $1, $3 Returnerer det første og tredje feltet i gjeldende linje, atskilt med en forhåndsdefinert streng, utdatafeltseparator eller OFS, som som standard har et mellomromstegn (' ').

Selv om denne syntaksen ( $# ) kan antyde at de er variabler ($-symbolet indikerer variabler på andre språk), refererer de til feltene på gjeldende linje. Et spesialtilfelle, $0 , refererer til hele linjen. Faktisk viser kommandoene printog print $0seg å være like.

Utskriftskommandoen kan også skrive ut resultatet av beregninger eller funksjoner kalt:

print 3 + 2 print foobar ( 3 ) print foobar ( variabel ) print sin ( 3 - 2 )

Utdataene kan sendes til en fil:

skriv ut "uttrykk" > "filnavn"

Variabler

Variabelnavn kan bruke hvilken som helst kombinasjon av tegnene [A-Za-z0-9_], med unntak av språknøkkelord. Operatorene + - * / er henholdsvis addisjon, subtraksjon, multiplikasjon og divisjon. For sammenkobling, plasser ganske enkelt to variabler (eller strengkonstanter) ved siden av hverandre, eventuelt med et mellomrom mellom. Strenger er avgrenset med doble anførselstegn. Det er ikke nødvendig å avslutte kommandoene med semikolon . Programkommentarer kan legges til med # som det første tegnet på en linje.

Brukerdefinerte funksjoner

I likhet med C består funksjonsdefinisjonen av nøkkelen function, funksjonsnavnet, funksjonsargumentene og funksjonskroppen, f.eks.

funksjon : funksjon add_three ( tall , midlertidig ) { # Identifikatorer inneholder ikke bokstaven ñ midlertidig = tall + 3 # De kan heller ikke ha aksenttegn returnere midlertidig }

Vi kan kalle funksjonen slik:

print add_three(36) # Utskrifter 39

Funksjoner kan ha lokalt definerte variabler. Navnene på disse legges til på slutten av argumentlisten, selv om verdiene til disse må utelates når funksjonen kalles. Det er praktisk å rykke inn lokale variabler i argumentlisten for å indikere hvor parametere slutter og lokale variabler begynner.

Eksempler

Hei verden

Dette er et veldig enkelt Hello World- program skrevet i AWK:

BEGIN { print "Hei, verden!" ; exit }

Skriv ut linjer lengre enn 80 tegn

Skriv ut alle linjer med mer enn 80 tegn. Merk at standardhandlingen er å skrive ut gjeldende linje.

lengde > 80

Ordteller

Teller ordene i inndata og viser antall linjer, ord og tegn.

{ w += NF ; c += lengde } END { print NR , w , c }

Første kolonne totalt

Legger til verdiene i den første kolonnen av de angitte dataene.

{ s += $ 1 } END { print s }

Ordfrekvens

Dette programmet bruker koblede lister for å bestemme antall ganger hvert ord vises i teksten.

START { FS = "[^a-zA-Z]+" } { for ( i = 1 ; i <= NF ; i ++ ) ord [ tolower ( $ i )] ++ } END { for ( i i ord ) skriv ut i , ord [ i ] }

Som alle andre programmeringsspråk, kan selvstendige AWK-programmer skrives ved å bruke Shebang-linjesyntaksen .

For eksempel et UNIX-skript kalt helloworld.awk som skriver ut teksten "Hello world!" kan skrives som følger:

#!/usr/bin/awk -f BEGIN { print "Hei verden!" ; exit }

AWK, versjoner og implementeringer

AWK ble opprinnelig skrevet i 1977 med UNIX .

I 1985 begynte forfatterne utvidelsen av språket, og legger til brukerdefinerte funksjoner. Språket er beskrevet i boken The AWK Programming Language , utgitt i 1988 . For å unngå forvirring med den forrige versjonen, som den var inkompatibel med, blir denne versjonen noen ganger referert til som "ny AWK" eller "nawk". Denne implementeringen ble utgitt under en fri programvarelisens i 1996 , og vedlikeholdes fortsatt av Brian Wilson Kernighan .

GNU awk, eller gawk , er en annen gratis implementering. Den ble skrevet før den opprinnelige implementeringen ble publisert, og er mye brukt. Nesten hver Linux-distribusjon inkluderer en oppdatert versjon av gawk , og gawk er anerkjent som standardimplementeringen i Linux- verdenen . GAWK versjon 30 ble inkludert som awk i FreeBSD versjon 5.0 . Senere versjoner av BSD inkluderte nawk for å unngå bruk av GPL , en mer restriktiv fri programvarelisens enn BSD i den forstand at et program publisert under GPL-lisensen ikke kan endres til å bli proprietært, og dermed beskytte kildekodens frihet.

Side med et gratis prosjekt basert på gawk . Dette utvider funksjonaliteten til gawk slik at du kan bruke dynamiske biblioteker.

  • mawk er en hastighetsoptimalisert AWK-implementering skrevet av Mike Brennan og basert på en bytekode - tolk .
  • Thompson AWK eller TAWK er en AWK- kompilator for DOS og Windows , tidligere solgt av Thompson Automation Software.
  • Jawk er et prosjekt som implementerer AWK i Java . Utvidelser til språket legges til for å gi tilgang til Java-funksjoner i AWK-programmer (f.eks. Java-tråder, sockets, samlinger osv.).

Digresjon

  • Fuglen, emblem til AWK (eller på forsiden av boken The AWK Programming Language is the Alca ).

Bøker

Se også

Eksterne lenker

Implementeringer