AWK - AWK

AWK
Paradigmă Scripting , procedural , bazat pe date
Proiectat de Alfred Aho , Peter Weinberger și Brian Kernighan
A apărut prima dată 1977 ; Acum 44 de ani ( 1977 )
Versiune stabila
IEEE Std 1003.1-2008 (POSIX) / 1985
Disciplina de tastare nici unul; poate gestiona șiruri, numere întregi și numere cu virgulă mobilă; expresii obisnuite
OS Cross-platform
Implementări majore
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (compilator), Awka (compilator)
Dialecte
vechi awk oawk 1977, nou awk nawk 1985, GNU Awk gawk
Influențată de
C , sed , SNOBOL
Influențat
Tcl , AMPL , Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua

AWK ( awk ) este un limbaj specific domeniului conceput pentru procesarea textului și utilizat de obicei ca instrument de extragere și raportare a datelor. La fel ca sed și grep , este un filtru și este o caracteristică standard a majorității sistemelor de operare de tip Unix .

Limbajul AWK este un limbaj de scriptare bazat pe date care constă dintr-un set de acțiuni care trebuie întreprinse împotriva fluxurilor de date textuale - fie rulate direct pe fișiere, fie utilizate ca parte a unei conducte - în scopul extragerii sau transformării textului, cum ar fi producerea formatată rapoarte. Limbajul folosește pe scară largă tipul de date șir , matrici asociative (adică matrice indexate de șiruri cheie) și expresii regulate . În timp ce AWK are un domeniu limitat de aplicații și a fost special conceput pentru a sprijini programe one-liner , limbajul este complet Turing și chiar și utilizatorii timpurii ai Bell Labs ai AWK au scris deseori programe AWK mari bine structurate.

AWK a fost creat la Bell Labs în anii 1970, iar numele său derivă din numele de familie ale autorilor săi: Alfred Aho , Peter Weinberger și Brian Kernighan . Acronimul se pronunță la fel ca pasărea AUK , care se află pe coperta AWK limbaj de programare . Când este scris cu majuscule, awkse referă la programul Unix sau Plan 9 care rulează scripturi scrise în limbajul de programare AWK.

Istorie

AWK a fost dezvoltat inițial în 1977 de Alfred Aho (autorul egrep ), Peter J. Weinberger (care a lucrat pe mici baze de date relaționale) și Brian Kernighan ; își ia numele de la inițialele respective. Potrivit lui Kernighan, unul dintre obiectivele AWK a fost acela de a avea un instrument care să manipuleze cu ușurință atât numerele, cât și șirurile. AWK a fost, de asemenea, inspirat de limbajul de programare al lui Marc Rochkind care a fost folosit pentru a căuta tipare în datele de intrare și a fost implementat folosind yacc .

Fiind unul dintre primele instrumente care au apărut în versiunea 7 Unix , AWK a adăugat caracteristici de calcul la o conductă Unix în afară de shell-ul Bourne , singurul limbaj de scriptare disponibil într-un mediu standard Unix. Este unul dintre utilitățile obligatorii ale Specificației unice UNIX și este cerut de specificația Linux Standard Base .

AWK a fost revizuit și extins în mod semnificativ în 1985–88, rezultând în implementarea GNU AWK scrisă de Paul Rubin , Jay Fenlason și Richard Stallman , lansată în 1988. GNU AWK poate fi versiunea cea mai răspândită, deoarece este inclusă cu GNU-based Pachete Linux. GNU AWK a fost întreținut exclusiv de Arnold Robbins din 1994. Sursa nawk (New AWK) a lui Brian Kernighan a fost lansată pentru prima dată în 1993 nepublicată și publică de la sfârșitul anilor 1990; multe sisteme BSD îl folosesc pentru a evita licența GPL.

