În sistemul Linux, awk reprezintă un instrument versatil pentru procesarea textului direct din linia de comandă, dar și un limbaj de scripting deosebit de puternic. Vom explora câteva dintre cele mai notabile caracteristici ale sale.
Originea numelui awk
Numele comenzii awk este un acronim format din inițialele numelor celor trei programatori care au creat prima versiune în 1977: Alfred Aho, Peter Weinberger și Brian Kernighan. Acești pionieri proveneau din faimosul AT&T Laboratoarele Bell, un adevărat pilon al universului Unix. Dezvoltarea awk a continuat, fiind îmbunătățită de contribuțiile numeroșilor alți programatori de-a lungul timpului.
Acesta funcționează atât ca limbaj de scripting complex, cât și ca un set de instrumente robuste pentru manipularea textului în linia de comandă. Dacă sunteți interesat să aflați mai multe, puteți consulta documentația oficială pentru a explora toate detaliile și funcționalitățile oferite de awk.
Structura programelor awk: reguli, modele și acțiuni
Programele awk sunt structurate în reguli, fiecare compusă dintr-un model și o acțiune. Acțiunea este executată numai pe acele linii de text care corespund modelului specificat. Modelele sunt delimitate de acolade {}. Împreună, un model și o acțiune formează o regulă. Întregul program awk este inclus între apostrofe (‘).
Vom analiza cel mai simplu tip de program awk, care nu are un model specificat. Aceasta înseamnă că se aplică fiecărei linii de text introduse, executând acțiunea pe fiecare dintre ele. Pentru a demonstra, vom utiliza rezultatul comenzii who.
Iată un exemplu de output standard de la comanda who:
who
Să presupunem că nu avem nevoie de toate informațiile afișate, ci dorim să vedem doar numele de utilizator. Vom direcționa ieșirea comenzii who către awk, cerându-i să afișeze doar primul câmp.
În mod implicit, awk identifică un câmp ca fiind o secvență de caractere delimitată de spații albe, începutul sau sfârșitul unei linii. Câmpurile sunt identificate prin simbolul dolar ($) urmat de un număr. Astfel, $1 se referă la primul câmp, pe care îl vom utiliza împreună cu acțiunea „print” pentru a-l afișa.
Introducem următoarea comandă:
who | awk '{print $1}'
awk afișează doar primul câmp și ignoră restul liniei.
Putem afișa oricâte câmpuri dorim. Dacă introducem o virgulă între câmpuri, awk va insera un spațiu între ele.
Pentru a afișa și ora la care utilizatorul s-a autentificat (câmpul patru), introducem următoarea comandă:
who | awk '{print $1,$4}'
Există câțiva identificatori speciali de câmp, care permit accesul la întreaga linie sau la ultimul câmp:
$0: Reprezintă întreaga linie de text.
$1: Reprezintă primul câmp.
$2: Reprezintă al doilea câmp.
$7: Reprezintă al șaptelea câmp.
$45: Reprezintă al 45-lea câmp.
$NF: Reprezintă „numărul de câmpuri” și indică ultimul câmp.
Vom afișa un scurt citat atribuit lui Dennis Ritchie, stocat într-un fișier text:
cat dennis_ritchie.txt
Vrem ca awk să afișeze primul, al doilea și ultimul câmp al citatului. Deși citatul poate apărea pe mai multe rânduri în terminal, acesta este, de fapt, o singură linie de text.
Introducem următoarea comandă:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
Nu știm că „simplitatea” este al 18-lea câmp din text și nici nu ne interesează. Știm doar că este ultimul câmp, iar pentru a-i obține valoarea, folosim $NF. Punctul este considerat un caracter parte din ultimul câmp.