Zgodnie z instrukcją awk BEGIN i END nie są używane do dopasowania danych wejściowych, ale raczej do dostarczania informacji o uruchamianiu i czyszczeniu do skryptu awk. Oto podany przykład:
ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf
Najpierw wypisuje ciąg do wyjścia. Następnie sprawdza dane wejściowe pod kątem dopasowania wzorca, gdzie dane wejściowe zaczynają się od a lub x, po którym następuje jeden lub wiele znaków, po których następuje .conf. Dla dowolnych dopasowań drukowana jest 9. kolumna.
Czy to oznacza, że awk może używać tylko jednej funkcji drukowania, która zawiera BEGIN lub END? Jeśli nie, to dlaczego nie możemy po prostu użyć funkcji drukowania na początku bez słowa kluczowego BEGIN? Wygląda na to, że BEGIN jest zbędny.
Odpowiedzi:
To
BEGIN
nie jest zbyteczne. Jeśli użytkownik nie określiBEGIN
wówczasprint
byłyby wykonywane dla każdej linii wejścia.Cytowanie z instrukcji :
źródło
awk
przetwarza każdy wiersz danych wejściowych dla wyrażeń podanych w treści innych niżBEGIN
iEND
bloki. W przypadkuBEGIN
iEND
bloków,awk
instrukcje będą przetwarzane tylko raz, przed rozpoczęciem przetwarzania danych wejściowych i odpowiednio po przetworzeniu danych wejściowych. Bez tegoBEGIN
bloku nie tylko nie byłbyś w stanie wydrukować jednorazowych informacji, takich jak nagłówki, ale nie byłbyś w stanie skutecznie zainicjować niektórych zmiennych wymaganych przez ciało. Ponadto, FYI,awk
program może mieć wielokrotneBEGIN
iEND
bloków.źródło
awk
wykonuje każdy blok tylko wtedy, gdy wzorzec przed nim pasuje. Pusty wzór (tylko blok) pasuje do każdej linii.BEGIN
iEND
są specjalnymi wzorami, które pasują do początku i końca pliku (analogicznie do znaczenia^
i$
w kierunku poziomym).Jeśli chcesz coś wykonać przed odczytaniem pliku, użyj
BEGIN
. Na przykład inicjalizacja liczników lub coś takiego.END
może następnie zebrać wyniki.źródło
W podanym przykładzie, który moim zdaniem jest uproszczony dla jasności pedagogicznej, masz rację, że jest zbyteczny. Możesz uzyskać te same wyniki bez użycia
BEGIN
.dałoby takie same wyniki, ponieważ instrukcja print jest ograniczona tylko do pierwszego wiersza danych wejściowych.
Biorąc to pod uwagę, bloki
BEGIN
iEND
są niezwykle potężnymi narzędziami. Jak wspomniano w innych rozwiązaniach, można użyćBEGIN
bloku do zainicjowania zmiennych lub innych procedur, które należy wykonać tylko raz, ale można go również użyć do uruchomienia poleceń Awk, gdy nie ma plików do przetworzenia. Prosty przykład:Możesz zobaczyć poważniejszy przykład programowania w Awk bez przetwarzania jakichkolwiek danych tutaj .
Podobnie,
END
blok jest niezwykle przydatny do wykonywania obliczeń i podsumowywania wszystkich danych wejściowych. Nie można tego zrobić (zwykle) bez pierwszego odczytu wszystkich danych. Prosty przykład podsumowania danych wejściowych można znaleźć tutajźródło