AWK
AWK este un limbaj de programare (limbaj script) specializat pentru prelucrări de text. A fost creat la Bell Labs, în 1970, [1] de către o echipă formată din Alfred V. Aho, Peter J. Weinberger și Brian W. Kernighan, numele limbajului fiind compus din prima literă a numelui de familie a celor trei autori. Se pronunță „auk”, în limba engleză auk este numele unei familii de păsări foarte similare cu pinguinii. Scris cu litere mici în forma awk, se referă la programul interpretor de limbaj AWK din UNIX și Plan9.
Un fișier text procesat în AWK este tratat ca o secvență de înregistrări, și implicit fiecare linie de text este o înregistrare. Fiecare înregistrare este spartă în câmpuri, astfel încât primul câmp este primul cuvânt, al doilea câmp este al doilea cuvânt, și așa mai departe. Un program AWK este o secvență de declarații pattern-action. AWK citește câte o linie de text la un moment dat. Linia este scanată folosind fiecare model (pattern), și pentru fiecare model care se potrivește, acțiunea asociată este executată. "- V. Alfred Aho[2]
AWK folosește extensiv șiruri de caractere, tablouri asociative (șiruri de caractere sunt folosite pentru indexare) și expresii regulare. Puterea, concizia și limitările programelor AWK timpurii l-au inspirat pe Larry Wall să introducă limbajul Perl ca o versiune mult îmbunătățită a limbajului AWK.
AWK a apărut în versiunea 7 a sistemului de operare UNIX, și a câștigat rapid popularitate ca o modalitate de a adăuga funcții de calcul în secvențele de comenzi UNIX. Limbajul AWK este oferit implicit în toate sistemele UNIX moderne și este specificat ca obligatoriu în standardul Single UNIX Specification. Alături de Bourne shell, doar AWK este un alt limbaj de scripting disponibil într-un mediu standard UNIX. [3]
Structura unui program AWK
[modificare | modificare sursă]Un program AWK constă dintr-o succesiune de perechi pattern-action
pattern { action }
unde pattern este în mod tipic o expresie logică sau o expresie regulară, iar acțiunea constă dintr-o serie de comenzi. Fiecare linie de datele de intrare este testată cu expresiile pattern, iar acțiunea este executată pentru fiecare expresie care a fost evaluată ca fiind adevărată. Oricare din părțile perechii pattern-action pot fi omise, implicit lipsa expresiei pattern va valida orice linie de date, iar lipsa acțiunii va duce implicit la tipărirea liniei de date.
Două expresii pattern speciale intitulate BEGIN și END sunt suportate. Cu ajutorul lor se descriu acțiuni care sunt executate înainte, respectiv după citirea liniilor de date. Expresii de genul pattern1, pattern2 permit executarea acțiunilor începând cu linia validată de pattern1 și terminând cu linia validată de pattern2.
Elementele limbajului AWK
[modificare | modificare sursă]AWK cuprinde majoritatea elementelor întâlnite în limbajele de programare moderne: variabile, funcții, operatori logici, operatori de calcul, blocuri de control etc. Elementelor au o formă similară celor din limbajul C.
Variabile
[modificare | modificare sursă]Ca în orice alt limbaj de scripting, tipul variabilelor nu trebuie declarat:
x = 25; y = ”some string”
Operatori aritmetici
[modificare | modificare sursă]+, - Adunare, scădere *, /, % Înmulțire, împărțire, modulo ++, -- Incrementare, decrementare
Prescurtările din limbajul C sunt și ele permise:
x += 2 Echivalent cu x = x + 2 x -= 2 Echivalent cu x = x - 2 x *= 2 Echivalent cu x = x * 2 x /= 2 Echivalent cu x = x / 2 x %= 2 Echivalent cu x = x % 2
Operatori logici
[modificare | modificare sursă]&&, ||, ! AND, OR, NOT
Operatori condiționali
[modificare | modificare sursă]==, != Egal, diferit. <, > Mai mic, mai mare. <=, >= Mai mic sau egal, mai mare sau egal.
Variabile implicite
[modificare | modificare sursă]$0; $1,$2,$3,... Câmpurile din linia de date. NR Numărul de linii. NF Numărul de câmpuri. FILENAME Fișierul de date curent. FS Separatorul de câmpuri (implicit: " "). RS Separatorul de linii (implicit: "\n"). OFS Separatorul pentru câmpurile de ieșire (implicit: " "). ORS Separatorul pentru liniile de ieșire (implicit: "\n"). OFMT Formatul de ieșire (implicit: "%.6g").
Structuri de control
[modificare | modificare sursă]Structurile de control sunt foarte similare cu cele din limbajul C.
if (<condition>) <action 1> [else <action 2>] while (<condition>) <action> for (<initial action>;<condition>;<end-of-loop action>) <action> break Ieșire din "while" sau "for". continue O nouă iterație în "while" sau "for" loop. next Citește următoarea linie de intrare de date. exit Termină citirea și execută acțiunile END.
Funcții de sistem
[modificare | modificare sursă]Aritmetice: sqrt(), log(), exp(), int() Stringuri: length(), substr(), index(), split() Tipărire: printf(), sprintf()
Funcțiile printf și sprintf sunt preluate direct din limbajul C. Adițional, AWK suportă și o formă prescurtată de print:
print <i1>, <i2>, ... Tipărește elementele separate de OFS. print <i1> <i2> ... Tipărește elementele concatenate.
Funcții definite de utilizator
[modificare | modificare sursă]function add_three (number) { return number + 3; }
Funcția poate fi apelată ca
y = add_three(z);
Exemple
[modificare | modificare sursă]Hello, world
[modificare | modificare sursă]BEGIN { print "Hello, world!" }
Tipărește linii mai mari de 80 de caractere
[modificare | modificare sursă]length($0) > 80
Numai patternul este specificat. Implicit, acțiunea este de a tipări linia.
Numără cuvintele și caracterele din liniile de intrare
[modificare | modificare sursă]{ w += NF c += length($0) + 1 } END { print NR, w, c }
Un pattern nu este specificat pentru prima acțiune, implicit acțiunea este aplicată tuturor liniilor de date de intrare. Numerele de cuvinte și de caractere sunt tipărite în blocul END.
Calcularea frecvenței de apariție a cuvintelor
[modificare | modificare sursă]BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) words[tolower($i)]++ } END { for (i in words) print i, words[i] }
Exemplul folosește tablouri asociative. Blocul BEGIN setează ca separator de câmpuri (în cazul nostru câmpurile sunt cuvinte) orice caracter care nu este o literă. Separarea se va face automat pentru fiecare linie citită, cuvintele fiind copiate în variabilele $1, $2 ... $i. Numărul de câmpuri NF este setat să corespundă cu numărul de cuvinte.
A doua acțiune este executată pentru fiecare linie de text. Se iterează prin toate cuvintele de pe linie și se incrementează un contor local. Fiecare cuvânt are contorul lui. Contoarele sunt implementate ca un tablou asociativ. Se observă că indexarea tabloului se face direct folosind cuvântul citit de pe linia de intrare.
Blocul END asigură tipărirea statisticilor la sfârșitul programului. Prin tabloul de contoare se trece folosind o formă modificată a comenzii for care iterează prin toate elementele tabloului:
for (i in words)
Execuția programelor AWK
[modificare | modificare sursă]Programele AWK sunt rulate independent folosind interpretorul awk. Numele interpretorului este specificat de regulă pe prima linie a programului:
#!/usr/bin/awk -f BEGIN { print "Hello, world!" }
Salvat într-un fișier executabil hello.awk, acest program poate fi rulat direct din consolă. Alt mod de a rula un program AWK este direct din linia de comandă, chemând în mod explicit interpretorul awk. De exemplu, programul precedent ar putea fi rulat în felul următor:
awk 'BEGIN { print "Hello, world!" }'
Această ultimă formă permite integrarea awk cu celelalte utilitare de sistem și utilizarea lui directă în scripturile bash.
Versiuni și implementări ale limbajului AWK
[modificare | modificare sursă]AWK a fost implementat original în 1977 și introdus în versiunea 7 a sistemului de operare UNIX. În 1985, autorii limbajului au adaugat o serie de facilități noi, precum funcțiile definite de utilizatori. Noua versiune a limbajului este descrisă în cartea The AWK Programming Language publicată în 1988, iar implementarea limbajului a devenit disponibilă în versiunea UNIX System V. Pentru a evita confuzia și problemele de interoperabilitate cu versiunea veche, această versiune mai este cunoscută și sub numele de nawk sau „new awk”. Implementare a fost publicată din nou în 1996 sub o licență de tip software liber, și este întrețiuntă și azi de Brian Kernighan. (vedeți legăturile externe mai jos)
- BWK awk se referă la versiunea lui Brian W. Kernighan. Mai poartă și numele de "One True AWK"[4] și este distribuită cu sistemele de operare FreeBSD, NetBSD, OpenBSD și MacOSX.
- gawk (GNU awk) este o altă versiune gratuită și este singura implementare awk care are suport pentru internaționalizare, localizare și networking. Această implementare, permite extinderea funcționalității programelor folosind biblioteci software create de utilizator. Este folosită în principal în distribuțiile Linux.[5]
- mawk este o implementare AWK foarte rapidă, creată de Mike Brennan și este bazată pe un byte code interpreter.
- awka (implementat ca un front end peste mawk) este un translator al scripturilor AWK în cod C. Programul rezultat este echivalent cu scriptul original, este însă mult mai rapid.
- tawk (Thompson awk) este un compilator AWK pentru Solaris, DOS, OS/2 și Windows, comercializat de firma Thompson Automation Software (care și-a încetat activitatea).
- Jawk este un proiect SourceForge care implmentează AWK în Java. Limbajul este extins pentru a permite utilizatorilor să acceseze direct facilități de programare Java precum Java threads, sockets, Collections etc.[6]
- xgawak este un proiect SourceForge care extinde gawk cu suport pentru biblioteci software încărcate dinamic.[7]
- QSEAWK este o implementare embedded inclusă în biblioteca QSE.[8]
- BusyBox include o implementare AWK care pare a fi completă, scrisă de Dmitry Zakharov. Poate fi folosită de asemenea în sistemele embedded.
Referințe
[modificare | modificare sursă]- ^ The A-Z of Programming Languages: AWK
- ^ http://www.computerworld.com.au/index.php/id;1726534212;pp;2 The A-Z of Programming Languages: AWK
- ^ The Single UNIX Specification, Version 3, Utilities Interface Table
- ^ FreeBSD's work log for importing BWK awk into FreeBSD's core, dated 2005-05-16, downloaded 2006-09-20
- ^ GNU awk Home Page
- ^ Jawk at SourceForge
- ^ „xgawk Home Page”. Arhivat din original la . Accesat în .
- ^ „QSEAWK at Google Code”. Arhivat din original la . Accesat în .
Bibliografie
[modificare | modificare sursă]- en Alfred Aho, Brian Kernighan, Peter J. Weinberger: The AWK Programming Language, Addison-Wesley, 1988 Arhivat în , la Wayback Machine.
- en Arnold Robbins: Effective awk Programming, O'Reilly Media, 2001
- en Dale Dougherty, Arnold Robbins: sed & awk, O'Reilly Media, 1997
- en Arnold Robbins: Effective Awk Programming: A User's Guide for Gnu Awk, iUniverse, 2000
- en Naomi Hamilton: The A-Z of Programming Languages: AWK, Computerworld, 2008
- en Daniel Robbins: Awk by example, IBM DeveloperWorks, 2000
- en AWK – Become an expert in 60 minutes Arhivat în , la Wayback Machine.
- en awk tutorial Arhivat în , la Wayback Machine.
- en Gawkinet: TCP/IP Internetworking with Gawk
Vezi și
[modificare | modificare sursă]Legături externe
[modificare | modificare sursă]- en Pagina de manual
- en Awk Community Portal
- Tutorial AWK Arhivat în , la Wayback Machine.
linia de comandă pentru Unix (mai multe) | Programe în|||
Management de fișiere: | cat | cd | chmod | chown | chgrp | cksum | cmp | cp | du | df | file | fsck | ln | ls | lsof | mkdir | mount | mv | pwd | rm | rmdir | split | touch | ||
Management de procese: | at | chroot | cron | exit | kill | killall | nice | pgrep | pidof | pkill | ps | pstree | sleep | time | top | wait | ||
Management utilizator/mediu: | env | finger | id | mesg | passwd | su | sudo | uname | uptime | w | wall | who | whoami | write | ||
Procesare text: | awk | comm | cut | ed | ex | fmt | head | iconv | join | less | more | paste | sed | sort | tac | tail | tr | uniq | wc | xargs | ||
Programare Shell: | basename | echo | expr | false | printf | test | true | unset | Imprimare: lp | |
Communicații: inetd | netstat | ping | rlogin | traceroute |
Căutare: find | grep | strings |
Diverse: banner | bc | cal | dd | man | size | yes |