BÖRJA och SLUT med kommandot awk

Enligt awk-handboken används BEGIN och END inte för att matcha ingången, utan för att ge start och rengöring -upp information till awk-skriptet. Här är exemplet:

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

Först skriver detta ut en sträng för utmatning. Sedan kontrolleras ingången för en mönstermatchning, där ingången börjar med a eller x följt av valfritt tecken en eller flera gånger följt av .conf. För alla matchningar skrivs den nionde kolumnen ut.

Det faktum att vi tvingas använda börjar här, betyder det att awk bara kan använda högst en utskriftsfunktion som innehåller en BEGIN eller END? Om inte, varför kan vi inte använda utskriftsfunktionen i början utan nyckelordet BÖRJA? Det verkar som BÖRJET är överflödigt.

Kommentarer

  • Att bara köra kommandot utan BEGIN svarar på din fråga och visar att det ' inte är överflödigt och att du får ett annat resultat.

Svar

BEGIN är inte överflödig. Om du inte anger BEGIN kommer print att köras för varje ingångsrad.

Citat från manual :

A BEGIN regel exekveras bara en gång innan den första ingångsposten läses. Likaså exekveras en END -regel bara en gång, efter allt ingången har lästs.

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

Svar

awk bearbetar varje ingångsrad för de uttryck som ges i kroppen förutom BEGIN och END block. När det gäller BEGIN och END block, awk bearbetar uttalandena bara en gång innan behandlingen av inmatningen har börjat och efter att behandlingen av inmatningen har gjorts resp ektivt. Utan blocket BEGIN skulle du inte bara kunna skriva ut engångsinformation, t.ex. rubriker, utan du skulle heller kunna initiera några av de variabler som krävs av kroppen effektivt. Även FYI, ett awk -program kan ha flera BEGIN och END -block.

Svar

awk kör bara varje block när mönstret före det matchar. Tomt mönster (bara blockera) matchar varje rad. BEGIN och END är speciella mönster som matchar början och slutet av filen (analogt med innebörden av ^ och $ i horisontell riktning).

Om du vill att något ska köras innan du läser filen, använd BEGIN. Till exempel initialisering av räknare eller något. END kunde sedan samla in resultaten.

Svar

I det givna exemplet, som jag tycker är förenklat för pedagogisk tydlighet, har du rätt i att det är överflödigt. Du kan få samma resultat utan att använda BEGIN.

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

skulle ge samma resultat eftersom utskriftsuttalandet är begränsad till bara den första inmatningsraden.

Med detta sagt är BEGIN och END blocken otroligt kraftfulla verktyg. Som andra lösningar har nämnt kan du använda BEGIN -blocket för att initiera variabler eller andra rutiner som bara behöver utföras en gång men det kan också användas för att köra Awk-kommandon när det inte finns någon filer att bearbeta. Ett enkelt exempel:

BEGIN { print sqrt(12/4) } 

Du kan se ett mer seriöst exempel på programmering i Awk utan att bearbeta någon ingång här .

På samma sätt är END blocket extremt användbart för att utföra beräkningar och sammanfatta alla inmatningar. Detta kan ”inte göras (vanligtvis) utan att först ha läst all information. Ett enkelt exempel på sammanfattande ingång finns här

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *