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