Aflați comanda Linux - gawk

Nume

gawk - model de scanare și de prelucrare a limbii

Rezumat

gawk [opțiunile de stil POSIX sau GNU] -f fișierul de programe [ - ] ...
gawk [opțiuni stil POSIX sau GNU] [ - ] fișier text-program ...

pgawk [opțiuni de stil POSIX sau GNU] -f fișier de program [ - ] ...
pgawk [opțiuni stil POSIX sau GNU] [ - ] fișier text-program ...

Descriere

Gawk este implementarea proiectului GNU al limbajului de programare AWK. Conform definiției limbii din standardul POSIX 1003.2 Command Language and Utilities. Această versiune, la rândul său, se bazează pe descrierea din limbajul de programare AWK , de Aho, Kernighan și Weinberger, cu caracteristicile suplimentare găsite în versiunea System V Release 4 a UNIX awk . Gawk oferă, de asemenea, mai recente extensii ale Bell Laboratories awk și mai multe extensii specifice GNU.

Pgawk este versiunea de profil a lui Gawk . Este identic în toate privințele, cu excepția faptului că programele rulează mai lent și produce automat un profil de execuție în fișierul awkprof.out când este terminat. Vedeți opțiunea --profile , de mai jos.

Linia de comandă constă în opțiuni pentru a se vedea, textul programului AWK (dacă nu este furnizat prin opțiunile -f sau -file ) și valorile care trebuie să fie disponibile în variabilele predefinite AWK ARGC și ARGV .

Format opțiune

Opțiunile Gawk pot fi opțiuni tradiționale POSIX cu o singură literă sau opțiuni lungi stil GNU. Opțiunile POSIX încep cu un singur `` - '', în timp ce opțiunile lungi încep cu `` - ''. Sunt disponibile opțiuni lungi atât pentru caracteristicile specifice GNU, cât și pentru funcțiile cu mandat POSIX.

Urmând standardul POSIX, opțiunile specificate pentru gawk sunt furnizate prin intermediul argumentelor opțiunii -W . Sunt disponibile opțiuni multi-W Fiecare opțiune -W are o opțiune lungă corespunzătoare, după cum este detaliat mai jos. Argumentele pentru opțiunile lungi sunt fie asociate opțiunii cu semnul an = , fără spații intermediare, fie ele pot fi furnizate în argumentul următor al liniei de comandă. Opțiunile lungi pot fi abreviate, atât timp cât abrevierea rămâne unică.

Opțiuni

Gawk acceptă următoarele opțiuni, listate în ordine alfabetică.

-F fs

- separator de câmp fs Utilizați fs pentru separatorul câmpului de intrare (valoarea variabilei predefinite FS ).

-v var = val

--assign var = val Alocați valorile val la variabila var , înainte de începerea execuției programului. Astfel de valori variabile sunt disponibile pentru blocul BEGIN al unui program AWK.

-f fișier-program

- fișier de fișiere de fișiere Citiți sursa programului AWK din fișierul de fișiere , în loc de primul argument al liniei de comandă. Sunt posibile opțiuni multiple -f (sau --file ).

-mf NNN

-m NNN Setați diferite limite de memorie la valoarea NNN . Steagul f stabilește numărul maxim de câmpuri, iar parametrul r stabilește dimensiunea maximă a înregistrării. Aceste două steaguri și opțiunea -m sunt din versiunea de cercetare Bell Laboratories a UNIX awk . Ele sunt ignorate de gawk , deoarece gawk nu are limite predefinite.

-W compat

-W tradiționale

--compat

- Tradus tradițional în modul de compatibilitate . În modul de compatibilitate, gawk se comportă identic cu UNIX awk ; niciuna dintre extensiile specifice GNU nu este recunoscută. Se preferă utilizarea - tradițională în raport cu celelalte forme ale acestei opțiuni. Consultați EXTENSIUNILE GNU , de mai jos, pentru mai multe informații.

-W copyleft

-W drept de autor

--copyleft

--copyright Imprimați versiunea scurtă a mesajului informativ privind drepturile de autor GNU pe ieșirea standard și ieșiți cu succes.

-W variabilele dump [ = fișier ]

--dump-variables [ = fișier ] Imprimați o listă sortată de variabile globale, tipurile și valorile finale ale acestora. Dacă nu este furnizat niciun fișier , gawk folosește un fișier numit awkvars.out în directorul curent.

Având o listă a tuturor variabilelor globale este o modalitate bună de a căuta erori tipografice în programele dvs. De asemenea, ați folosi această opțiune dacă aveți un program mare cu o mulțime de funcții și doriți să fiți sigur că funcțiile dvs. nu utilizează în mod inadvertent variabile globale pe care ați vrut să le utilizați la nivel local. (Aceasta este o greșeală foarte ușor de făcut cu nume de variabile simple, cum ar fi i , j , și așa mai departe.)

-W ajutor

-W utilizare

--Ajutor

--usage Imprimați un rezumat relativ scurt al opțiunilor disponibile pe ieșirea standard. (Conform standardelor GNU de codificare , aceste opțiuni determină o ieșire imediată, cu succes.)

-W scame [ = fatal ]

--lint [ = fatal ] Oferiți avertismente despre constructe care sunt îndoielnice sau non-portabile pentru alte implementăriAWK. Cu un argument opțional de avertismente fatale , scamele devin erori fatale. Acest lucru poate fi drastic, dar utilizarea sa va încuraja cu siguranță dezvoltarea unor programe mai curate AWK.

-W scârțâit

- ling-old Furnizați avertismente despre construcții care nu sunt portabile versiunii originale a Unix awk .

-W gen-po

--gen-po Scanați și analizați programul AWK și generați un fișier format GNU .po pe ieșirea standard cu intrări pentru toate șirurile localizabile din program. Programul în sine nu este executat. Consultați distribuția gettext GNU pentru mai multe informații despre fișierele .po .

-W date non-zecimale

- date non-zecimale Recunoaște valori octale și hexazecimale în datele de intrare. Utilizați această opțiune cu mare atenție!

-W posix

--posix Se activează modul de compatibilitate , cu următoarele restricții suplimentare:

*

\ x secvențele de evacuare nu sunt recunoscute.

*

Numai spațiul și fila acționează ca separatoare de câmp atunci când FS este setat la un singur spațiu, noul rând nu.

*

Nu puteți continua liniile după ? și :.

*

Funcția sinonimă pentru funcția de cuvinte cheie nu este recunoscută.

*

Operatorii ** și ** = nu pot fi utilizați în loc de ^ și ^ = .

*

Funcția fflush () nu este disponibilă.

-W profil [ = prof_file ]

--profile [ = prof_file ] Trimite datele de profil prof_file . Valoarea implicită este awkprof.out . Când rulați cu gawk , profilul este doar o versiune `` destul de tipărită '' a programului. Atunci când se execută cu pgawk , profilul conține numărul de execuții ale fiecărei instrucțiuni din program în marginea din stânga și numărul apelurilor funcționale pentru fiecare funcție definită de utilizator.

-W re-interval

--re-interval Activați utilizarea expresiilor de intervale în potrivirea expresiei regulate (consultați Expresii regulate , de mai jos). Expresiile de intervale nu erau disponibile în mod tradițional în limba AWK. Standardul POSIX le-a adăugat, pentru a face awk și egrep consecvente unul cu altul. Cu toate acestea, utilizarea lor este susceptibilă să încalce programele vechi AWK, deci le oferă numai dacă sunt solicitate cu această opțiune sau când este specificat --posix .

-W program sursă -text

- program sursă -text Utilizați programul-text ca un cod sursă al programului AWK. Această opțiune permite intermixarea ușoară a funcțiilor bibliotecii (folosită prin opțiunile -f și -file ) cu codul sursă introdus pe linia de comandă. Acesta este destinat în principal pentru programele AWK medii și mari utilizate în scripturile shell.

-W versiune

--versiune Imprimați versiunea de informații pentru această copie specifică a gawk pe ieșirea standard. Acest lucru este util, în principal, pentru a ști dacă actuala copie a gawk din sistemul dvs. este actualizată cu privire la distribuția Fundației Free Software Foundation. Acest lucru este, de asemenea, util atunci când raportați erori. (Conform standardelor GNU de codificare , aceste opțiuni determină o ieșire imediată, cu succes.)

- Semnați sfârșitul opțiunilor. Acest lucru este util pentru a permite mai multor argumente pentru ca programul AWK să înceapă cu un `` - ''. Aceasta este în principal pentru consecvența cu convenția de parsare argument utilizat de majoritatea programelor POSIX.

În modul de compatibilitate, orice alte opțiuni sunt marcate ca nevalide, dar sunt altfel ignorate. În funcționarea normală, atâta timp cât a fost furnizat un program, opțiunile necunoscute sunt transmise programului AWK din matricea ARGV pentru procesare. Acest lucru este deosebit de util pentru rularea programelor AWK prin mecanismul de interpretare executabil "#!".

Executarea programului AWK

Un program AWK constă dintr-o secvență de instrucțiuni de acțiune-tip și definiții opționale ale funcțiilor.

model { declarații de acțiune }

nume de funcție ( lista parametrilor ) { statements }

Gawk citește mai întâi sursa programului din fișierul (programele) de programe dacă este specificat, de la argumente la sursă sau de la primul argument non-opțiune de pe linia de comandă. Opțiunile -f și -source pot fi utilizate de mai multe ori pe linia de comandă. Gawk citește textul programului ca și cum toate textele sursă ale fișierelor și ale liniilor de comandă au fost concatenate împreună. Acest lucru este util pentru construirea de biblioteci de funcții AWK, fără a trebui să le includeți în fiecare nou program AWK care le folosește. De asemenea, oferă posibilitatea de a combina funcțiile bibliotecii cu programele de linie de comandă.

Variabila de mediu AWKPATH specifică o cale de căutare utilizată la găsirea fișierelor sursă numite cu opțiunea -f . Dacă această variabilă nu există, calea implicită este ".: / Usr / local / share / awk" . (Directorul real poate varia în funcție de modul în care a fost construit și instalat gawk .) Dacă un nume de fișier atribuit opțiunii -f conține un caracter "/", nu se efectuează nici o căutare de căi.

Gawk execută programe AWK în ordinea următoare. Mai întâi, toate asignările variabile specificate prin opțiunea -v sunt efectuate. Apoi, Gawk compilează programul într-o formă internă. Apoi, gawk execută codul în blocurile BEGIN (dacă există) și apoi continuă să citească fiecare fișier numit în matricea ARGV . Dacă nu există fișiere numite pe linia de comandă, gawk citește intrarea standard.

Dacă un nume de fișier în linia de comandă are forma var = val, acesta este tratat ca o atribuire a variabilei. Variabila var va fi atribuită val val . (Acest lucru se întâmplă după ce au fost executate orice blocuri BEGIN .) Alocarea de variabile de linie de comandă este cea mai utilă pentru atribuirea dinamică a valorilor variabilelor folosite de AWK pentru a controla modul în care intrarea este împărțită în câmpuri și înregistrări. De asemenea, este util pentru controlul stării dacă sunt necesare mai multe treceri pe un singur fișier de date.

Dacă valoarea unui element particular al lui ARGV este goală ( "" ), gawk trece peste el.

Pentru fiecare înregistrare din intrare, testele pentru a vedea dacă se potrivește cu orice model din programul AWK. Pentru fiecare model care corespunde înregistrării, acțiunea asociată este executată. Modelele sunt testate în ordinea în care apar în program.

În cele din urmă, după ce toată intrarea este epuizată, gawk execută codul în blocul END (dacă există).

Variabile, înregistrări și câmpuri

Variabilele AWK sunt dinamice; ele apar în momentul în care sunt utilizate pentru prima oară. Valorile lor sunt fie numere în virgulă mobilă, fie șiruri sau ambele, în funcție de modul în care sunt folosite. AWK are, de asemenea, o rețea de dimensiuni; arhitecturi cu dimensiuni multiple pot fi simulate. Mai multe variabile predefinite sunt setate ca un program care rulează; acestea vor fi descrise ca fiind necesare și rezumate mai jos.

Înregistrări

În mod normal, înregistrările sunt separate prin caractere noi. Puteți controla separarea înregistrărilor prin atribuirea de valori variabilei încorporate RS . Dacă RS este un singur caracter, acest caracter separă înregistrările. În caz contrar, RS este o expresie regulată. Textul din intrarea care se potrivește cu această expresie regulată separă înregistrarea. Cu toate acestea, în modul de compatibilitate, pentru separarea înregistrărilor se utilizează numai primul caracter al valorii sale de șir. Dacă RS este setat la șirul nul, înregistrările sunt separate prin linii goale. Când RS este setat la șirul nul, caracterul newline acționează întotdeauna ca un separator de câmp, în plus față de orice valoare poate avea FS .

Câmpuri

Pe măsură ce fiecare înregistrare de intrare este citită, gawk împarte înregistrarea în câmpuri , folosind valoarea variabilei FS ca separator de câmp. Dacă FS este un singur caracter, câmpurile sunt separate de acel caracter. Dacă FS este șirul nul, atunci fiecare caracter individual devine un câmp separat. În caz contrar, este de așteptat ca FS să fie o expresie regulată completă. În cazul special în care FS este un singur spațiu, câmpurile sunt separate prin rularea spațiilor și / sau filelor și / sau liniilor noi. (Dar vedeți discuția despre --posix , de mai jos). NOTĂ: Valoarea IGNORECASE (vezi mai jos) afectează de asemenea felul în care sunt împărțite câmpurile atunci când FS este o expresie regulată și cum sunt separate înregistrările când RS este o expresie regulată.

Dacă variabila FIELDWIDTHS este setată la o listă de numere separate, fiecare câmp este de așteptat să aibă o lățime fixă, iar gawk împarte înregistrarea cu ajutorul lățimilor specificate. Valoarea FS este ignorată. Alocarea unei valori noi FS suprascrie utilizarea FIELDWIDTHS și restabilește comportamentul implicit.

Fiecare câmp din înregistrarea de intrare poate fi referit de poziția sa, $ 1 , $ 2 , și așa mai departe. $ 0 este întreaga înregistrare. Domeniile nu trebuie să fie menționate prin constante:

n = 5
tip $ n

imprimă al cincilea câmp din înregistrarea de intrare.

Variabila NF este setată la numărul total de câmpuri din înregistrarea de intrare.

Referințele la câmpurile inexistente (de exemplu, câmpurile după $ NF ) produc șirul nul. Cu toate acestea, atribuirea unui câmp inexistent (de exemplu, $ (NF + 2) = 5 ) mărește valoarea lui NF , creează orice câmp care intervine cu șirul nul ca valoare și determină valoarea 0 $ să fie recalculată câmpurile fiind separate de valoarea OFS . Referințele la câmpurile numerotate negative cauzează o eroare fatală. Decrementarea NF determină pierderea valorilor câmpurilor care depășesc noua valoare și valoarea de 0 $ care urmează a fi recuperată, câmpurile fiind separate de valoarea OFS .

Alocarea unei valori unui câmp existent determină reconstruirea întregii înregistrări când se face referire la $ 0 . În mod similar, atribuirea unei valori la $ 0 face ca înregistrarea să fie resplitată, creând noi valori pentru câmpuri.

Variabile construite

Variabilele încorporate ale lui Gawk sunt:

argc

Numărul de argumente ale liniei de comandă (nu include opțiunile pentru a căuta sau sursa programului).

ARGIND

Indicele din ARGV al fișierului curent care este procesat.

argv

Array de argumente de linie de comandă. Matricea este indexată de la 0 la ARGC - 1. Modificarea dinamic a conținutului ARGV poate controla fișierele utilizate pentru date.

BINMODE

Pe sistemele non-POSIX, se specifică utilizarea modului "binar" pentru toate intrările / ieșirile fișierelor. Valorile numerice de 1, 2 sau 3 specifică că fișierele de intrare, fișierele de ieșire sau toate fișierele ar trebui să utilizeze I / O binare. Valorile de șir ale "r" sau "w" specifică că fișierele de intrare sau, respectiv, fișierele de ieșire ar trebui să utilizeze I / O binare. Valorile de șir ale "rw" sau "wr" specifică faptul că toate fișierele ar trebui să utilizeze I / O binare. Orice altă valoare de șir este tratată ca "rw" , dar generează un mesaj de avertizare.

CONVFMT

Formatul de conversie pentru numere, "% .6g" , implicit.

ENVIRON

O matrice care conține valorile mediului actual. Matricea este indexată de variabilele de mediu, fiecare element fiind valoarea acelei variabile (de exemplu, ENVIRON ["HOME"] ar putea fi / home / arnold ). Schimbarea acestei matrice nu afectează mediul văzut de programele care se strecoară prin redirecționare sau funcția sistem () .

errno

Dacă apare o eroare de sistem, fie face o redirecționare pentru getline , în timpul unei citiri pentru getline , fie în timpul unei închideri () , atunci ERRNO va conține un șir care descrie eroarea. Valoarea este supusă traducerii în locații non-engleză.

FIELDWIDTHS

O listă de lățimi de câmp separate în spațiul alb. Când este setat, gawk analizează intrarea în câmpuri de lățime fixă, în loc să folosească valoarea variabilei FS ca separator de câmp.

NUME DE FIȘIER

Numele fișierului de intrare curent. Dacă nu sunt specificate fișiere în linia de comandă, valoarea FILENAME este `` - ''. Cu toate acestea, FILENAME este nedefinit în interiorul blocului BEGIN (dacă nu este setat de getline ).

FNR

Numărul de înregistrare de intrare din fișierul de intrare curent.

FS

Separatorul câmpului de introducere, un spațiu implicit. Consultați câmpurile de mai sus.

IGNORECASE

Controlează sensibilitatea cazului pentru toate operațiile de expresie regulată și de șir. Dacă IGNORECASE are o valoare nenulă, atunci compararea șirului și potrivirea modelului în reguli, împărțirea câmpului cu FS , separarea înregistrărilor cu RS , potrivirea expresiei regulate cu ~ și ! ~ Și gensub () , gsub () , index , funcțiile match () , split () și sub () built-in toate ignoră caz ​​atunci când fac operații de expresie regulată. NOTĂ: Inscripția array nu este afectată, nici funcția asort () .

Astfel, dacă IGNORECASE nu este egal cu zero, / aB / se potrivește cu toate șirurile "ab" , "aB" , "Ab" și "AB" . Ca și în cazul tuturor variabilelor AWK, valoarea inițială a IGNORECASE este zero, astfel încât toate operațiunile de expresie regulată și de șir sunt în mod normal sensibile la litere mici. Sub Unix, setul complet de caractere ISO 8859-1 Latin-1 este utilizat atunci când ignorăm cazul.

PUF

Oferă control dinamic al opțiunii - lint din cadrul unui program AWK. Când este adevărat, gawk imprimă avertismente pentru scame. Când este fals, nu se întâmplă. Atunci când se atribuie valoarea șirului "fatal" , avertismentele cu scame vor deveni erori fatale, exact ca - lint = fatal . Orice altă valoare adevărată imprimă avertismente.

NF

Numărul de câmpuri din înregistrarea curentă de intrare.

NR

Numărul total de înregistrări de intrare văzute până acum.

OFMT

Formatul de ieșire pentru numere, "% .6g" , implicit.

OFS

Separatorul câmpului de ieșire, un spațiu implicit.

ORS

Separatorul de înregistrări de ieșire, implicit o nouă linie.

PROCINFO

Elementele acestei matrice oferă acces la informații despre programul AWK care rulează. La unele sisteme, pot exista elemente în matrice, "group1" prin "group n " pentru unele n , adică numărul de grupuri suplimentare pe care le are procesul. Utilizați operatorul pentru a testa aceste elemente. Sunt disponibile următoarele elemente:

PROCINFO [ "Egid"]

valoarea apelului de sistem getegid (2).

PROCINFO [ "EUID"]

valoarea apelului de sistem geteuid (2).

PROCINFO [ "FS"]

"FS" în cazul în care divizarea câmpului cu FS este în vigoare sau "FIELDWIDTHS" dacă divizarea câmpului cu FIELDWIDTHS este în vigoare.

PROCINFO [ "TIS"]

valoarea apelului de sistem getgid (2).

PROCINFO [ "pgrpid"]

ID-ul grupului de proces al procesului curent.

PROCINFO [ "BIP"]

procesul de identificare al procesului curent.

PROCINFO [ "ppid"]

ID-ul procesului părinte al procesului curent.

PROCINFO [ "uid"]

valoarea apelului de sistem getuid (2).

RS

Separatorul de înregistrări de intrare, implicit un rând nou.

RT

Terminatorul de înregistrări. Gawk setează RT la textul de intrare care corespunde caracterului sau expresiei regulate specificate de RS .

RSTART

Indicele primului caracter asociat cu potrivirea () ; 0 dacă nu se potrivește. (Aceasta implică faptul că indicii de caractere încep de la unu.)

RLENGTH

Lungimea șirului potrivită de potrivire () ; -1 dacă nu se potrivește.

SUBSEP

Caracterul folosit pentru a separa mai multe indexuri în elementele matricei, implicit "\ 034" .

DOMENIU_TEXT

Domeniul de text al programului AWK; folosit pentru a găsi traducerile localizate pentru șirurile programului.

Arrays

Arrays sunt abonați cu o expresie între paranteze pătrate ( [ și ] ). Dacă expresia este o listă de expresii ( expr , expr ...) atunci indicele array este un șir constând din concatenarea valorii (șir) a fiecărei expresii, separate de valoarea variabilei SUBSEP . Această facilitate este utilizată pentru a simula matrice multiplicate. De exemplu:

i = "A"; j = "B"; k = "C"
x [i, j, k] = "salut, lume \ n"

atribuie șirul "salut, lume \ n" elementului matricei x care este indexat de șirul "A \ 034B \ 034C" . Toate matricele din AWK sunt asociative, adică indexate prin valorile șirului.

Operatorul special din poate fi utilizat într-o declarație if sau while pentru a vedea dacă o matrice are un indice constând dintr-o anumită valoare.

dacă (val în matrice) array de imprimare [val]

Dacă matricea are mai multe indexuri, utilizați (i, j) în matrice .

Construcția în construcție poate fi de asemenea folosită într-o buclă pentru a itera peste toate elementele unei matrice.

Un element poate fi șters dintr-o matrice utilizând instrucțiunea de ștergere . Instrucțiunea de ștergere poate fi, de asemenea, utilizată pentru a șterge întregul conținut al unui matrice, doar prin specificarea numelui matricei fără un indice.

Tastarea și conversia variabilelor

Variabilele și câmpurile pot fi numere (puncte în virgulă mobilă) sau șiruri sau ambele. Cum se interpretează valoarea unei variabile depinde de contextul acesteia. Dacă este utilizat într-o expresie numerică, va fi tratat ca un număr, dacă este folosit ca șir, acesta va fi tratat ca un șir.

Pentru a forța o variabilă care trebuie tratată ca număr, adăugați 0 la ea; pentru ao forța să fie tratată ca un șir, să o concatenăm cu șirul nul.

Atunci când un șir trebuie convertit la un număr, conversia este realizată folosind strtod (3). Un număr este convertit într-un șir utilizând valoarea CONVFMT ca șir de format pentru sprintf (3), cu valoarea numerică a variabilei ca argument. Totuși, chiar dacă toate numerele din AWK sunt punct de plutire, valorile integrale sunt întotdeauna convertite ca întregi. Astfel, dat

CONVFMT = "% 2.2f" a = 12 b = a ""

variabila b are o valoare de șir de "12" și nu "12.00" .

Gawk efectuează comparații după cum urmează: Dacă două variabile sunt numerice, ele sunt comparate numeric. Dacă o valoare este numerică, iar cealaltă are o valoare de șir care este un "șir numeric", atunci se fac și comparații numerice. În caz contrar, valoarea numerică este convertită la un șir și se efectuează o comparație de șir. Două șiraguri sunt comparate, firește, ca șiruri de caractere. Rețineți că standardul POSIX aplică conceptul de "șir numeric" peste tot, chiar și la constantele string. Cu toate acestea, acest lucru este în mod clar incorect, și gawk nu face acest lucru. (Din fericire, acest lucru este stabilit în următoarea versiune a standardului.)

Rețineți că constantele string, cum ar fi "57" , nu sunt șiruri numerice, ci sunt constante șir. Ideea de "șir numeric" se aplică numai câmpurilor, intrărilor getline , FILENAME , elementelor ARGV , elementelor ENVIRON și elementelor unui matrice create de split () care sunt șiruri numerice. Ideea de bază este că intrarea utilizatorilor și numai introducerea utilizatorilor, care arată numeric, ar trebui tratate în acest fel.

Variabilele neinitializate au valoarea numerică 0 și valoarea șirului "" (șirul nul sau gol).

Constante octale și hexazecimale

Începând cu versiunea 3.1 a gawk, puteți utiliza constante octale și hexazecimal în stilul dvs. de program AWK. De exemplu, valoarea octal 011 este egală cu zecimal 9 , iar valoarea hexazecimală 0x11 este egală cu zecimal 17.

String Constante