AWK a fost precedat de sed (1974). Ambele au fost concepute pentru procesarea textului. Ele împărtășesc, paradigma bazată pe date orientate pe linie, și sunt deosebit de potrivite pentru scrierea programelor-o linie , din cauza implicită bucla principală și variabilele linia curentă. Puterea și concordanța programelor AWK timpurii - în special manevrarea puternică a expresiei regulate și concizia datorită variabilelor implicite, care facilitează un singur liner - împreună cu limitările AWK în acel moment, au fost inspirații importante pentru limbajul Perl (1987). În anii 1990, Perl a devenit foarte popular, concurând cu AWK pe nișa limbajelor de procesare a textelor Unix.

Structura programelor AWK

POSIX awk.pdf

AWK citește intrarea pe rând. Se scanează o linie pentru fiecare model din program, iar pentru fiecare model care se potrivește, se execută acțiunea asociată.

-  Alfred V. Aho

Un program AWK este o serie de perechi de acțiuni tipare, scrise ca:

condition { action }
condition { action }
...

unde condiția este de obicei o expresie și acțiunea este o serie de comenzi. Intrarea este împărțită în înregistrări, unde în mod implicit înregistrările sunt separate de caractere de linie nouă, astfel încât intrarea este împărțită în linii. Programul testează fiecare înregistrare împotriva fiecărei condiții la rândul său și execută acțiunea pentru fiecare expresie care este adevărată. Fie condiția, fie acțiunea pot fi omise. Condiția implicită corespunde fiecărei înregistrări. Acțiunea implicită este imprimarea înregistrării. Aceasta este aceeași structură de acțiune tipar ca și sed.

În plus față de o expresie AWK simplă, cum ar fi foo == 1sau /^foo/, condiția poate fi BEGINsau poate ENDdetermina executarea acțiunii înainte sau după ce toate înregistrările au fost citite sau pattern1, pattern2 care se potrivește cu gama de înregistrări începând cu o înregistrare care se potrivește cu pattern1 în sus la și inclusiv înregistrarea care se potrivește cu modelul 2 înainte de a încerca din nou să se potrivească cu modelul 1 pe liniile viitoare.

Pe lângă operatorii logici și aritmetici normali, expresiile AWK includ operatorul tilde ~, care se potrivește cu o expresie regulată cu un șir. Ca zahăr sintactic la îndemână , / regexp / fără a utiliza operatorul tilde se potrivește cu înregistrarea curentă; această sintaxă derivă din sed , care la rândul său a moștenit-o de la editorul ed , unde /este folosit pentru căutare. Această sintaxă a utilizării barelor oblice ca delimitatori pentru expresii regulate a fost ulterior adoptată de Perl și ECMAScript și este acum obișnuită. Operatorul de tilde a fost adoptat și de Perl.

Comenzi

Comenzile AWK sunt instrucțiunile care sunt substituite acțiunii din exemplele de mai sus. Comenzile AWK pot include apeluri funcționale, alocări variabile, calcule sau orice combinație a acestora. AWK conține suport încorporat pentru multe funcții; multe altele sunt oferite de diferitele arome ale AWK. De asemenea, unele arome acceptă includerea de biblioteci conectate dinamic , care pot oferi și mai multe funcții.

De imprimare comandă

Comanda de tipărire este utilizată pentru a scoate text. Textul de ieșire este terminat întotdeauna cu un șir predefinit numit separator de înregistrări de ieșire (ORS) a cărui valoare implicită este o linie nouă. Cea mai simplă formă a acestei comenzi este:

print
Aceasta afișează conținutul înregistrării curente. În AWK, înregistrările sunt împărțite în câmpuri , iar acestea pot fi afișate separat:
print $1
Afișează primul câmp al înregistrării curente
print $1, $3
Afișează primul și al treilea câmp al înregistrării curente, separate printr-un șir predefinit numit separator de câmp de ieșire (OFS) a cărui valoare implicită este un singur caracter spațial

Deși aceste câmpuri ( $ X ) pot semăna cu variabile (simbolul $ indică variabile în Perl ), ele se referă de fapt la câmpurile înregistrării curente. Un caz special, 0 USD , se referă la întregul record. De fapt, comenzile " print" și " print $0" sunt identice ca funcționalitate.

Comanda de tipărire poate afișa, de asemenea, rezultatele calculelor și / sau apelurilor de funcții:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print 3+2
    print foobar(3)
    print foobar(variable)
    print sin(3-2)
}

Ieșirea poate fi trimisă la un fișier:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" > "file name"
}

sau printr-o conductă :

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" | "command"
}

Variabile încorporate

Variabilele încorporate ale lui Awk includ variabilele de câmp: $ 1, $ 2, $ 3 și așa mai departe ($ 0 reprezintă întreaga înregistrare). Acestea conțin textul sau valorile în câmpurile de text individuale dintr-o înregistrare.

Alte variabile includ:

  • NR: Număr de înregistrări. Păstrează un număr curent al numărului de înregistrări de intrare citite până acum din toate fișierele de date. Începe de la zero, dar nu se resetează niciodată automat la zero.
  • FNR: Număr fișier înregistrări. Păstrează un număr curent al numărului de înregistrări de intrare citite până acum în fișierul curent. Această variabilă este resetată automat la zero de fiecare dată când este pornit un fișier nou.
  • NF: Număr de câmpuri. Conține numărul de câmpuri din înregistrarea de intrare curentă. Ultimul câmp din înregistrarea de intrare poate fi desemnat cu $ NF, al doilea până la ultimul câmp cu $ (NF-1), al treilea până la ultimul câmp cu $ (NF-2) etc.
  • FILENAME: Conține numele fișierului de intrare curent.
  • FS: Separator de câmp. Conține caracterul „separator de câmp” utilizat pentru a împărți câmpurile din înregistrarea de intrare. Implicit, „spațiu alb”, include orice spațiu și caractere de filă. FS poate fi reatribuit unui alt caracter pentru a schimba separatorul de câmp.
  • RS: Separator de înregistrări. Stochează caracterul curent „separator de înregistrări”. Deoarece, în mod implicit, o linie de intrare este înregistrarea de intrare, caracterul implicit de separare a înregistrării este o „linie nouă”.
  • OFS: Separator de câmp de ieșire. Stochează „separatorul de câmp de ieșire”, care separă câmpurile atunci când Awk le tipărește. Implicit este un caracter „spațiu”.
  • ORS: Separator de înregistrări de ieșire. Stochează „separatorul de înregistrări de ieșire”, care separă înregistrările de ieșire atunci când Awk le tipărește. Implicit este un caracter „newline”.
  • OFMT: Format de iesire. Stochează formatul pentru ieșirea numerică. Formatul implicit este „% .6g”.

Variabile și sintaxă

Numele variabilelor pot utiliza oricare dintre caracterele [A-Za-z0-9_], cu excepția cuvintelor cheie de limbă. Operatorii + - * / reprezintă adunarea, scăderea, înmulțirea și, respectiv, divizarea. Pentru concatenarea șirurilor , pur și simplu așezați două variabile (sau constante de șir) una lângă alta. Este opțional să utilizați un spațiu intermediar dacă sunt implicate constante de șir, dar două nume de variabile plasate unul lângă celălalt necesită un spațiu între ele. Ghilimelele duble delimitează constantele șirului. Declarațiile nu trebuie să se încheie cu punct și virgulă. În cele din urmă, comentariile pot fi adăugate la programe folosind # ca prim caracter pe o linie.

Funcții definite de utilizator

Într-un format similar cu C , definițiile funcției constau în cuvântul cheie function, numele funcției, numele argumentelor și corpul funcției. Iată un exemplu de funcție.

function add_three (number) {
    return number + 3
}

Această declarație poate fi invocată după cum urmează:

(pattern)
{
   print add_three(36)     # Outputs '''39'''
}

Funcțiile pot avea variabile care se află în domeniul local. Numele acestora sunt adăugate la sfârșitul listei de argumente, deși valorile pentru acestea ar trebui omise atunci când se apelează funcția. Este convențională adăugarea unor spații albe în lista de argumente înainte de variabilele locale, pentru a indica unde se termină parametrii și începe variabilele locale.

Exemple

Salut Lume

Iată programul obișnuit „ Hello, world ” scris în AWK:

BEGIN { print "Hello, world!" }

Rețineți că o exitdeclarație explicită nu este necesară aici; deoarece singurul model este BEGIN, nu sunt procesate argumente din linia de comandă.

Imprimați linii mai lungi de 80 de caractere

Imprimați toate liniile mai lungi de 80 de caractere. Rețineți că acțiunea implicită este de a imprima linia curentă.

length($0) > 80

Numără cuvinte

Numărați cuvintele din intrare și imprimați numărul de linii, cuvinte și caractere (cum ar fi wc ):

{
    words += NF
    chars += length + 1 # add one to account for the newline character at the end of each record (line)
}
END { print NR, words, chars }

Deoarece nu există un model pentru prima linie a programului, fiecare linie de intrare se potrivește în mod implicit, astfel încât acțiunile de incrementare sunt executate pentru fiecare linie. Rețineți că words += NFeste o prescurtare pentru words = words + NF.

Suma ultimul cuvânt

{ s += $NF }
END { print s + 0 }

s este incrementat cu valoarea numerică de $ NF , care este ultimul cuvânt de pe linie, așa cum este definit de separatorul de câmp AWK (în mod implicit, spațiu alb). NF este numărul de câmpuri din linia curentă, de exemplu 4. Deoarece $ 4 este valoarea celui de-al patrulea câmp, $ NF este valoarea ultimului câmp din linie, indiferent de câte câmpuri are această linie sau dacă are mai mult sau mai puține câmpuri decât liniile înconjurătoare. $ este de fapt un operator unar cu cea mai mare prioritate de operator . (Dacă linia nu are câmpuri, atunci NF este 0, $ 0 este întreaga linie, care, în acest caz, este goală, în afară de posibilul spațiu alb și are și valoarea numerică 0.)

La sfârșitul intrării, modelul END se potrivește, deci s este tipărit. Cu toate acestea, din moment ce este posibil să nu fi existat deloc linii de intrare, caz în care nu s-a atribuit niciodată o valoare lui s , va fi în mod implicit un șir gol. Adăugarea zero la o variabilă este un idiom AWK pentru a-l constrânge de la un șir la o valoare numerică. (Concatenarea unui șir gol este de a constrânge de la un număr la un șir, de ex. S "" . Notă, nu există niciun operator care să concateneze șirurile, acestea sunt așezate adiacent.) Cu coerciția, programul imprimă „0” pe o intrare goală. , fără el se imprimă o linie goală.

Potriviți o gamă de linii de intrare

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

Declarația de acțiune imprimă fiecare linie numerotată. Funcția printf emulează standard C printf și funcționează similar cu comanda de imprimare descrisă mai sus. Modelul care se potrivește, totuși, funcționează după cum urmează: NR este numărul de înregistrări, de obicei liniile de intrare, AWK a citit până acum, adică numărul curent al liniei, începând de la 1 pentru prima linie de intrare. % este operatorul modulo . NR% 4 == 1 este adevărat pentru prima, a 5-a, a 9-a etc., liniile de intrare. La fel, NR% 4 == 3 este adevărat pentru a treia, a șaptea, a 11-a, etc., liniile de intrare. Modelul intervalului este fals până când prima parte se potrivește, pe linia 1, și apoi rămâne adevărată până și inclusiv când a doua parte se potrivește, pe linia 3. Rămâne apoi falsă până când prima parte se potrivește din nou pe linia 5.

Astfel, programul imprimă liniile 1,2,3, omite linia 4 și apoi 5,6,7 și așa mai departe. Pentru fiecare linie, imprimă numărul liniei (pe un câmp cu 6 caractere) și apoi conținutul liniei. De exemplu, când este executat pe această intrare:

Rome
Florence
Milan
Naples
Turin
Venice

Programul anterior imprimă:

     1 Rome
     2 Florence
     3 Milan
     5 Turin
     6 Venice

Tipărirea părții inițiale sau finale a unui fișier

Ca un caz special, când prima parte a unui model de interval este adevărată în mod constant, de exemplu 1 , intervalul va începe la începutul intrării. În mod similar, dacă a doua parte este în mod constant falsă, de exemplu 0 , intervalul va continua până la sfârșitul intrării. De exemplu,

 /^--cut here--$/, 0

imprimă liniile de intrare din prima linie care se potrivește cu expresia regulată ^ - tăiat aici - $ , adică o linie care conține doar sintagma "--cut aici--", până la capăt.

Calculați frecvențele cuvintelor

Frecvența cuvintelor folosind tablouri asociative :

BEGIN {
    FS="[^a-zA-Z]+"
}
{
    for (i=1; i<=NF; i++)
        words[tolower($i)]++
}
END {
    for (i in words)
        print i, words[i]
}

Blocul BEGIN setează separatorul de câmp la orice succesiune de caractere non-alfabetice. Rețineți că separatoarele pot fi expresii regulate. După aceea, ajungem la o acțiune goală, care efectuează acțiunea pe fiecare linie de intrare. În acest caz, pentru fiecare câmp de pe linie, adăugăm unul la numărul de apariții a cuvântului, convertit mai întâi în minuscule. În cele din urmă, în blocul END, imprimăm cuvintele cu frecvența lor. Linia

for (i in words)

creează o buclă care trece prin cuvintele matricei , setând i pe fiecare indice al matricei. Acest lucru este diferit de majoritatea limbilor, unde o astfel de buclă trece prin fiecare valoare din matrice. Bucla imprimă astfel fiecare cuvânt urmat de numărul său de frecvență. tolowera fost o adăugire la One True awk (vezi mai jos) făcută după publicarea cărții.

Model de potrivire din linia de comandă

Acest program poate fi reprezentat în mai multe moduri. Primul folosește shell-ul Bourne pentru a crea un script shell care face totul. Este cea mai scurtă dintre aceste metode:

#!/bin/sh

pattern="$1"
shift
awk '/'"$pattern"'/ { print FILENAME ":" $0 }' "$@"

Comanda $patterndin awk nu este protejată de ghilimele unice, astfel încât shell-ul să extindă variabila, dar trebuie să fie plasat în ghilimele duble pentru a gestiona corect modelele care conțin spații. Un model în sine în mod obișnuit verifică dacă întreaga linie ( $0) se potrivește. FILENAMEconține numele de fișier curent. awk nu are un operator explicit de concatenare; două șiruri adiacente le concatenează. $0se extinde la linia de intrare originală neschimbată.

Există modalități alternative de a scrie acest lucru. Acest script shell accesează mediul direct din interiorul awk:

#!/bin/sh

export pattern="$1"
shift
awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@"

Acesta este un script shell care folosește ENVIRON, o matrice introdusă într-o versiune mai nouă a One True awk după publicarea cărții. Indicele ENVIRONeste numele unei variabile de mediu; rezultatul acesteia este valoarea variabilei. Aceasta este ca funcția getenv în diferite biblioteci standard și POSIX . Scriptul shell creează o variabilă de mediu patterncare conține primul argument, apoi renunță la acel argument și are un aspect incomod pentru modelul din fiecare fișier.

~verifică dacă operandul său stâng se potrivește cu operandul său drept; !~este inversul său. Rețineți că o expresie regulată este doar un șir și poate fi stocată în variabile.

Următorul mod folosește atribuirea variabilei din linia de comandă, în care un argument pentru a awk poate fi văzut ca o atribuire a unei variabile:

#!/bin/sh

pattern="$1"
shift
awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@"

