Het Gebruik van de awk Opdracht op Linux

0
371
Fatmawati Achmad Zaenuri/Shutterstock

Op Linux, awk is een commando-regel tekst manipulatie dynamo, evenals een krachtige scripttaal. Hier is een inleiding tot een aantal van de coolste functies.

Hoe awk Kreeg Zijn Naam

De awk opdracht kreeg de naam met de initialen van de drie mensen die schreef de originele versie in 1977: Alfred Aho, Peter Weinberger, en Brian Kernighan. Deze drie mannen waren van de legendarische AT&T Bell Laboratories Unix pantheon. Met de bijdragen van vele anderen sindsdien, awk is blijven evolueren.

Het is een full-scripting taal, alsmede een volledige tekst manipulatie toolkit voor de opdrachtregel. Als dit artikel houdt je eetlust, je kunt elk detail over awk en de functionaliteit.

Regels, Patronen en Acties

awk werkt aan programma ‘ s die regels bevatten die bestaat uit patronen en acties. De actie wordt uitgevoerd op de tekst die overeenkomt met het patroon. Patronen worden tussen accolades ({}). Samen, een patroon en een actie in de vorm van een regel. De hele awk programma wordt tussen enkele aanhalingstekens (‘).

Laten we een kijkje nemen op het eenvoudigste type van awk programma. Het heeft geen patroon, zodat het overeenkomt met elke regel van de tekst ingevoerd in het. Dit betekent dat de actie wordt uitgevoerd op elke lijn. We gebruiken het op de uitvoer van die opdracht.

Hier is de standaard output van wie:

die

Misschien hoeven we niet al die informatie, maar, integendeel, gewoon om te zien de namen van de rekeningen. We kunnen de output met een pijp van die in awk, en dan vertellen awk voor het afdrukken van alleen het eerste veld.

Standaard, awk is van mening dat een veld een string van tekens omringd door spaties, het begin van een regel, of het einde van een regel. Velden worden aangeduid met een dollar teken ($) en een nummer. Dus $1 staat voor het eerste veld, die we gebruiken met de actie print om het afdrukken van het eerste veld.

We typt u het volgende:

wie | awk ‘{print $1}’

awk is afgedrukt in het eerste veld en verwijdert de rest van de lijn.

We kunnen printen zoveel velden als we willen. Als we een komma als scheidingsteken, awk hiermee wordt een spatie tussen elk veld.

Wij typ het volgende om ook afdrukken de tijd dat de persoon aangemeld in (veld vier):

wie | awk ‘{print $1,$4}’

Er zijn een paar speciale veld-id ‘ s. Deze vertegenwoordigen de gehele lijn van de tekst en het laatste veld in de lijn van de tekst:

  • $0: Vertegenwoordigt de gehele lijn van de tekst.
  • $1: staat voor het eerste veld.
  • $2: geeft het tweede veld.
  • $7: Vertegenwoordigt de zevende veld.
  • $45: Vertegenwoordigt de 45e veld.
  • $NF: Staat voor “aantal velden,” en is het laatste veld.

Typ het volgende om een klein tekst bestand met een kort citaat toegeschreven aan Dennis Ritchie:

kat dennis_ritchie.txt

We willen awk afdrukken van de eerste, tweede, en laatste veld van de offerte. Merk op dat hoewel het is gewikkeld rond in het terminal venster, het is slechts een enkele regel tekst.

We typt u de volgende opdracht:

awk ‘{print $1,$2,$NF}’ dennis_ritchie.txt

Dat weten We niet “eenvoud.” is de 18e veld in de lijn van de tekst, en we don ‘ t care. Wat we wel weten is dat het het laatste veld, en kunnen we gebruik maken van $NF te krijgen van de waarde. De periode wordt slechts beschouwd als een ander teken in het lichaam van het veld.

Het Toevoegen Van Output Veldscheidingstekens

U kunt ook vertellen awk voor het afdrukken van een bepaald teken tussen de velden in plaats van de standaard spatie. De standaard uitvoer van het date commando is een beetje eigenaardig, want de tijd is neergepoot in het midden van het. We kunnen echter het volgende te typen en gebruik awk voor het uitpakken van de velden die we willen:

datum
datum | awk ‘{print $2,$3,$6}’

We zullen gebruik maken van de OFS (output field separator) variabele om een scheiding aan te brengen tussen de maand, de dag en het jaar. Merk op dat we hieronder plaatst de opdracht in enkele aanhalingstekens (‘), niet de accolades ({}):

datum | awk ‘OFS=”/” {print$2,$3,$6}’
datum | awk ‘OFS=”-” {print$2,$3,$6}’

De BEGIN-en EIND-Regels

Een BEGIN regel wordt eenmaal uitgevoerd voordat een tekst verwerking begint. In feite, het is uitgevoerd voordat awk zelfs leest een tekst. Een EINDE regel wordt uitgevoerd na verwerking is voltooid. U kunt meerdere BEGIN-en EIND-regels, en ze zullen worden uitgevoerd in volgorde.

Voor ons voorbeeld van een regel BEGINNEN, we printen het hele citaat uit de dennis_ritchie.txt -bestand dat u eerder hebt gebruikt met een titel erboven.

Om dit te doen, typt u deze opdracht:

awk ‘BEGIN {print “Dennis Ritchie”} {print $0}’ dennis_ritchie.txt

Let op de BEGIN regel heeft zijn eigen set van acties opgesloten in zijn eigen set van accolades ({}).

We kunnen gebruik maken van dezelfde techniek met de opdracht die we eerder buis uitvoer van die in awk. Om dit te doen, typt u het volgende:

wie | awk ‘BEGIN {print “Actieve Sessies”} {print $1,$4}’

Ingang Veld Scheidingstekens

Als u wilt awk om te werken met tekst die niet gebruik spaties om aparte velden, moet je om het te vertellen welk teken wordt in de tekst als het veld scheidingsteken. Bijvoorbeeld, de /etc/passwd bestand maakt gebruik van een dubbele punt (:) voor de afzonderlijke velden.

We zullen gebruik maken van dat bestand en de -F (tekst) optie om te vertellen awk gebruik van de dubbele punt (:) als scheidingsteken. Wij typ het volgende te vertellen awk voor het afdrukken van de naam van de gebruikersaccount en de map home:

awk -F: ‘{print $1,$6}’ /etc/passwd

De uitvoer bevat de naam van de gebruikersaccount (of applicatie of daemon naam) en de home map (of de locatie van de toepassing).

Het Toevoegen Van Patronen

Als we willen regelmatig gebruiker-accounts, kunnen wij ook een patroon met onze actie print te filteren uit alle inzendingen. Omdat Gebruikers-ID nummers zijn gelijk aan, of hoger dan, de 1000, kunnen we een basis van onze filter op de informatie.

Wij typ het volgende om de uitvoering van onze actie print alleen wanneer het derde veld ($3) bevat een waarde van 1.000 of meer:

awk -F: ‘$3 >= 1000 {print $1,$6}’ /etc/passwd

Het patroon moet onmiddellijk voorafgaan aan de actie waarmee het verbonden is.

We kunnen gebruik maken van de BEGIN regel tot het verlenen van een titel voor onze kleine verslag. Wij typ de volgende, met behulp van de (n) notatie voeg een newline karakter in de titel string:

awk -F: ‘BEGIN {print “User Accountsn————-“} $3 >= 1000 {print $1,$6}’ /etc/passwd

Patronen zijn volwaardige reguliere expressies, en ze zijn een van de heerlijkheden van awk.

Laten we zeggen dat we willen zien in de universele unieke identifiers (uuid ‘ s) van de gemounte bestandssystemen. Als we zoeken door middel van de /etc/fstab bestand voor exemplaren van de tekenreeks “UUID” het moet om terug te keren die informatie voor ons.

We maken gebruik van de zoekopdracht “/UUID/” in onze opdracht:

awk ‘/UUID/ {print $0}’ /etc/fstab

Het vindt alle exemplaren van “UUID” en drukt deze lijnen. We daadwerkelijk zou hebben gekregen aan hetzelfde resultaat, zonder de actie print omdat de standaard print de gehele lijn van de tekst. Voor de duidelijkheid, al is het vaak handig om duidelijk te zijn. Als je door een script of je geschiedenis, je zult blij zijn dat je links aanwijzingen voor jezelf.

De eerste regel wordt gevonden, is een regel met commentaar, en hoewel de “UUID” string is in het midden van het awk nog steeds gevonden. We kunnen tweaken van de reguliere expressie en vertellen awk verwerken alleen lijnen die beginnen met “UUID.” Om dit te doen, typt u de volgende die de start van de lijn token (^):

awk ‘/^UUID/ {print $0}’ /etc/fstab

Dat is beter! Nu, we zien alleen echte berg instructies. Voor het verfijnen van de output nog verder, wij typ het volgende en het beperken van het display naar het eerste veld:

awk ‘/^UUID/ {print $1}’ /etc/fstab

Als we hadden meerdere bestandssystemen die aangekoppeld zijn op deze machine, zouden we een nette tabel van hun uuid ‘ s.

Ingebouwde Functies

awk heeft veel functies die u kunt bellen en kunt gebruiken in uw eigen programma ‘ s, zowel vanaf de commando-regel en in scripts. Als u sommige graven, vindt u het erg vruchtbaar.

