Awk is een krachtige programmeertaal voor gegevensverwerking, ingebouwd in bijna elk * nix-systeem. Het lijkt een programmeertaal voor algemene doeleinden aan de oppervlakte, maar het is gebouwd om input te nemen en acties uit te voeren op basis van die input. Als u tekst op basis van bepaalde voorwaarden moet verwerken, zal awk bijna altijd het werk sneller doen dan een algemene taal zoals C. Het wordt ook geïnterpreteerd, zodat u het langdradige compilatie- en foutopsporingsproces van gecompileerde talen voorkomt.

Extra leuk feit : de vreemde naam van het programma is een initialisatie van de namen van programmeurs: Alfred A ho, Peter W einberger en Brian K ernighan

De basissyntaxis van Awk

Bij aanroepen op de opdrachtregel volgt awk het onderstaande basispatroon:

 patroon {action} bestandspatroon {action} bestand ... 

Awk voert de actie uit wanneer het patroon overeenkomt met het gespecificeerde bestand. Als u geen bestand opgeeft, wordt awk uitgevoerd op de standaarduitvoer. Bij het matchen van patronen kan awk zowel reguliere expressies als programmatische invoer aannemen. Laten we dit eenvoudige voorbeeld hieronder beschouwen:

 awk '/ com / {print $ 0}' e-mails 

Dit programma met één regel zal elke regel afdrukken vanuit het bestand "e-mails" die de karakters com bevatten. In awk verwijst $0 naar de huidige regel, wat ook het standaardgedrag is. De regel zou zonder $0, kunnen zijn geschreven en zou identiek hebben gefunctioneerd.

Velden afdrukken

Omdat awk veldscheidingstekens kan identificeren en ontleden, is het handig voor het afdrukken van specifieke kolommen of rijen met gegevens. We gebruiken het bestand "/ etc / passwd" voor dit voorbeeld.

 awk -F ":" '{print $ 1}' / etc / passwd 

Dit eenregelig programma doet een paar dingen. De vlag -F geeft aan dat het volgende teken ( : in dit voorbeeld) moet worden geïnterpreteerd als het veldscheidingsteken. Awk print het eerste veld, gespecificeerd door $1 .

We kunnen ook meer dan één veld tegelijk afdrukken door de velden sequentieel op te geven:

 awk -F ":" '{print $ 4 "" $ 5}' / etc / passw 

Het produceert uitvoer die er als volgt uitziet.

Hiermee worden de vierde en vijfde velden van het passwd bestand afgedrukt met een spatie ertussen. Merk op dat de spatie tussen dubbele aanhalingstekens ligt. Dit specificeert het als een letterteken in de afdrukopdracht, dus wordt het afgedrukt zoals geschreven. We kunnen ook gecompliceerde literals toevoegen om onze output op te schonen:

 awk -F ":" '{print "proces:" $ 5 "\ t \ t" "directory:" $ 6}' / etc / passwd 

Hiermee wordt de uitvoer afgedrukt met labels ter identificatie. En we kunnen dit alles uitvoeren naar een nieuw bestand met behulp van een caret (>).

 awk -F ":" '{print "proces:" $ 5 "\ t \ t" "directory:" $ 6}' / etc / passwd> processes.txt 

We kunnen wat we tot nu toe weten te combineren om gegevens uitgebreid te verwerken. We kunnen bijvoorbeeld reguliere expressies gebruiken om alle regels af te drukken vanuit een document dat een geldig Amerikaans telefoonnummer bevat.

 awk '/^(\+\d{1, 2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4 } $ / {print} 'contacten 

Het bijbehorende vermogen van het Awk-commando uitbreiden

Awk kan ook informatie verwerken met behulp van verschillende operanden. Dit omvat standaard operanden zoals ==, <, >, <=, >=, en !=, Evenals awk-specifieke operanden ~ en !~, Die respectievelijk "overeenkomsten" en "niet overeenstemmen" betekenen. Deze operanden worden gebruikt bij het vergelijken van reguliere expressies met Booleaanse logica, evenals met meer standaard programmatische frases.

Awk Command-voorbeelden

 awk 'length ($ 0)> 80' data 

Drukt alle regels langer dan tachtig tekens in het bestand "data" af. Let op het ontbreken van een printinstructie: als er geen specifieke actie is, zal awk de volledige regel afdrukken wanneer een patroon overeenkomt.

 $ 1 == "gebruiker" {print} 

Drukt alle regels af waarbij het eerste veld gelijk is aan de tekenreeks "gebruiker". Zonder een vlag -F gebruikt awk witte ruimte als het standaardveldscheidingsteken. Merk ook op dat awk en het bestand niet zijn gespecificeerd. Dit is voor gebruik in scripts in afzonderlijke bestanden, zoals hieronder besproken.

 $ 5 ~ / root / {print $ 3} 

Drukt het derde veld af telkens wanneer het vijfde veld overeenkomt met de reguliere expressie /root/ .

 {if ($ 5! ~ / root /) {print $ 3}} 

Als veld 5 niet overeenkomt /root/, print veld drie. Dit gebruikt de C-like if instructie, die ook compatibel is met awk. Dit formaat biedt meer flexibiliteit voor programmeurs die vertrouwd zijn met talen voor algemene doeleinden.

Scripts opslaan in bestanden

Awk-scripts kunnen ook worden opgeslagen in bestanden waarmee u meer complexe programma's kunt opslaan:

 awk -f ~ / scripts / program.awk data 

Wanneer u de vlag -f, voert awk het script uit in het opgegeven bestandspad, namelijk program.awk . De opdrachten in dat programma verwerken de bestandsgegevens.

Acties kunnen ook voor en na het programma worden uitgevoerd, met behulp van BEGIN en END :

 BEGIN {FS = ":"} # geeft aan dat: het veldscheidingsteken voor het programma is. #operations END {print "U bent klaar"} print een vreugdevol bericht voor de gebruiker 

Zoals je hierboven kunt zien, start het # -symbool een opmerking, die duurt tot het einde van de regel.

Conclusie

Deze gids raakt alleen de meest elementaire elementen van awk aan. Er is nog veel meer te bouwen en verder te verkennen. Bestudeer de GNU-documentatie voor awk of The Awk Programming Language en het awk-handboek geschreven door de ontwikkelaars van het programma.