Sau puteți utiliza opțiunea -v var = valoare a liniei de comandă (de exemplu, awk -v pattern = "$ pattern" ... ).

În cele din urmă, acest lucru este scris în awk pur, fără ajutorul unui shell sau fără a fi nevoie să știți prea multe despre implementarea scriptului awk (așa cum o face atribuirea variabilelor pe linia de comandă), dar este puțin lungă:

BEGIN {
    pattern = ARGV[1]
    for (i = 1; i < ARGC; i++) # remove first argument
        ARGV[i] = ARGV[i + 1]
    ARGC--
    if (ARGC == 1) { # the pattern was the only thing, so force read from standard input (used by book)
        ARGC = 2
        ARGV[1] = "-"
    }
}
$0 ~ pattern { print FILENAME ":" $0 }

Este BEGINnecesar nu numai pentru a extrage primul argument, ci și pentru a împiedica interpretarea acestuia ca un nume de fișier după încheierea BEGINblocului. ARGC, numărul de argumente, este garantat întotdeauna să fie ≥1, la fel ca ARGV[0]și numele comenzii care a executat scriptul, cel mai adesea șirul "awk". De asemenea, rețineți că ARGV[ARGC]este șirul gol "",. #inițiază un comentariu care se extinde până la sfârșitul liniei.

Rețineți ifblocul. awk verifică numai dacă ar trebui să citească din intrarea standard înainte de a rula comanda. Aceasta înseamnă că

awk 'prog'

funcționează doar deoarece faptul că nu există nume de fișiere este verificat numai înainte de a progfi rulat! Dacă setați în mod explicit ARGCla 1 astfel încât să nu existe argumente, awk va renunța pur și simplu pentru că se pare că nu mai există fișiere de intrare. Prin urmare, trebuie să spuneți în mod explicit să citiți din intrarea standard cu numele de fișier special -.

Scripturi AWK autonome

Pe sistemele de operare de tip Unix, scripturile AWK autonome pot fi construite folosind sintaxa shebang .

De exemplu, un script care tipărește conținutul unui anumit fișier poate fi construit prin crearea unui fișier numit print.awkcu următorul conținut:

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

Poate fi invocat cu: ./print.awk <filename>

-fI spune AWK că argumentul care urmează este fișierul pentru a citi programul AWK de la, care este același steag , care este utilizat în sed. Deoarece sunt adesea folosite pentru un singur liner, ambele programe implicit execută un program dat ca argument de linie de comandă, mai degrabă decât un fișier separat.

Versiuni și implementări

AWK a fost scris inițial în 1977 și distribuit cu versiunea 7 Unix .

În 1985, autorii săi au început să extindă limba, cel mai semnificativ prin adăugarea de funcții definite de utilizator. Limba este descrisă în cartea AWK Programming Language , publicată 1988, iar punerea în aplicare a acesteia a fost pusă la dispoziție în versiunile de UNIX System V . Pentru a evita confuzia cu versiunea mai veche incompatibilă, această versiune a fost numită uneori „new awk” sau nawk . Această implementare a fost lansată sub o licență de software gratuit în 1996 și este încă întreținută de Brian Kernighan (vezi linkurile externe de mai jos).

