In Deel 8 van deze Awk-serie, hebben we een aantal krachtige Awk-opdrachtfuncties geïntroduceerd, namelijk: variabelen, numerieke uitdrukkingen en toewijzingsoperators.
Naarmate we verder komen, zullen we in dit segment meer behandelen Awk kenmerken, en dat zijn de speciale patronen: BEGINNEN
en EINDE
.
Deze speciale functies zullen nuttig zijn als we proberen uit te breiden en meer methoden voor het bouwen van complexe te verkennen Awk activiteiten.
Laten we om te beginnen onze gedachten terugbrengen naar de introductie van de Awk serie, weet je nog toen we aan deze serie begonnen, ik erop wees dat de algemene syntaxis van een lopende en Awk commando is:
# awk 'script' bestandsnamen
En in de syntaxis hierboven, de Awk script heeft de vorm:
/patroon/ { acties }
Wanneer je het patroon in het script beschouwt, is het normaal gesproken een reguliere expressie, daarnaast kun je patroon ook zien als speciale patronen BEGINNEN
en EINDE
. Daarom kunnen we ook een schrijven Awk opdracht in het onderstaande formulier:
awk ' BEGIN { acties } /patroon/ { acties } /patroon/ { acties } ………. END { acties } ' bestandsnamen
In het geval dat u de speciale patronen gebruikt: BEGINNEN
en EINDE
in een Awk script, dit is wat elk van hen betekent:
En de stroom van uitvoering van de an Awk opdrachtscript dat deze speciale patronen bevat, is als volgt:
BEGINNEN
patroon wordt gebruikt in een script, alle acties voor BEGINNEN worden eenmaal uitgevoerd voordat een invoerregel wordt gelezen.EINDE
patroon, worden de actie(s) uitgevoerd.U moet altijd deze volgorde van uitvoering onthouden wanneer u met de speciale patronen werkt om de beste resultaten in een Awk operatie.
Om het allemaal te begrijpen, laten we het illustreren aan de hand van het voorbeeld van deel 8, over de lijst met domeinen die eigendom zijn van Tecmin, zoals opgeslagen in een bestand met de naam domeinen.txt.
nieuws.tecmint.com. tecmint.com. linuxsay.com. windows.tecmint.com. tecmint.com. nieuws.tecmint.com. tecmint.com. linuxsay.com. tecmint.com. nieuws.tecmint.com. tecmint.com. linuxsay.com. windows.tecmint.com. tecmint.com.
$ kat ~/domeinen.txt.
In dit voorbeeld willen we het aantal keren tellen dat het domein tecmint.com
wordt vermeld in het bestand domeinen.txt. Daarom hebben we een klein shellscript geschreven om ons daarbij te helpen met het idee van variabelen, numerieke uitdrukkingen en toewijzingsoperatoren met de volgende inhoud:
#!/bin/bash. voor bestand in [e-mail beveiligd]; doen als [ -f $bestand ]; vervolgens #print bestandsnaam echo "Bestand is: $bestand" #druk een nummer stapsgewijs af voor elke regel die tecmint.com awk '/^tecmint.com/ { counter+=1; printf "%s\n", teller; }' $file else #print error info incase input is not a file echo "$file is geen bestand, geef een bestand op." >&2 && afrit 1 fi. klaar. #terminate script met exitcode 0 in geval van succesvolle uitvoering exit 0.
Laten we nu de twee speciale patronen gebruiken: BEGINNEN
en EINDE
in de Awk commando in het bovenstaande script als volgt:
We zullen het script wijzigen:
awk '/^tecmint.com/ { counter+=1; printf "%s\n", teller; }' $bestand.
Tot:
awk' BEGINNEN { print "Het aantal keren dat tecmint.com in het bestand voorkomt is:"; } /^tecmint.com/ { counter+=1; } EINDE { printf "%s\n", teller; } ' $bestand.
Na het aanbrengen van de wijzigingen in de Awk commando ziet het volledige shellscript er nu als volgt uit:
#!/bin/bash. voor bestand in [e-mail beveiligd]; doen als [ -f $bestand ]; vervolgens #print bestandsnaam echo "Bestand is: $bestand" #print het totale aantal keren dat tecmint.com in het bestand verschijnt awk ' BEGINNEN { print "Het aantal keren dat tecmint.com in het bestand voorkomt is:"; } /^tecmint.com/ { counter+=1; } EINDE { printf "%s\n", teller; } ' $file else #print error info incase input is not a file echo "$file is geen bestand, geef een bestand op." >&2 && afrit 1 fi. klaar. #terminate script met exitcode 0 in geval van succesvolle uitvoering exit 0.
Wanneer we het bovenstaande script uitvoeren, zal het eerst de locatie van het bestand afdrukken domeinen.txt, dan de Awk opdrachtscript wordt uitgevoerd, waarbij de BEGINNEN
speciaal patroon helpt ons bij het uitprinten van het bericht “Het aantal keren dat tecmint.com in het bestand voorkomt is:
” voordat er invoerregels uit het bestand worden gelezen.
Dan ons patroon, /^tecmint.com/
wordt vergeleken met elke invoerregel en de actie, { teller+=1; }
wordt uitgevoerd voor elke invoerregel, die het aantal keren telt tecmint.com
verschijnt in het bestand.
eindelijk, de EINDE
patroon zal het totaal aantal keren dat het domein is afgedrukt tecmint.com
verschijnt in het bestand.
$ ./script.sh ~/domeinen.txt
Om af te sluiten, liepen we door meer Awk functies verkennen van de concepten van speciaal patroon: BEGINNEN
en EINDE
.
Zoals ik al eerder aangaf, zullen deze Awk-functies ons helpen om complexer te bouwen tekstfilterbewerkingen, er is meer om onder te dekken Awk functies en in deel 10, we zullen het idee van ingebouwde Awk-variabelen benaderen, dus blijf verbonden.