Om aan te tonen dat de algemene techniek om een functie, we kijken naar een aantal numerieke degenen. Bijvoorbeeld, de volgende prenten in de wortel van 625:

awk ‘BEGIN { print sqrt(625)}’

Dit commando drukt de boogtangens van 0 (nul) en -1 (die toevallig ook de wiskundige constante pi):

awk ‘BEGIN {print atan2(0, -1)}’

In de volgende opdracht, passen we het resultaat van de atan2() functie voordat we print het:

awk ‘BEGIN {print atan2(0, -1)*100}’

Functies kunnen accepteren uitdrukkingen als parameters. Bijvoorbeeld, hier is een ingewikkelde manier om te vragen voor de vierkantswortel van 25:

awk ‘BEGIN { print sqrt((2+3)*5)}’

awk-Scripts

Als uw commando-regel krijgt gecompliceerde, of u het ontwikkelen van een routine je weet dat je weer wilt gebruiken, kunt u de overdracht van uw awk opdracht in een script.

In ons voorbeeld script, doen we het volgende:

  • Vertel de shell die uitvoerbaar te gebruiken voor het uitvoeren van het script.
  • Bereiden awk gebruik van de FS-field separator variabele invoer lezen van een tekst met velden, gescheiden door dubbele punten (:).
  • Gebruik de OFS output field separator te vertellen awk gebruik een dubbele punt (:) voor de afzonderlijke velden in de output.
  • Zet een teller op 0 (nul).
  • Het tweede veld van elke regel van de tekst op een lege waarde (het is altijd een “x”, dus hoeven we niet te zien).
  • Print de lijn met de gewijzigde tweede veld.
  • De teller verhogen.
  • Print de waarde van de teller.

Ons script is hieronder weergegeven.

De BEGIN regel voert de voorbereidende stappen, terwijl het EINDE van de regel geeft de waarde van de teller. De middelste regel (die geen naam heeft, noch patroon, zodat deze overeenkomt met elke regel) wijzigt het tweede veld, drukt de lijn, en verhoogt de teller.

De eerste regel van het script vertelt de shell die uitvoerbaar te gebruiken (awk, in ons voorbeeld) voor het uitvoeren van het script. Het geeft ook de -f (bestandsnaam) optie awk, die geeft de tekst het gaat om een proces zal komen uit een bestand. We passeren de bestandsnaam van het script wanneer we dit uitvoeren.

We hebben de onderstaande script als tekst, zodat u kunt knippen en plakken:

#!/usr/bin/awk -f

BEGIN {
# stel de input en output veldscheidingstekens
FS=”:”
OFS=”:”
# nul de rekeningen teller
accounts=0
}
{
# instellen veld 2 tot niets
$2=””
# print over de hele lijn
print $0
# telling ander account
accounts++
}
END {
# afdrukken van de resultaten
print rekeningen rekeningen.n”
}

Sla deze op in een bestand met de naam weglaten.awk. Maak het script uitvoerbaar, typen we de volgende behulp van chmod:

chmod +x weglaten.awk

Nu, we zullen uitvoeren en doorgeven van de /etc/passwd bestand naar het script. Dit is het bestand awk zal het proces voor ons, met behulp van de regels in het script:

./weglaten.awk /etc/passwd

Het bestand wordt verwerkt en elke regel wordt weergegeven, zoals hieronder weergegeven.

De “x” – vermeldingen in het tweede veld werden verwijderd, maar let op de veld scheidingstekens zijn nog steeds aanwezig. De lijnen zijn geteld en het totaal is gegeven aan de onderkant van de output.

awk niet Staan voor Lastige

awk niet staan voor een lastige; het staat voor elegantie. Het is beschreven als een verwerking filter en een rapport schrijver. Meer precies, het is beide, of liever gezegd, een tool die u kunt gebruiken voor beide taken. In slechts een paar regels, awk bereikt wat vraagt om een uitgebreide codering in een traditionele taal.

Die kracht wordt aangewend door het eenvoudige concept van regels bevatten patronen, selecteer de tekst om deze te verwerken, en handelingen die voor de verwerking.

LEES VERDER

  • “Hoe om te Verkennen Steden in Apple Maps Gebruik te Rond te Kijken
  • “Zal de EU Apple zich te Ontdoen van de Bliksem op de iPhone?
  • “Hoe Ziet u Al Uw Opgeslagen Wi-Fi-Wachtwoorden op macOS
  • “Wat Doet “NGL” Betekenen, en Hoe Gebruik Je Het?
  • “Het Gebruik van Google Chrome is de Nieuwe Deep-Linking Functie