Versiuni vechi ale Unix, cum ar fi UNIX / 32V , incluse awkcc, care au convertit AWK în C. Kernighan a scris un program pentru a transforma awk în C ++; starea sa nu este cunoscută.

  • BWK awk , cunoscut și sub numele de nawk , se referă la versiunea de Brian Kernighan . A fost supranumit „Un adevărat AWK” datorită utilizării termenului în asociere cu cartea care a descris inițial limba și faptul că Kernighan a fost unul dintre autorii originali ai AWK. FreeBSD se referă la această versiune drept one-true-awk . Această versiune are, de asemenea, caracteristici care nu sunt în carte, precum tolowerși ENVIRONcare sunt explicate mai sus; vezi fișierul FIXES din arhiva sursă pentru detalii. Această versiune este utilizată de, de exemplu, Android , FreeBSD , NetBSD , OpenBSD , macOS și illumos . Brian Kernighan și Arnold Robbins sunt principalii contribuabili la un depozit sursă pentru nawk : github .com / onetrueawk / awk .
  • gawk ( GNU awk) este o altă implementare de software liber și singura implementare care face progrese serioase în implementarea internaționalizării și localizării și a rețelelor TCP / IP. A fost scris înainte ca implementarea originală să devină disponibilă gratuit. Include propriul său depanator, iar profilerul său permite utilizatorului să realizeze îmbunătățiri măsurate ale performanței unui script. De asemenea, permite utilizatorului să extindă funcționalitatea cu bibliotecile partajate. Unele distribuții Linux includ gawk ca implementare AWK implicită.
    • gawk-csv . CSV extinderea comentariu C oferă facilități de manipulare a datelor de intrare și de ieșire CSV formatat.
  • mawk este o implementare AWK foarte rapidă de către Mike Brennan pe baza unui interpret bytecode .
  • libmawk este un fork al mawk, care permite aplicațiilor să încorporeze mai multe instanțe paralele de interpreți awk.
  • awka (al cărui capăt frontal este scris deasupra programului mawk ) este un alt traducător al scripturilor AWK în cod C. Când sunt compilate, incluzând în mod static libawka.a, executabilele rezultate sunt considerabil accelerate și, conform testelor autorului, se compară foarte bine cu alte versiuni ale AWK, Perl sau Tcl . Scripturile mici se vor transforma în programe de 160–170 kB.
  • tawk (Thompson AWK) este un compilator AWK pentru Solaris , DOS , OS / 2 și Windows , vândut anterior de Thompson Automation Software (care și-a încetat activitatea).
  • Jawk este un proiect pentru implementarea AWK în Java , găzduit pe SourceForge. Extensiile la limbaj sunt adăugate pentru a oferi acces la caracteristicile Java din scripturile AWK (de exemplu, fire Java, socketuri, colecții etc.).
  • xgawk este o furcă de gawk care extinde gawk cu biblioteci încărcate dinamic. Extensia XMLgawk a fost integrată în versiunea oficială 4.1.0 a GNU Awk.
  • QSEAWK este o implementare de interpretare AWK încorporată inclusă în biblioteca QSE care oferă încorporarea interfeței de programare a aplicațiilor (API) pentru C și C ++ .
  • libfawk este un interpret foarte mic, numai funcțional, reentrant, încorporabil scris în C
  • BusyBox include o implementare AWK scrisă de Dmitry Zakharov. Aceasta este o implementare foarte mică, potrivită pentru sistemele încorporate.
  • CLAWK de Michael Parker oferă o implementare AWK în Common Lisp , bazată pe biblioteca de expresie regulată a aceluiași autor.

Cărți

  • Aho, Alfred V .; Kernighan, Brian W .; Weinberger, Peter J. (01.01.1988). Limbajul de programare AWK . New York, NY: Addison-Wesley . ISBN 0-201-07981-X. Adus 22.01.2017 .
  • Robbins, Arnold (15.05.2001). Programare efectivă awk (ediția a 3-a). Sebastopol, CA: O'Reilly Media . ISBN 0-596-00070-7. Adus 16/04/2009 .
  • Dougherty, Dale ; Robbins, Arnold (01.03.1997). sed & awk (ed. a 2-a). Sebastopol, CA: O'Reilly Media. ISBN 1-56592-225-5. Adus 16/04/2009 .
  • Robbins, Arnold (2000). Programare eficientă Awk: Ghidul utilizatorului pentru Gnu Awk (ed. 1.0.3). Bloomington, IN: iUniverse . ISBN 0-595-10034-1. Arhivat din original la 12 aprilie 2009 . Adus 16/04/2009 .

Vezi si

Referințe

Lecturi suplimentare

linkuri externe