BEGIN ja END awk-komennolla

awk-käsikirjan mukaan BEGIN- ja END-näppäimiä ei käytetä syötteen sovittamiseen, vaan pikemminkin käynnistämisen ja puhdistuksen aikaansaamiseen. -tiedot awk-komentosarjaan. Tässä on annettu esimerkki:

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

Ensin tämä tulostaa merkkijonon tulostettavaksi. Sitten se tarkistaa syötteen vastaavuuden kuvion kohdalla, jossa syötteen alussa on a tai x ja mitä tahansa merkkiä yksi tai useita kertoja .conf. Kaikille osumille 9. sarake tulostetaan.

Se, että meidän on pakko käyttää, alkaa tästä, tarkoittaakö se, että awk voi käyttää vain yhtä tulostustoimintoa, joka sisältää BEGIN tai END? Jos ei, niin miksi emme voi käyttää vain tulostustoimintoa alussa ilman avainsanaa BEGIN? Vaikuttaa siltä, että BEGIN on tarpeeton.

Kommentit

  • Komennon yksinkertainen suorittaminen ilman ALKUA vastaisi kysymykseesi, mikä osoittaisi, että se ' ei ole turhaa ja että saat toisenlaisen tuloksen.

vastaus

BEGIN ei ole tarpeeton. Jos et määritä BEGIN, print suoritetaan jokaiselle syöteriville.

Lainaus käsikirja :

A BEGIN sääntö suoritetaan vain kerran, ennen kuin ensimmäinen syötetietue luetaan. Samoin END -sääntö suoritetaan vain kerran, kun kaikki syötteet on luettu.

$ 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 $ 

Vastaa

awk käsittelee kukin syöterivin muissa rungossa kuin ja END -lohkot. BEGIN ja END lohkot, awk käsittelee lauseet vain kerran, ennen kuin syötteen käsittely on aloitettu ja kun syötteen käsittely on suoritettu ectively. Ilman BEGIN -lohkoa, et vain voi tulostaa kertaluonteisia tietoja, kuten otsikot, et myöskään voi alustaa tehokkaasti joitain kehon vaatimia muuttujia. Lisäksi FYI: ssä, awk -ohjelmassa voi olla useita BEGIN – ja END -lohkoja.

Vastaus

awk suorittaa jokaisen lohkon vain, kun kuvio ennen sitä vastaa. Tyhjä kuvio (vain estää) vastaa kaikkia rivejä. BEGIN ja END ovat erityisiä kuvioita, jotka vastaavat tiedoston alkua ja loppua (analoginen ^ ja $ vaakasuunnassa).

Jos haluat jotain suoritettavaa ennen tiedoston lukemista, käytä BEGIN. Esimerkiksi laskurien alustaminen tai jotain muuta. END voisi sitten kerätä tulokset.

Vastaa

Annetussa esimerkissä mielestäni sitä on yksinkertaistettu pedagogisen selkeyden vuoksi, olet oikeassa, että se on tarpeetonta. Voit saada samat tulokset käyttämättä BEGIN.

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

tuottaisi samat tulokset, koska tulostuslauseke on rajoitettu vain ensimmäiselle syöteriville.

Tästä huolimatta BEGIN ja END -lohkot ovat uskomattoman tehokkaita työkalut. Kuten muut ratkaisut ovat maininneet, voit käyttää BEGIN -lohkoa muuttujien tai muiden rutiinien alustamiseen, jotka on suoritettava vain kerran, mutta sitä voidaan käyttää myös Awk-komentojen suorittamiseen, kun niitä ei ole käsiteltävät tiedostot. Yksinkertainen esimerkki:

BEGIN { print sqrt(12/4) } 

Näet vakavamman esimerkin ohjelmoinnista Awkissa käsittelemättä mitään syötettä täällä .

Vastaavasti END -lohko on erittäin hyödyllinen laskelmien suorittamisessa ja kaiken syötteen yhteenvedossa. Tätä ei voi tehdä (yleensä) lukematta ensin kaikkia tietoja. Yksinkertainen esimerkki syötteen yhteenvedosta löytyy täältä

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *