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]
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.
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.
Ca în orice alt limbaj de scripting, tipul variabilelor nu trebuie declarat:
x = 25; y = ”some string”
+, - 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
&&, ||, ! AND, OR, NOT
==, != Egal, diferit. <, > Mai mic, mai mare. <=, >= Mai mic sau egal, mai mare sau egal.
$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").
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.
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.
function add_three (number) { return number + 3; }
Funcția poate fi apelată ca
y = add_three(z);
BEGIN { print "Hello, world!" }
length($0) > 80
Numai patternul este specificat. Implicit, acțiunea este de a tipări linia.
{ 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.
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)
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.
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)
Unix (mai multe) | Programe în linia de comandă pentru|||
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 |