Hur man använder kommandot awk på Linux

By rik

I Linux-världen framstår awk som ett mångsidigt verktyg för textbearbetning via kommandoraden, men också som ett kraftfullt skriptspråk. Denna text utforskar några av dess mest anmärkningsvärda funktioner.

Awk:s Namnförklaring

Kommandot awk fick sitt namn genom en kombination av initialerna från de tre upphovsmännen till den ursprungliga versionen, som skapades 1977: Alfred Aho, Peter Weinberger och Brian Kernighan. Dessa tre herrar arbetade vid det legendariska AT&T Bell Laboratories, en del av Unix-världens pionjärer. Genom bidrag från otaliga andra har awk fortsatt att utvecklas.

Awk fungerar inte bara som ett fullfjädrat skriptspråk utan även som en omfattande verktygslåda för textmanipulation direkt i kommandotolken. Om du efter att ha läst detta känner dig lockad kan du utforska varje aspekt av awk och dess kapacitet.

Regler, Mönster och Handlingar

Awk bygger på program bestående av regler, som i sin tur består av mönster och handlingar. En handling utförs på den text som överensstämmer med ett visst mönster. Mönster definieras inom klammerparenteser ({}). Tillsammans utgör ett mönster och en handling en komplett regel. Hela awk-programmet omsluts av enkla citattecken (’).

Låt oss undersöka det enklaste awk-programmet. Det saknar ett specifikt mönster och matchar därför varje inmatad textrad. Detta innebär att handlingen utförs på alla rader. Låt oss tillämpa det på resultatet från kommandot `who`.

Här visas standardutdata från `who`:

who

Om vi inte är intresserade av all information, utan bara vill se användarnamnen, kan vi skicka resultatet från `who` till awk och instruera awk att endast visa den första delen.

Som standard definierar awk ett fält som en teckensträng som avgränsas av blanksteg, början av en rad eller slutet av en rad. Fält identifieras med ett dollartecken ($) följt av ett nummer. Till exempel representerar $1 det första fältet, vilket vi använder tillsammans med print-handlingen för att visa det.

Vi skriver följande:

who | awk '{print $1}'

awk skriver ut det första fältet och ignorerar resten av raden.

Vi kan välja att skriva ut valfritt antal fält. Om vi infogar ett kommatecken som separator, kommer awk att infoga ett mellanslag mellan varje fält.

För att även skriva ut inloggningstiden (fält fyra), använder vi följande:

who | awk '{print $1,$4}'

Det finns ett par speciella fältidentifierare. De representerar antingen hela textraden eller det sista fältet i raden:

$0: Representerar hela textraden.
$1: Representerar det första fältet.
$2: Representerar det andra fältet.
$7: Representerar det sjunde fältet.
$45: Representerar det 45:e fältet.
$NF: Står för ”number of fields” (antal fält) och representerar det sista fältet.

Låt oss generera en liten textfil med ett citat som tillskrivs Dennis Ritchie:

cat dennis_ritchie.txt

Vi vill att awk ska visa det första, andra och sista fältet i citatet. Observera att texten, även om den är omsluten i terminalfönstret, utgörs av en enda textrad.

Vi använder följande kommando:

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

Vi känner inte till ”enkelhetens” position. Det råkar vara det 18:e fältet, men det spelar ingen roll. Det vi vet är att det är det sista fältet, och vi kan använda $NF för att få dess värde. Punktuationen betraktas här som ett separat tecken.