Conținuturile de coarde din AWK sunt secvențe de caractere închise între ghilimele duble ( " ). În cadrul șirurilor, sunt recunoscute anumite secvențe de evacuare , ca în C. Acestea sunt:

\\

O retrospectivă literală.

\A

Caracterul "alertă"; de obicei caracterul ASCII BEL.

\ b

backspace.

\ f

formular-feed.

\ n

linie nouă.

\ r

retur transport.

\ t

orizontală.

\ v

verticală.

\ x hex cifre

Caracterul reprezentat de șirul de cifre hexazecimale după \ x . Ca și în ANSIC, toate următoarele cifre hexazecimale sunt considerate parte a secvenței de evacuare. (Această caracteristică ar trebui să ne spună ceva despre proiectarea limbajului de către comitet.) De exemplu, "\ x1B" este caracterul ASCIIESC (escape).

\ ddd

Caracterul reprezentat de secvența de 1-, 2 sau 3 cifre a cifrelor octale. De exemplu, "\ 033" este caracterul ASCII ESC (escape).

\ c

Caracterul literal c .

Secvențele de evacuare pot fi, de asemenea, utilizate în expresii regulate constante (de exemplu, / [\ t \ f \ n \ r \ v] / se potrivește cu caracterele spațiului alb).

În modul de compatibilitate, caracterele reprezentate de secvențe de evacuare octale și hexazecimale sunt tratate literal când sunt utilizate în constante de expresie regulată. Astfel, / a \ 52b / este echivalent cu / a \ * b / .

Modele și acțiuni

AWK este un limbaj orientat spre linie. Modelul vine mai întâi și apoi acțiunea. Declarațiile de acțiune sunt închise în { și } . Fie modelul poate lipsi, fie acțiunea poate lipsi, dar, desigur, nu ambele. Dacă modelul lipsește, acțiunea este executată pentru fiecare înregistrare de intrare. O acțiune lipsă este echivalentă cu

{ imprimare }

care imprimă întreaga înregistrare.

Comentariile încep cu caracterul "#" și continuă până la sfârșitul liniei. Linile libere pot fi utilizate pentru a separa declarațiile. În mod normal, o declarație se termină cu o linie nouă, însă nu este cazul pentru liniile care se termină într-un ``, '', { , ? , : , && , sau || . Liniile care se termină sau nu au afirmațiile continue continuă pe următoarea linie. În alte cazuri, o linie poate fi continuată terminând cu un ", caz în care noua linie va fi ignorată.

Mai multe declarații pot fi plasate pe o singură linie, separându-le cu un ``; ''. Acest lucru se aplică atât afirmațiilor din cadrul părții de acțiune a unei perechi de modele-acțiune (cazul obișnuit), cât și declarațiilor de acțiune-tip.

Modele de

Modelele AWK pot fi una dintre următoarele:

BEGIN END / expresie regulată / model de expresie relațională && pattern pattern || model de model ? model : model ( model ) ! modelul modelului1 , modelul2

BEGIN și END sunt două tipuri speciale de modele care nu sunt testate față de intrare. Părțile de acțiune ale tuturor tiparelor BEGIN sunt fuzionate ca și cum toate declarațiile au fost scrise într-un singur bloc BEGIN . Acestea sunt executate înainte de citirea oricăror intrări. În mod similar, toate blocurile END sunt fuzionate și executate atunci când toată intrarea este epuizată (sau când se execută o instrucțiune de ieșire ). Modelele BEGIN și END nu pot fi combinate cu alte modele în expresiile de model. Modelele BEGIN și END nu pot lipsi din părțile de acțiune.

Pentru / expresie regulată / modele, instrucțiunea asociată este executată pentru fiecare înregistrare de intrare care se potrivește cu expresia regulată. Expresiile regulate sunt aceleași cu cele din egrep (1) și sunt rezumate mai jos.

O expresie relațională poate utiliza oricare dintre operatorii definiți mai jos în secțiunea despre acțiuni. Acestea testează, în general, dacă anumite câmpuri se potrivesc cu anumite expresii regulate.

&& , || , și ! operatorii sunt logici AND, logic OR, și NOT logic, respectiv, ca în C. Ei fac o evaluare de scurtcircuit, de asemenea ca și în C, și sunt folosiți pentru combinarea unor expresii mai primitive de tipar. Ca în majoritatea limbilor, parantezele pot fi folosite pentru a schimba ordinea de evaluare.

Operatorul ?: Este același operator în C. Dacă primul model este adevărat atunci modelul folosit pentru testare este cel de-al doilea model, altfel este al treilea. Se evaluează numai unul din cel de-al doilea și al treilea model.

Forma pattern1 , pattern2 a unei expresii se numește un model de interval . Se potrivește cu toate înregistrările de intrare începând cu o înregistrare care se potrivește cu modelul 1 și continuând până la o înregistrare care se potrivește modelului2 , inclusiv. Nu se combină cu nici un fel de expresie a modelului.

Expresii obisnuite

Expresiile regulate sunt tipul extins găsit în egrep . Acestea sunt compuse din caractere după cum urmează:

c

se potrivește cu non-metacharacter c .

\ c

se potrivește cu caracterul literal c .

.

potrivește orice caracter, inclusiv linia nouă.

^

se potrivește cu începutul unui șir.

$

se potrivește cu sfârșitul unui șir.

[ abc ... ]

lista de caractere, se potrivește cu oricare dintre caracterele abc ....

[^ abc ... ]

lista negativă de caractere, se potrivește cu orice caracter, cu excepția abc ....

r1 | r2

alternanță: se potrivește fie r1, fie r2 .

R1R2

concatenare: se potrivește cu r1 și apoi cu r2 .

r +

se potrivește cu unul sau mai mulți r .

r *

se potrivește cu zero sau mai multe r .

r ?

se potrivește cu zero sau cu un r .

( r )

grupare: meciuri r .

r { n }

r { n ,}

r { n , m } Unu sau doi numere în interiorul bretelelor denotă o expresie de interval . Dacă există un număr în bretele, expresia regulată precedentă r se repetă de câte ori. Dacă există două numere separate printr-o virgulă, r se repetă de la n la m de ori. Dacă există un număr urmat de o virgulă, atunci r se repetă de cel puțin n ori.

Intervalele de expresie sunt disponibile numai dacă pe linia de comandă sunt specificate fie -posix sau -re-interval .

\ y

se potrivește cu șirul gol la începutul sau la sfârșitul unui cuvânt.

\ B

se potrivește cu șirul gol într-un cuvânt.

\ <

se potrivește cu șirul gol la începutul unui cuvânt.

\>

se potrivește cu șirul gol la sfârșitul unui cuvânt.

\ w

corespunde oricărui cuvânt-element constitutiv (literă, cifră sau subliniere).

\ W

potrivește cu orice caracter care nu este cuvânt constitutiv.

\ `

se potrivește cu șirul gol la începutul unui buffer (șir).

\ '

se potrivește cu șirul gol la sfârșitul tamponului.

Secvențele de evacuare valide în constantele string (vezi mai jos) sunt valabile și în expresiile regulate.

Clasele de caractere sunt o caracteristică nouă introdusă în standardul POSIX. O clasă de caractere este o notație specială pentru descrierea listelor de caractere care au un atribut specific, dar în care caracterele reale pot varia de la o țară la alta și / sau de la un set de caractere la un set de caractere. De exemplu, noțiunea de caracter alfabetic diferă în SUA și în Franța.

O clasă de caractere este valabilă numai într-o expresie regulată din interiorul parantezelor unei liste de caractere. Clasele de caractere sunt formate din [: , un cuvânt cheie care denotă clasa și :] . Clasele de caractere definite de standardul POSIX sunt:

[: alnum:]

Caractere alfanumerice.

[:alfa:]

Caractere alfabetice.

[:gol:]

Spațiu sau caractere tab.

[: cntrl:]

Controlează caracterele.

[:cifră:]

Caractere numerice.

[:grafic:]

Caractere care pot fi tipărite și vizibile. (Un spațiu este imprimabil, dar nu este vizibil, în timp ce a este ambele.)

[:inferior:]

Caractere alfabetice cu litere mici.

[:imprimare:]

Caractere tipărite (caractere care nu sunt caractere de control.)

[: punct:]

Caractere de punctuație (caractere care nu sunt litere, cifre, caractere de control sau caractere spațiale).

[:spaţiu:]

Caractere spațioase (cum ar fi spațiu, fila și formate, pentru a numi câteva).

[:superior:]

Caractere alfabetice de caractere superioare.

[: xdigit:]

Caractere care sunt cifre hexazecimale.

De exemplu, înainte de standardul POSIX, pentru a se potrivi cu caracterele alfanumerice, ar fi trebuit să scrie / [A-Za-z0-9] / . Dacă setul dvs. de caractere avea alte caractere alfabetice, acest lucru nu s-ar potrivi cu acestea, iar dacă setul dvs. de caractere este comparat diferit cu ASCII, este posibil ca acesta să nu corespundă nici măcar caracterelor alfanumerice ASCII. Cu clasele de caractere POSIX, puteți scrie / [[: alnum:]] / , iar acest lucru se potrivește cu caracterele alfabetice și numerice din setul de caractere.

Două secvențe suplimentare pot apărea în listele de caractere. Acestea se aplică seturilor de caractere non-ASCII, care pot avea simboluri simple (numite elemente de colocare ) care sunt reprezentate cu mai mult de un caracter, precum și mai multe caractere care sunt echivalente pentru scopuri de sortare sau sortare. (De exemplu, în limba franceză, un câmp "e" și un accent grav "sunt echivalente.)

Simbolurile de colaționare

Un simbol de colaționare este un element de colaționare cu mai multe caractere, închis în [. și .] . De exemplu, dacă ch este un element de colaționare, atunci [[.ch.]] Este o expresie regulată care se potrivește cu acest element de colaționare, în timp ce [ch] este o expresie regulată care se potrivește fie c, fie h .

Clase de echivalență

O clasă de echivalență este un nume specific localizării pentru o listă de caractere echivalente. Numele este inclus în [= și =] . De exemplu, numele e poate fi folosit pentru a reprezenta tot "e", "e", "și" e ". În acest caz, [[= e =]] se potrivește cu oricare dintre e , e ' sau e` .

Aceste caracteristici sunt foarte valoroase în localitățile care nu vorbesc limba engleză. Funcțiile bibliotecii pe care le utilizează gawk pentru potrivirea expresiilor regulate recunosc în prezent doar clasele de caractere POSIX; ei nu recunosc simbolurile de clasificare sau clasele de echivalență.

Operatorii \ y , \ B , \ < , \> , \ w , \ W , \ ' și \' sunt specifici pentru gawk ; acestea sunt extensii bazate pe facilități din bibliotecile de expresii regulate ale GNU.

Diferitele opțiuni din linia de comandă controlează modul în care Gawk interpretează caracterele în expresii regulate.

Nu există opțiuni

În cazul implicit, gawk furnizează toate facilitățile expresiilor regulate POSIX și operatorii de expresie regulată GNU descris mai sus. Cu toate acestea, expresiile de intervale nu sunt acceptate.

--posix

Se acceptă numai expresii regulate POSIX, operatorii GNU nu sunt speciali. (De exemplu, \ w se potrivește cu litera literală w ). Intervalele de expresie sunt permise.

--tradiţional

Tradițional, expresiile regulate Unix awk sunt potrivite. Operatorii GNU nu sunt specifici, expresiile de interval nu sunt disponibile și nici nu sunt clasele de caractere POSIX ( [[: alnum:]] și așa mai departe. Caracterele descrise de secvențele de evacuare octale și hexazecimale sunt tratate literal, chiar dacă acestea reprezintă metacaractere de expresie regulată.

--re interval

Permiteți expresii de intervale în expresii regulate, chiar dacă - a fost furnizată trad .

acţiuni

Declarațiile de acțiune sunt închise în brațe, { și } . Declarațiile de acțiune constau în afirmații obișnuite, afirmații condiționate și looping găsite în majoritatea limbilor. Operatorii, declarațiile de control și declarațiile de intrare / ieșire disponibile sunt modelate după cele din C.

operatorii

Operatorii din AWK, în ordinea descrescătoare a prevalenței, sunt

( ... )

Gruparea

$

Referința câmpului.

++ -

Creșterea și scăderea, atât prefixul cât și postfixul.

^

Exponentiație ( ** poate fi de asemenea folosită și ** = pentru operatorul de atribuire).

+ -!

Unary plus, minus unar și negare logică.

* /%

Înmulțire, împărțire și modul.

+ -

Adunare si scadere.

spaţiu

Coordonarea șirului.

<>

<=> =

! = == Operatorii relaționali obișnuiți.

~!

Ordinea expresiei regulate, potrivirea negată. NOTĂ: Nu utilizați o expresie regulată constantă ( / foo / ) în partea stângă a unui ~ sau ! ~ . Utilizați unul numai pe partea dreaptă. Expresia / foo / ~ exp are același înțeles ca și (($ 0 ~ / foo /) ~ exp ) . Acest lucru nu este, de obicei, ceea ce a fost intenționat.

în

Array membru.

&&

Logic AND.

||

Logic OR.

?:

Expresia condiționată C. Aceasta are forma expr1 ? expr2 : expr3 . Dacă expr1 este adevărat, valoarea expresiei este expr2 , altfel este expr3 . Se evaluează numai unul dintre expr2 și expr3 .

= + = - =

* = / =% = ^ = Asignare. Atât alocarea absolută ( var = valoare ) cât și asignarea operatorului (celelalte forme) sunt acceptate.

Contracte de control

Declarațiile de control sunt după cum urmează:

dacă declarația [ condiție ] [ declarația alt ] în timp ce ( condiția ) instrucțiunea face statement în timp ce ( condiție ) pentru ( expr1 ; expr2 ; expr3 ) declarația pentru ( var în array ) declarații }

Declarații I / O

Instrucțiunile de intrare / ieșire sunt următoarele:

închide ( fișier [ , cum ] )

Închideți fișierul, țevile sau co-procesarea. Opțional modul în care ar trebui utilizat numai când închideți un capăt al unei țevi bidirecționale într-un co-proces. Trebuie să fie o valoare de șir, fie "la", fie "de la" .

getline

Setați 0 $ din următoarea înregistrare de intrare; set NF , NR , FNR .

getline < fișier

Setați $ 0 din următoarea înregistrare a fișierului ; setați NF .

getline var

Setați var din următoarea înregistrare de intrare; set NR , FNR .

getline var < fișier

Setați var din următoarea înregistrare a fișierului .

comandă | getline [ var ]

Executați conducta de ieșire fie în $ 0, fie în var , ca mai sus.

comandă & getline [ var ]

Porniți comanda ca o co-procesare a conductei de ieșire fie în $ 0 sau var , ca mai sus. Co-procesele sunt o prelungire.

Următor →

Opriți procesarea înregistrării curente de intrare. Următoarea înregistrare de intrare este citită, iar procesarea începe cu primul model din programul AWK. Dacă se ajunge la sfârșitul datelor de intrare, sunt executate blocurile END , dacă există.

nextfile

Opriți procesarea fișierului de intrare curent. Următoarea înregistrare de intrare este citită din următorul fișier de intrare. FILENAME și ARGIND sunt actualizate, FNR este resetat la 1, iar prelucrarea începe cu primul model din programul AWK. Dacă se ajunge la sfârșitul datelor de intrare, sunt executate blocurile END , dacă există.

imprimare

Tipărește înregistrarea curentă. Înregistrarea de ieșire este terminată cu valoarea variabilei ORS .

print expr-list

Imprimă expresii. Fiecare expresie este separată de valoarea variabilei OFS . Înregistrarea de ieșire este terminată cu valoarea variabilei ORS .

print expr-list > file

Tipărește expresii în fișier . Fiecare expresie este separată de valoarea variabilei OFS . Înregistrarea de ieșire este terminată cu valoarea variabilei ORS .

printf fmt, expr-list

Formatați și tipăriți.

printf fmt, expr-list > fișier

Formatați și imprimați pe fișier .

sistem ( cmd-linie )

Executați comanda cmd-line și reveniți la starea de ieșire. (Este posibil ca acesta să nu fie disponibil în sistemele non-POSIX.)

fflush ( [ fișier ] )

Îndepărtați toate tampoanele asociate cu fișierul de ieșire deschis sau fișierul cu țevi. Dacă fișierul lipsește, ieșirea standard este spălată. Dacă fișierul este șirul nul, atunci toate fișierele de ieșire deschise și țevile au tampoanele lor spălate.

Sunt permise redirecționări adiționale suplimentare pentru imprimare și imprimare .

tipăriți fișierul ... >>

adaugă ieșirea la fișier .

tipăriți ... | comanda

scrie pe o țeavă.

print ... & comanda

trimite datele către un co-proces.

Comanda getline returnează 0 la sfârșitul fișierului și -1 pentru o eroare. La o eroare, ERRNO conține un șir care descrie problema.

NOTĂ: Dacă utilizați o țeavă sau un proces de corespondență pentru a obține linia de referință sau de la imprimare sau printf într-o buclă, trebuie să utilizați funcția close () pentru a crea noi instanțe ale comenzii. AWK nu închide automat conductele sau co-procesele atunci când se întorc la EOF.

Declarația printf

Versiunile AWK ale instrucțiunii printf și ale funcției sprintf () (vezi mai jos) acceptă următoarele formate de specificații de conversie:

% c

Un caracter ASCII. Dacă argumentul folosit pentru % c este numeric, acesta este tratat ca un caracter și tipărit. În caz contrar, argumentul este presupus a fi un șir, iar singurul prim caracter al acelui șir este tipărit.

% d , % i

Un număr zecimal (partea intregă).

% e,% E

Un număr de punct variabil al formularului [-] d.dddddde [+ -] dd . Formatul % E utilizează E în loc de e .

% f

Un număr în virgulă mobilă a formularului [-] ddd.dddddd .

% g,% G

Utilizați % e sau % f conversie, oricare dintre acestea este mai scurtă, cu zerouri nesemnificative suprimate. Formatul % G utilizează % E în loc de % e .

% o

Un număr octal nesemnat (de asemenea un număr întreg).

% u Un număr zecimal nesemnat (din nou, un număr întreg).

% s

Un șir de caractere.

% x,% X

Un număr hexazecimal nesemnat (un număr întreg). Formatul % X utilizează ABCDEF în loc de abcdef .

%%

Un singur caracter % ; nici un argument nu este convertit.

Opțional, parametrii suplimentari pot fi între litera % și litera de control:

numără $

Utilizați argumentul contorului în acest moment în formatare. Acest lucru se numește un specificator de poziție și este destinat în primul rând pentru utilizarea în versiunile traduse ale șirurilor de format, și nu în textul original al unui program AWK. Este o prelungire.

-

Expresia ar trebui să fie lăsată justificată în câmpul său.

spaţiu

Pentru conversiile numerice, prefixul are valori pozitive cu un spațiu și valori negative cu un semn minus.

+

Semnul plus, folosit înainte de modificatorul de lățime (vezi mai jos), spune să furnizeze întotdeauna un semn pentru conversii numerice, chiar dacă datele care trebuie formatate sunt pozitive. + Suprascrie modificatorul de spațiu.

#

Utilizați un "formular alternativ" pentru anumite litere de control. Pentru % o , furnizați zero zero. Pentru % x și % X , furnizați un rezultat 0x sau 0X pentru un rezultat nonzero. Pentru % e , % E și % f , rezultatul conține întotdeauna un punct zecimal. Pentru % g , și % G , zerourile care urmează nu sunt eliminate din rezultat.

0

Un conducător 0 (zero) acționează ca un steag, care indică că ieșirea trebuie să fie căptușită cu zerouri în loc de spații. Acest lucru se aplică și în cazul formatelor de ieșire non-numerice. Acest steguleț are efect numai când lățimea câmpului este mai mare decât valoarea de imprimat.

lăţime

Câmpul trebuie căptușit până la această lățime. Câmpul este în mod obișnuit căptușit cu spații. Dacă a fost folosit stegulețul 0 , acesta este căptușit cu zerouri.

. prec

Un număr care specifică precizia de utilizat la imprimare. Pentru formatele % e , % E și % f , acest lucru specifică numărul de cifre pe care doriți să le imprimați în dreapta punctului zecimal. Pentru formatele % g și % G , acesta specifică numărul maxim de cifre semnificative. Pentru formatele % d , % o , % i , % u , % x și % X , se specifică numărul minim de cifre de imprimat. Pentru % s , specifică numărul maxim de caractere din șirul care trebuie imprimat.

Sunt acceptate lățimea dinamică și pre- capabilitățile rutinelor ANSI C printf () . A * în locul lățimii sau precizărilor determină ca valorile lor să fie luate din lista de argumente pentru printf sau sprintf () . Pentru a utiliza un specificator de poziție cu o lățime sau precizie dinamică, furnizați numărul $ după * în șirul de format. De exemplu, "% 3 $ * 2 $. * 1 $ s" .

Nume speciale de fișiere

Atunci când faci redirecționarea I / O din imprimare sau printf într-un fișier sau prin intermediul getline-ului dintr-un fișier, gawk recunoaște anumite nume de fișiere speciale în interior. Aceste nume de fișiere permit accesul la descriptorii de fișiere deschise, moștenite de la procesul de bază al lui Gawk (de obicei shell-ul). Aceste nume de fișiere pot fi utilizate și pe linia de comandă pentru a numi fișierele de date. Numele de fișiere sunt:

/ dev / stdin

Intrarea standard.

/ dev / stdout

Rezultatul standard.

/ dev / stderr

Eroarea standard a erorii.

/ dev / fd / n

Fișierul asociat cu descriptorul de fișiere deschis n .

Acestea sunt deosebit de utile pentru mesajele de eroare. De exemplu:

tipăriți "Ai explodat!" > "/ dev / stderr"

în timp ce altfel ar trebui să le folosiți

tipăriți "Ai explodat!" | "pisica 1> & 2"

Următoarele nume de fișiere speciale pot fi utilizate cu operatorul | & co-process pentru crearea conexiunilor de rețea TCP / IP.

/ inet / tcp / lport / rhost / rport

Fișier pentru conexiunea TCP / IP pe portul local lport către rhost gazdă de la distanță pe portul de la distanță rport . Utilizați un port de 0 pentru ca sistemul să aleagă un port.

/ inet / udp / lport / rhost / rport

Similar, dar utilizați UDP / IP în loc de TCP / IP.

/ inet / raw / lport / rhost / rport

Rezervat pentru utilizare ulterioară.

Alte nume de fișiere speciale permit accesul la informații despre procesul de navigare . Aceste nume de fișiere sunt acum învechite. Utilizați matricea PROCINFO pentru a obține informațiile pe care le furnizează. Numele de fișiere sunt:

/ dev / pid

Citirea acestui fișier returnează ID-ul procesului curent al procesului, în zecimal, încheiat cu o linie nouă.

/ dev / ppid

Citirea acestui fișier returnează ID-ul procesului părinte al procesului curent, în zecimal, terminat cu o linie nouă.

/ dev / pgrpid

Citirea acestui fișier returnează ID-ul grupului de proces al procesului curent, în zecimal, terminat cu o linie nouă.

/ dev / utilizator

Citirea acestui fișier returnează o singură înregistrare terminată cu o linie nouă. Câmpurile sunt separate cu spații. $ 1 este valoarea apelului de sistem getuid (2), 2 $ este valoarea apelului de sistem geteuid (2), 3 $ este valoarea apelului de sistem getgid (2) și 4 $ este valoarea getegidului (2) apel sistem. Dacă există câmpuri suplimentare, acestea sunt ID-urile grupului returnate de grupurile de achiziții (2). Este posibil ca mai multe grupuri să nu fie acceptate pe toate sistemele.

Funcții numerice

AWK are următoarele funcții aritmetice încorporate:

atan2 ( y , x )

Returnează arctangentul de y / x în radiani.

cos ( expr )

Returnează cosinusul expr , care este în radiani.

exp ( expr )

Funcția exponențială.

int ( expr )

Truncates la întreg.

log ( expr )

Funcția logaritmică naturală.

rand ()

Returnează un număr aleator între 0 și 1.

păcatul ( expr )

Returnează sinusul lui expr , care este în radiani.

sqrt ( expr )

Funcția rădăcină pătrată.

srand ( [ expr ] )

Utilizează expr ca o nouă sămânță pentru generatorul de numere aleatoare. În cazul în care nu este furnizată o expresie , se utilizează ora din zi. Valoarea returnată este semnul anterior pentru generatorul de numere aleatoare.

String Funcții

Gawk are următoarele funcții încorporate în șir:

asort ( s [ , d ] )

Returnează numărul elementelor din matricele sursă. Conținutul lui s este sortat folosind regulile normale ale lui gawk pentru compararea valorilor, iar indexurile valorilor sortate ale lui s sunt înlocuite cu numere secvențiale începând cu 1. Dacă este specificată matricea de destinație opțională d , atunci s este duplicată mai întâi în d , iar apoi d este sortat, lăsând indiciile matricei sursă neschimbată.

gensub ( r , s , h [ , t ] )

Căutați șirul țintă t pentru potrivirile expresiei regulate r . Dacă h este un șir care începe cu g sau G , înlocuiți toate potrivirile lui r cu s . În caz contrar, h este un număr care indică ce potrivire a r trebuie înlocuită. Dacă t nu este furnizat, se utilizează în schimb $ 0 . În cadrul textului de înlocuire s , secvența \ n , unde n este o cifră de la 1 la 9, poate fi utilizată pentru a indica doar textul care corespunde cu subexpresia paranteză n . Succesiunea \ 0 reprezintă întregul text asociat, ca și caracterul & . Spre deosebire de sub () și gsub () , șirul modificat este returnat ca rezultat al funcției, iar șirul țintă inițial nu este modificat.

gsub ( r , s [ , t ] )

Pentru fiecare subreversă care se potrivește expresiei regulate r în șirul t , înlocuiți șirul s și returnați numărul de substituții. Dacă t nu este furnizat, utilizați $ 0 . An & în textul înlocuit se înlocuiește cu textul care a fost efectiv adaptat. Utilizați \ & pentru a obține un literal & . (Aceasta trebuie să fie tastată ca "\\" ; a se vedea GAWK: Programarea eficientă a AWK pentru o discuție mai detaliată a regulilor pentru & s și backslash-uri în textul de înlocuire al sub () , gsub () și gensub ( )

indicele ( s , t )

Returnează indexul șirului t în șirul s sau 0 dacă t nu este prezent. (Aceasta implică faptul că indicii de caractere încep de la unu.)

lungime ( [ s ] )

Returnează lungimea șirului s sau lungimea lui $ 0 dacă s nu este furnizat.

meciul ( s , r [ , a ] )

Returnează poziția în s unde apare expresia regulată r sau 0 dacă r nu este prezentă și stabilește valorile RSTART și RLENGTH . Rețineți că ordinea argumentelor este aceeași ca pentru comanda ~ operator: str . Dacă array a este furnizat, a este șters și apoi elementele 1 până la n sunt umplute cu porțiunile lui s care se potrivesc cu subexpresia paranteză corespunzătoare în r . Elementul 0 al unui element a contine partea de s potrivita cu toata expresia regulata r .

împărțit ( s , a [ , r ] )

Împărțiți sirul în matricea a expresiei regulate r și returnează numărul de câmpuri. Dacă r este omisă, se folosește FS . Matricea a este eliminată mai întâi. Divizarea se comportă identic cu împărțirea câmpului, descrisă mai sus.

sprintf ( fmt , expr-list )

Imprimă expr-list în funcție de fmt și returnează șirul rezultat.

strtonum ( str )

Examinează str și returnează valoarea numerică. Dacă str începe cu o valoare 0 , strtonum () presupune că str este un număr octal. Dacă str începe cu 0x sau 0X , strtonum () presupune că str este un număr hexazecimal.

sub ( r , s [ , t ] )

La fel ca gsub () , dar numai primul substring de potrivire este înlocuit.

substr ( s , i [ , n ] )

Returnează cele mai multe n- caractere ale substringului lui s pornind de la i . Dacă n este omisă, restul s este folosit.

tolower ( str )

Returnează o copie a str stringului, cu toate caracterele majuscule în str traduse la omologii corespunzători ai acestora. Caracterele non-alfabetice sunt lăsate neschimbate.

toupper ( str )

Returnează o copie a str string-ului, cu toate caracterele minuscule în str traduse la corespondentele lor majore corespunzătoare. Caracterele non-alfabetice sunt lăsate neschimbate.

Funcții de timp

Deoarece una dintre utilizările primare ale programelor AWK este prelucrarea fișierelor de jurnal care conțin informații despre timbre, gawk oferă următoarele funcții pentru obținerea timbrelor și formatarea acestora.

mktime ( datespec )

Rurns datespec într-o ștampilă de timp a aceluiași formular ca returnat de systime () . Datepec este un șir de formular YYYY MM DD HH MM SS [DST] . Conținutul șirului de caractere este de șase sau șapte numere reprezentând respectiv întregul an, inclusiv secolul, luna de la 1 la 12, ziua din lună de la 1 la 31, ora din zi de la 0 la 23, minutul de la 0 la 59, iar cel de-al doilea de la 0 la 60 și un steag opțional de economisire a zilei. Valorile acestor numere nu trebuie să se încadreze în intervalele specificate; de exemplu, o oră de -1 înseamnă o oră înainte de miezul nopții. Se presupune calendarul gregorian de origine zero, cu anul 0 care precede anul 1 și anul -1 precedent anul 0. Timpul se presupune a fi în fusul orar local. Dacă steagul de vară este pozitiv, timpul este considerat a fi ora de vară; dacă zero, timpul este considerat a fi timpul standard; și dacă este negativă (implicit), mktime () încearcă să determine dacă timpul de vară este valabil pentru timpul specificat. Dacă datespec nu conține elemente suficiente sau dacă timpul rezultat este în afara intervalului, mktime () returnează -1.

strftime ( [ format [ , timestamp ]] )

Formează marcajul temporal conform specificațiilor în format. Eticheta de timp ar trebui să fie de aceeași formă ca cea returnată de systime () . Dacă lipsește marca de timp , se utilizează ora curentă a zilei. Dacă lipsește formatul , se folosește un format prestabilit echivalent cu data de ieșire (1). Vedeți specificația pentru funcția strftime () din ANSI C pentru conversiile de format care sunt garantate ca fiind disponibile. O versiune de domeniu public a strftime (3) și o pagină de om pentru ea vine cu gawk ; dacă acea versiune a fost folosită pentru a construi gawk , atunci toate conversiile descrise în acel man page sunt disponibile pentru gawk.

systime ()

Returnează ora curentă a zilei ca numărul de secunde de la Epoch (1970-01-01 00:00:00 UTC pe sistemele POSIX).

Funcții de manipulare a bitilor

Începând cu versiunea 3.1 a gawk , sunt disponibile următoarele funcții de manipulare a biților. Ei lucrează prin convertirea valorilor în virgulă mobilă cu dublă precizie la numere întregi nesemnate , efectuând operația și apoi convertindu-l înapoi în punctul mobil. Funcțiile sunt:

și ( v1 , v2 )

Returnați bitul AND al valorilor furnizate de v1 și v2 .

compl ( val )

Returnați complementul biți de val .

lshift ( val , număr )

Întoarceți valoarea valului , deplasată la stânga de numărul de biți.

sau ( v1 , v2 )

Returnați biți OR din valorile furnizate de v1 și v2 .

rshift ( val , număr )

Returnați valoarea valului , deplasată dreapta de către biții de numărare .

xor ( v1 , v2 )

Returnați valoarea XOR în biți a valorilor furnizate de v1 și v2 .

Funcțiile de internaționalizare

Începând cu versiunea 3.1 a gawk , următoarele funcții pot fi utilizate din programul dvs. AWK pentru traducerea șirurilor în timpul execuției. Pentru detalii complete, consultați GAWK: Programare eficientă AWK .

bindtextdomeniu ( director [ , domeniu ] )

Specifică directorul în care gawk caută fișierele .mo , în cazul în care nu vor fi sau nu pot fi plasate în locațiile `` standard '' (de exemplu, în timpul testelor). Returnează directorul în care domeniul este "legat".

Domeniul implicit este valoarea TEXTDOMAIN . Dacă directorul este șirul nul ( "" ), atunci bindtextdomain () returnează legarea curentă pentru domeniul dat.

dcgettext ( șir [ , domeniu [ , categorie ]] )

Returnează traducerea șirului în domeniul domeniului de text pentru categoria de categorii locale. Valoarea implicită pentru domeniu este valoarea curentă a TEXTDOMAIN . Valoarea implicită pentru categorie este "LC_MESSAGES" .

Dacă furnizați o valoare pentru categorie , trebuie să fie un șir egal cu una dintre categoriile de locații cunoscute descrise în GAWK: Programarea eficientă AWK . De asemenea, trebuie să furnizați un domeniu de text. Utilizați TEXTDOMAIN dacă doriți să utilizați domeniul curent.

dcngettext (șir1 , șir2 , număr [ , domeniu [ , categorie ]] )

Returnează forma plurală folosită pentru numărul de traduceri ale string1 și string2 în domeniul domeniului de text pentru categoria categoriei locale. Valoarea implicită pentru domeniu este valoarea curentă a TEXTDOMAIN . Valoarea implicită pentru categorie este "LC_MESSAGES" .

Dacă furnizați o valoare pentru categorie , trebuie să fie un șir egal cu una dintre categoriile de locații cunoscute descrise în GAWK: Programarea eficientă AWK . De asemenea, trebuie să furnizați un domeniu de text. Utilizați TEXTDOMAIN dacă doriți să utilizați domeniul curent.

FUNCȚII DEFINITE DE UTILIZATOR

Funcțiile din AWK sunt definite după cum urmează:

nume de funcție ( lista parametrilor ) { statements }

Funcțiile sunt executate atunci când sunt chemați din interiorul expresiilor în modele sau acțiuni. Parametrii actuali furnizați în apelul pentru funcții sunt utilizați pentru a instanțializa parametrii formali declarați în funcție. Arrays sunt transmise prin referință, alte variabile sunt transmise prin valoare.

Deoarece funcțiile nu erau inițial parte a limbajului AWK, prevederea pentru variabilele locale este destul de neclară: ele sunt declarate ca parametri suplimentari în lista de parametri. Convenția este de a separa variabilele locale de parametrii reali prin spații suplimentare în lista de parametri. De exemplu:

funcția f (p, q, a, b) # a și b sunt locale {...} / abc / {...; f (1, 2); ...}

Paranteza stângă într-un apel pentru funcții este necesară pentru a urmări imediat numele funcției, fără spațiu alb care intervine. Aceasta este pentru a evita ambiguitatea sintactică cu operatorul de concatenare. Această restricție nu se aplică funcțiilor integrate enumerate mai sus.

Funcțiile se pot apela reciproc și pot fi recursive. Parametrii funcției utilizați ca variabile locale sunt inițializați la șirul nul și numărul zero la invocarea funcțiilor.

Utilizați retur expr pentru a returna o valoare dintr-o funcție. Valoarea returnată este nedefinită dacă nu este furnizată nicio valoare sau dacă funcția revine prin "` abandonat "'la capăt.

Dacă a fost furnizat - lint, Gawk avertizează despre apelurile la funcții nedefinite la timpul de analiză, în loc de timpul de execuție. Apelarea unei funcții nedefinite la timpul de execuție este o eroare fatală.

Cuvântul func poate fi folosit în locul funcției .

DIMNAMIC ÎNCHIDEREA FUNCȚIILOR NOI

Începând cu versiunea 3.1 de gawk , puteți adăuga dinamic noi funcții încorporate la interpretul de gawk care rulează. Detaliile complete sunt dincolo de domeniul de aplicare al acestei pagini de manual; consultați GAWK: Programarea eficientă AWK pentru detalii.

extensie ( obiect , funcție )

Legați dinamic fișierul obiect partajat numit de obiect și invoca funcția din acel obiect pentru a efectua inițializarea. Acestea ar trebui să fie furnizate atât ca șiruri de caractere. Returnează valoarea returnată de funcție .

Această funcție este furnizată și documentată în GAWK: Programarea eficientă AWK , dar totul despre această caracteristică este probabil să se schimbe în următoarea versiune. Vă recomandăm IMEDIAT să nu utilizați această funcție pentru nimic pe care nu doriți să îl refaceți.

SEMNALE

pgawk acceptă două semnale. SIGUSR1 o provoacă să anuleze un stack de apeluri de profil și de funcții în fișierul de profil, care este fie awkprof.out , fie orice fișier a fost numit cu opțiunea --profile . Apoi continuă să curgă. SIGHUP determină să se scurgă stivele de apeluri de profil și de funcții și apoi să iasă.

EXEMPLE

Imprimați și sortați numele de conectare ale tuturor utilizatorilor: BEGIN {FS = ":"} {print $ 1 | " {nlines ++} END {print nlines} Precedeaza fiecare linie dupa numarul din fisier: {print FNR, $ 0} Concatenare si numar linie (o variatie pe o tema): {print NR, $ 0}

internalizarea

Constantele de coarde sunt secvențe de caractere închise în ghilimele duble. În mediile care nu vorbesc limba engleză, este posibilă marcarea șirurilor din programul AWK ca necesitând traducere în limba naturală. Astfel de șiruri sunt marcate în programul AWK cu un underscore principal (`` _ ''). De exemplu,

gawk 'BEGIN {print "salut, lume"}'

imprimă întotdeauna salut, lume . Dar,

gawk 'BEGIN {print _ "salut, lume"}'

ar putea tipări bonjour, monde în Franța.

Există mai mulți pași implicați în producerea și rularea unui program localizabil AWK.

1.

Adăugați o acțiune BEGIN pentru a atribui o valoare variabilei TEXTDOMAIN pentru a seta domeniul de text la un nume asociat programului dvs.


ÎNCEPE {TEXTDOMAIN = "myprog"}

Acest lucru vă permite să găsiți fișierul .mo asociat programului dvs. Fără acest pas, gawk utilizează domeniul de mesaje al mesajelor , care probabil nu conține traduceri pentru programul dvs.

2.

Marcați toate șirurile care ar trebui să fie traduse cu sublinieri de conducere.

3.

Dacă este necesar, utilizați funcțiile dcgettext () și / sau bindtextdomain () din programul dvs., după caz.

4.

Porniți gawk --gen-po -f myprog.awk> myprog.po pentru a genera un fișier .po pentru programul dvs.

5.

Furnizați traducerile corespunzătoare și construiți și instalați un fișier .mo corespunzător.

Caracteristicile de internaționalizare sunt descrise în detaliu în GAWK: Programarea eficientă AWK .

Posibilitate de compatibilitate

Un obiectiv principal pentru gawk este compatibilitatea cu standardul POSIX, precum și cu cea mai recentă versiune de UNIX awk . În acest scop, gawk încorporează următoarele caracteristici vizibile ale utilizatorilor, care nu sunt descrise în cartea AWK, ci fac parte din versiunea Bell a laboratoarelor awk și se află în standardul POSIX.

Cartea indică faptul că atribuirea variabilei de linie de comandă se întâmplă atunci când awk ar deschide altfel argumentul ca fișier, care este după executarea blocului BEGIN . Cu toate acestea, în implementările anterioare, când o astfel de alocare a apărut înainte de orice nume de fișier, atribuirea s-ar întâmpla înainte ca blocul BEGIN să fie rulat. Aplicațiile au ajuns să depindă de această caracteristică. "Când awk a fost schimbat pentru a se potrivi cu documentația sa, opțiunea -v pentru atribuirea variabilelor înainte de execuția programului a fost adăugată pentru a se potrivi aplicațiilor care depind de vechiul comportament. (Această caracteristică a fost convenită atât de Bell Laboratories, cât și de dezvoltatorii GNU.)

Opțiunea -W pentru caracteristicile specifice de implementare este din standardul POSIX.

La procesarea argumentelor, gawk folosește opțiunea specială `` - '' pentru a semnala sfârșitul argumentelor. În modul de compatibilitate, avertizează, dar în caz contrar ignoră opțiunile nedefinite. În funcționarea normală, astfel de argumente sunt transmise programului AWK pentru ca acesta să poată fi procesat.

Cartea AWK nu definește valoarea returnată a srand () . Standardul POSIX îl returnează pe semințele pe care le folosea, pentru a permite urmărirea secvențelor de numere aleatorii. De aceea, srand () in gawk isi returneaza si samanta actuala.

Alte caracteristici noi sunt: ​​Utilizarea opțiunilor multiple- f (de la MKS awk ); matricea ENVIRON ; secvențele \ a , și \ v de evacuare (realizate inițial în gawk și alimentate înapoi în versiunea Bell Laboratories); tolower () și toupper () funcții încorporate (din versiunea Bell Laboratories); și specificațiile de conversie ANSI C în printf (realizate mai întâi în versiunea Bell Laboratories).

Caracteristici istorice

Există două caracteristici ale implementărilor istorice AWK pe care le susține. Mai întâi, este posibil să apelați funcția built-in lungime () nu numai fără argument, ci chiar fără paranteze! Prin urmare,

a = lungime # Holy Algol 60, Batman!

este la fel ca oricare dintre

a = lungime ()
a = lungime ($ 0)

Această caracteristică este marcată ca fiind "depreciată" în standardul POSIX, iar Gawk emite un avertisment despre utilizarea sa dacă --lint este specificat pe linia de comandă.

Cealaltă caracteristică este folosirea fie a instrucțiunilor continue, fie a pauzelor în afara corpului unui timp , pentru sau a face o buclă. Aplicațiile tradiționale AWK au tratat o astfel de utilizare ca fiind echivalentă cu următoarea declarație. Gawk acceptă această utilizare dacă este specificat - tradițional .

Extensiile GNU

Gawk are o serie de extensii la POSIX awk . Acestea sunt descrise în această secțiune. Toate extensiile descrise aici pot fi dezactivate prin invocarea opțiunii - opțiune tradițională .

Următoarele caracteristici ale gawk nu sunt disponibile în POSIX awk .

*

Nu se efectuează căutarea unei căi pentru fișierele numite prin opțiunea -f . Prin urmare, variabila de mediu AWKPATH nu este specială.

*

Secvența de evacuare \ x . (Dezactivat cu --posix .)

*

Funcția fflush () . (Dezactivat cu --posix .)

*

Capacitatea de a continua liniile după ? și :. (Dezactivat cu --posix .)

*

Constante octale și hexazecimale în programele AWK.

*

Variabilele ARGIND , BINMODE , ERNNO , LINT , RT și TEXTDOMAIN nu sunt speciale.

*

Variabila IGNORECASE și efectele sale secundare nu sunt disponibile.

*

Lungimea câmpului FIELDWIDTHS variabilă și lățimea fixă.

*

Matricea PROCINFO nu este disponibilă.

*

Utilizarea RS ca expresie regulată.

*

Numele de fișier speciale disponibile pentru redirecționarea I / O nu sunt recunoscute.

*

Operatorul | & pentru a crea co-procese.

*

Abilitatea de a împărți caracterele individuale folosind șirul nul ca valoare a FS , și ca al treilea argument pentru divizare () .

*

Al doilea argument opțional pentru funcția close () .

*

Al treilea argument opțional pentru funcția de potrivire () .

*

Abilitatea de a utiliza specificatori pozitivi cu printf și sprintf () .

*

Utilizarea matricei de ștergere pentru a șterge întregul conținut al unui tablou.

*

Folosirea următorului fișier pentru a abandona procesarea fișierului de intrare curent.

*

Și () , asort () , bindtextdomain () , compl () , dcgettext () , gensub () , lshift () și xor () .

*

Butoane de identificare.

*

Adăugarea de funcții noi încorporate dinamic cu funcția extensie () .

Cartea AWK nu definește valoarea returnată a funcției close () . Gawk 's close () returnează valoarea din fclose (3), sau pclose (3), atunci când închideți un fișier de ieșire sau respectiv o țeavă. Aceasta returnează starea de ieșire a procesului atunci când închideți o conductă de intrare. Valoarea returnată este -1 dacă fișierul numit, țeavă sau co-proces nu a fost deschis cu o redirecționare.

Când gawk este invocat cu opțiunea --traditional , dacă argumentul fs la opțiunea -F este `` t '', atunci FS este setat la caracterul tab. Rețineți că tastând gawk -F \ t ... pur și simplu face shell-ul să citeze `` t '' și nu trece `` \ t '' la opțiunea -F . Deoarece acesta este un caz deosebit de urât, nu este comportamentul implicit. Acest comportament nu apare, de asemenea, dacă a fost specificat --posix . Pentru a obține într-adevăr un caracter tab ca separator de câmp, cel mai bine este să folosiți citate simple: gawk -F '\ t' ....

Vedeți alte comenzi : așteptați , lp , completă , execv , getfacl , ioctl , uniq , rmmod , pvcreate , rsh , unix2dos , cal , fs , cd iwpriv swapon autofs talk motd free lpr execl fdisk , la , cine , iwconfig , ifconfig , vgdisplay , open , lsmod , ntohs , mailq , kill , wtmp