Hur man Använder awk-Kommandot i Linux

0
308
Fatmawati Achmad Zaenuri/Shutterstock

På Linux, awk är ett command-line text manipulation dynamo, liksom ett kraftfullt skriptspråk. Här är en introduktion till några av sina coolaste funktionerna.

Hur awk Fick Sitt Namn

Awk kommando hette använda initialerna av de tre personer som skrev den ursprungliga versionen 1977: Alfred Aho, Peter Weinberger, och Brian Kernighan. Dessa tre män från den legendariska AT&T Bell Laboratories Unix pantheon. Med bidrag från många andra sedan dess, awk har fortsatt att utvecklas.

Det är en fullständig skriptspråk, såväl som en komplett text manipulation toolkit för kommandoraden. Om den här artikeln whets din aptit, kan du kolla in alla detaljer om awk och dess funktionalitet.

Regler, Mönster och Handlingar

awk fungerar på program som innehåller regler består av mönster och handlingar. Åtgärden utförs på den text som matchar mönstret. Mönster är inneslutna i klammerparenteser ({}). Tillsammans, ett mönster och en åtgärd utgör en regel. Hela awk program är inom enkla citattecken (‘).

Låt oss ta en titt på den enklaste typen av awk-program. Det har inget mönster, så det matchar varje rad med text som matas in i det. Detta innebär att de åtgärder som utförs på varje rad. Vi kommer att använda det på utdata från kommandot som.

Här är standard formatet från en som:

som

Vi kanske inte behöver all denna information, utan snarare bara vill se namnen på de konton. Vi kan pipe output från who till awk, och sedan berätta för awk att skriva ut endast det första fältet.

Som standard, awk anser att ett fält ska vara en sträng av tecken som omges av mellanrum, i början av en rad, eller slutet på en rad. Fält identifieras av ett dollartecken ($) och ett nummer. Så, $1 är den första fältet, som vi kommer att använda med utskrift åtgärd för att skriva ut det första fältet.

Vi skriver följande:

vem | awk ‘{print $1}’

awk-skriver ut den första fältet, och kastar resten av raden.

Vi kan skriva ut så många områden som vi vill. Om vi lägger till ett kommatecken som avgränsare, awk skriver ett mellanslag mellan varje fält.

Vi skriver följande för att skriva ut även den tid personen är inloggad (field fyra):

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

Det finns ett par speciella område kännetecken. Dessa representerar hela raden av sms: a och sista fältet i raden av texten:

  • $0: Representerar hela raden med text.
  • $1: Representerar det första fältet.
  • $2: Representerar det andra fältet.
  • $7: är den sjunde området.
  • $45: Representerar den 45: e fältet.
  • $NF: en förkortning för “antal områden,” och utgör den sista fältet.

Vi kommer att skriva följande för att få upp en liten text fil som innehåller ett kort citat som tillskrivs Dennis Ritchie:

katt dennis_ritchie.txt

Vi vill awk att skriva ut den första, andra och sista fältet i citatet. Observera att även om det är lindade runt i terminal-fönstret, det är bara en enda textrad.

Vi skriver följande kommando:

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

Vet vi inte att “enkelhet.” är det 18-området i raden av text, och vi bryr oss inte. Vad vi vet är att det är det sista fältet, och vi kan använda $NF för att få sitt värde. Den period som är bara vara en annan karaktär i kroppen av området.

Lägga Till Utgång Fältet Separatorer

Du kan också berätta awk för att skriva ut en viss karaktär mellan fält istället för standard mellanslag. Standard output från kommandot date är något märklig eftersom tiden är plonked precis i mitten av det. Men, vi kan skriva följande och använda awk att extrahera fält vi vill:

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

Vi kommer att använda OFS (utgång fältet avgränsare) variabel för att lägga en separator mellan månad, dag och år. Observera att nedan bifogar vi kommandot i apostrof (‘), inte klammerparenteser ({}):

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

Den BÖRJAR och slutar Regler

En BÖRJAR regel utförs en gång innan någon text behandling startar. I själva verket är det som utförs före awk även läser en text. Ett SLUT regel utförs efter alla behandlingen har avslutats. Du kan ha flera BEGIN-och END-regler, och de kommer att köra för.

För vårt exempel på en BÖRJA artikel, vi kommer att skriva ut hela citat från dennis_ritchie.txt filen vi tidigare använt med en titel som ovan.

För att göra detta, skriv in detta kommando:

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

Observera att BÖRJA regeln har sin egen uppsättning av åtgärder inneslutna i sin egen uppsättning av klammerparenteser ({}).

Vi kan använda samma teknik med kommandot vi använt tidigare för att pipe output från who till awk. Vi gör det genom att skriva följande:

vem | awk ‘BEGIN {print “Aktiva Sessioner”} {print $1,$4}’

Inmatningsfältet Separatorer

Om du vill awk för att arbeta med text som inte använder mellanslag för att separera fälten, du har att berätta det som tecken i texten används som fältseparator. Till exempel /etc/passwd filen använder ett kolon (:) för att avgränsa områden.

Vi kommer att använda fil-och-F (separator string) möjlighet att berätta awk att använda kolon (:) som avgränsare. Vi skriver följande att berätta awk att skriva ut namnet på användarkontot och hem-mapp:

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

Produktionen innehåller namnet på det användarkonto (eller ansökan eller daemon namn) och home-mapp (eller den plats av ansökan).

Lägga Till Mönster

Om allt vi är intresserade av är vanliga användarkonton kan vi inkludera ett mönster med våra tryckta åtgärder för att filtrera bort alla andra inlägg. Eftersom Användar-ID-nummer är lika med, eller större än, 1,000, vi kan basera våra filter på denna information.

Vi skriver följande för att utföra våra utskrift åtgärd endast när det tredje fältet ($3) innehåller ett värde av 1 000 eller mer:

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

Mönstret bör omedelbart föregår den åtgärd som det är förknippat med.

Vi kan BÖRJA använda regeln för att ge en avdelning för vår lilla rapport. Vi skriver följande, med hjälp av (n) – notation för att infoga en ny rad-tecken i string titel:

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

Mönster är fullfjädrad regular expressions och de är ett av de härligheter av awk.

Låt oss säga att vi vill se universiellt unik identifierare (Uuid) av den monterade filsystem. Om vi söker igenom filen /etc/fstab fil för förekomster av strängen “UUID,” det borde återgå till att information för oss.

Vi använder sökbegreppet “/UUID/” i vårt kommando:

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

Den hittar alla förekomster av “HÄR” och skriver dessa rader. Vi som faktiskt skulle ha fått samma resultat utan att skriva ut åtgärder, eftersom standardinställningen skriver ut hela raden med text. För tydlighetens skull, men det är ofta bra att vara tydlig. När du tittar igenom ett manus eller din history-fil, du kommer vara glad att du lämnat ledtrådar för dig själv.

Den första raden hittade var en kommentar linje, och även om den “UUID” strängen är i mitten av det awk fortfarande finns det. Vi kan justera den reguljära uttryck och berätta awk att behandla endast rader som börjar med “UUID.” För att göra detta, skriv följande som ingår början av raden token (^):

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

Att det är bättre! Nu ser vi bara äkta montera instruktioner. För att förfina produktionen ytterligare, vi skriva följande och begränsa visningen till det första fältet:

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

Om vi hade flera filsystem som är monterade på denna maskin, vi skulle få en snygg bord av deras Uuid.

Inbyggda Funktioner

awk har många funktioner att du kan ringa och använda i dina egna program, både från kommandoraden och i skript. Om du gör en del grävande, du hittar det mycket givande.

För att visa den allmänna tekniken för att anropa en funktion, vi ska titta på några numeriska sådana. Följande exempel skriver ut kvadratroten av 625:

awk ‘BEGIN { print sqrt(625)}’

Detta kommando skriver ut arcustangens av 0 (noll) och -1 (som råkar vara den matematiska konstanten pi):

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

I det följande kommando ändrar vi resultatet av atan2 () – funktionen innan vi skriva ut det:

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

Funktioner kan acceptera uttryck som parametrar. Till exempel, här är en invecklad sätt att be om kvadratroten ur 25:

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

awk-Skript

Om din kommandorad blir komplicerat, eller om du utvecklar en rutin som du vet att du kommer att vilja använda igen, kan du överföra dina awk kommando i ett skript.

I vårt exempel skript, vi kommer att göra allt av följande:

  • Tala om för skalet som körbar för att använda för att köra skriptet.
  • Förbereda awk att använda FS field separator variabel för att läsa in text med det fält separerade med kolon (:).
  • Använd OFS utgång fältet avgränsare för att berätta awk att använda kolon (:) för att avgränsa områden i produktionen.
  • Ställa in en disk till 0 (noll).
  • Ange det andra fältet på varje rad av text till ett tomt värde (det finns alltid ett “x” så att vi inte behöver se det).
  • Skriv ut raden med den modifierade andra fältet.
  • Steg räknare.
  • Skriv ut värdet på disken.

Vårt skript visas nedan.

Det BÖRJAR regel utför förberedande åtgärder, medan SLUTET regel visar räknaren värde. Mitt regeln (som inte har något namn, eller mönster så att det passar varje rad) ändrar det andra fältet, skriver linjen, och steg räknaren.

Den första raden i skriptet berättar skal som körbar för att använda (awk, i vårt exempel) för att köra skriptet. Det passerar också-f (filnamn) alternativ till awk, som informerar den text som kommer att processen kommer från en fil. Vi kommer att passera filnamnet till skriptet när vi kör det.

Vi har inkluderat skriptet nedan så sms: a så kan du klippa ut och klistra in:

#!/usr/bin/awk-f

BEGIN {
# ställ in ingång och utgång fältet separatorer
FS=”:”
OFS=”:”
# nollställ counter-konton
räkenskaperna=0
}
{
# set field 2 till ingenting
$2=””
# skriv ut hela raden
print $0
# räkna ett annat konto
konton++
}
END {
# skriv ut resultatet
skriv ut konton ” – konton.n”
}

Spara detta i en fil som heter utelämna.awk. För att göra skriptet körbart, vi skriver följande med chmod-kommandot:

chmod +x utelämna.awk

Nu kommer vi att köra det och skicka filen /etc/passwd filen till skriptet. Detta är den fil som awk kommer processen för oss, med hjälp av regler i skriptet:

./utelämna.awk /etc/passwd

Filen behandlas och varje linje visas, så som visas nedan.

“X” – poster i det andra fältet togs bort, men observera fältet separatorer är fortfarande närvarande. De linjer som räknas och det totala anges i botten av produktionen.

awk inte Stå för Obekväma

awk inte stå för obekväma, det står för elegans. Det har beskrivits som en bearbetning filter och en rapport författare. Mer exakt, det är båda dessa, eller, snarare, ett verktyg som du kan använda för båda dessa uppgifter. På bara några rader, awk uppnår vad som kräver omfattande kodning i en traditionell språk.

Att makten är som utnyttjas av det enkla konceptet av regler som innehåller mönster, som markerar du texten för att processen, och åtgärder för att definiera behandling.

LÄS NÄSTA

  • “Hur att Utforska Städer i Apple Kartor med Hjälp av att Titta Runt
  • “Kommer EU att Göra Apple Bli av med Blixten på iPhone?
  • “Hur kan du Se Alla Dina Sparade Wi-Fi-Lösenord på macOS
  • “Vad Gör “NGL -” Betyder, och Hur Använder Man Det?
  • “Hur man Använder Google Chromes Nya Deep-Linking Har