BEGIN és END az awk paranccsal

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, egy END 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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük