BEGIN și END cu comanda awk

Conform manualului awk, BEGIN și END nu sunt folosite pentru a potrivi intrările, ci mai degrabă pentru a oferi pornire și curățare -informații suplimentare pentru scriptul awk. Iată exemplul dat:

ls -l | \ awk "BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }" Files found: amd.conf antivir.conf xcdroast.conf xinetd.conf 

Mai întâi, acesta imprimă un șir de ieșit. Apoi verifică intrarea pentru o potrivire de tipar, unde intrarea începe cu a sau x urmată de orice caracter de una sau de multe ori urmată de .conf. Pentru orice potrivire, coloana a 9-a este tipărită.

Faptul că suntem forțați să folosim începe aici, înseamnă că awk poate folosi cel mult o funcție de imprimare care conține un BEGIN sau END? Dacă nu, atunci de ce nu putem folosi doar funcția de imprimare la început fără cuvântul cheie BEGIN? Se pare că BEGIN este de prisos.

Comentarii

  • Pur și simplu executarea comenzii fără BEGIN ar răspunde la întrebarea dvs., arătând că ' nu este de prisos și că veți obține un rezultat diferit.

Răspuns

BEGIN nu este de prisos. Dacă nu specificați BEGIN atunci print va fi executat pentru fiecare linie de intrare.

Citat din manual :

A BEGIN regula se execută o singură dată, înainte ca prima înregistrare de intrare să fie citită. La fel, o regulă END se execută o singură dată, după citirea tuturor intrărilor.

$ seq 5 | awk "BEGIN{print "Hello"}/4/{print}" # Hello printed once Hello 4 $ seq 5 | awk "{print "Hello"}/4/{print}" # Hello printed for each line of input Hello Hello Hello Hello 4 Hello $ 

Răspuns

awk procesează fiecare linie de intrare pentru expresiile date în corp, altele decât BEGIN și END blocuri. În cazul BEGIN și END blocuri, awk va procesa instrucțiunile o singură dată, înainte de a începe procesarea intrării și după ce procesarea intrării a fost efectuată resp. ectiv. Fără blocul BEGIN, nu numai că nu ați putea imprima informații unice, cum ar fi anteturile, nu ați putea inițializa eficient unele dintre variabilele solicitate de corp. De asemenea, FYI, un program awk poate avea mai multe blocuri BEGIN și END.

Răspuns

awk execută fiecare bloc numai atunci când modelul dinaintea acestuia se potrivește. Modelul gol (doar bloc) se potrivește cu fiecare linie. BEGIN și END sunt modele speciale care se potrivesc cu începutul și sfârșitul fișierului (analog cu semnificația ^ și $ în direcție orizontală).

Dacă doriți să executați ceva înainte de a citi fișierul, utilizați BEGIN. De exemplu, inițializarea contoarelor sau ceva de genul. END ar putea apoi să adune rezultatele.

Răspuns

În exemplul dat, ceea ce cred că este simplificat pentru claritate pedagogică, aveți dreptate că este de prisos. Ați putea obține aceleași rezultate fără a utiliza BEGIN.

1 == NR { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 } 

ar produce aceleași rezultate, deoarece declarația print este constrâns doar la prima linie de intrare.

Acestea fiind spuse, blocurile BEGIN și END sunt incredibil de puternice instrumente. Așa cum au menționat alte soluții, puteți utiliza blocul BEGIN pentru a inițializa variabile sau alte rutine care trebuie efectuate doar o singură dată, dar poate fi utilizat și pentru a rula comenzi Awk atunci când nu există fișiere de procesat. Un exemplu simplu:

BEGIN { print sqrt(12/4) } 

Puteți vedea un exemplu mai serios de programare în Awk fără a procesa nicio intrare aici .

La fel, blocul END este extrem de util pentru efectuarea calculelor și rezumarea tuturor intrărilor. Acest lucru nu se poate face (de obicei) fără prima citire a tuturor datelor. Un exemplu simplu de rezumare a intrărilor poate fi găsit aici

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *