Az awk kézikönyv szerint a BEGIN és az END nem a bemenet egyeztetésére szolgál, hanem az indítás és a tiszta működés biztosítására. -Up információk az awk szkripthez. Itt van a példa:
ls -l | \ awk "BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }" Files found: amd.conf antivir.conf xcdroast.conf xinetd.conf
Először ez nyomtat egy karaktersorozatot. Ezután ellenőrzi a bemenetet, hogy van-e minta egyezés, ahol a bemenet egy vagy egy x-el kezdődik, amelyet bármely karakter követ, egy vagy többször pedig a .conf. Bármilyen egyezés esetén a 9. oszlop van kinyomtatva.
Az a tény, hogy kénytelenek vagyunk használni, itt kezdődik, ez azt jelenti, hogy az awk legfeljebb egy olyan nyomtatási funkciót használhat, amely tartalmaz BEGIN vagy END? Ha nem, akkor miért nem használhatjuk csak a nyomtatási funkciót az elején a BEGIN kulcsszó nélkül? Úgy tűnik, hogy a BEGIN felesleges.
Megjegyzések
- A parancs egyszerű futtatása a BEGIN nélkül megválaszolja a kérdését, megmutatva, hogy ez ' nem felesleges, és hogy más eredményt kapna.
Válasz
A BEGIN
nem felesleges. Ha nem adja meg a BEGIN
elemet, akkor a print
minden bemeneti sorra végrehajtásra kerül.
Idézés a kézikönyv :
A
BEGIN
szabályt csak egyszer hajtják végre, mielőtt az első bemeneti rekordot elolvassák. Hasonlóképpen, egyEND
szabályt csak egyszer hajtanak végre, miután az összes bevitelt elolvasta.
$ 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 $
Válasz
awk
a mindegyik bemenetsort feldolgozza a testben megadott kifejezésekhez, a és END
blokkok. BEGIN
és END
esetén blokkok, awk
csak egyszer dolgozza fel az utasításokat, még mielőtt megkezdődött volna az input feldolgozása és miután az input feldolgozása megtörtént ektív módon. A BEGIN
blokk nélkül nemcsak hogy nem tudna egyszeri információkat kinyomtatni, például fejléceket, és nem is lehetne hatékonyan inicializálni a test által megkövetelt néhány változót. Emellett az FYI, egy awk
programnak több BEGIN
és END
blokkja is lehet.
Válasz
awk
minden blokkot csak akkor hajt végre, ha a minta megegyezik. Az üres minta (csak blokkolja) minden sornak megfelel. A BEGIN
és a END
speciális minták, amelyek illeszkednek a fájl elejéhez és végéhez (analóg a ^
és $
vízszintes irányban).
Ha a fájl elolvasása előtt végre akar hajtani valamit, használja a BEGIN
. Például a számlálók inicializálása vagy valami hasonló. END
ezután összegyűjtheti az eredményeket.
Válasz
A megadott példában ami szerintem a pedagógiai egyértelműség érdekében leegyszerűsített, abban igazad van, hogy felesleges. Ugyanazokat az eredményeket érheti el a BEGIN
használata nélkül.
1 == NR { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }
ugyanazokat az eredményeket produkálná, mivel a nyomtatási utasítás csak az első beviteli sorra szorítkozik.
Ennek ellenére a BEGIN
és a END
blokkok hihetetlenül erősek eszközök. Amint más megoldások említették, az BEGIN
blokk segítségével inicializálhatja a változókat vagy más rutinokat, amelyeket csak egyszer kell végrehajtani, de fel lehet használni Awk parancsok futtatására is, ha nincsenek feldolgozandó fájlok. Egyszerű példa:
BEGIN { print sqrt(12/4) }
egy komolyabb példát láthat az Awk programozására, anélkül, hogy bármilyen bemenetet kezelne itt .
Hasonlóképpen, a END
blokk rendkívül hasznos a számítások elvégzéséhez és az összes bemenet összefoglalásához. Ez nem hajtható végre (általában) az összes adat első olvasása nélkül. A bemenet összegzésének egyszerű példája található itt