Awk

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

awk - Mönsterinriktad textbearbetning

Kommandot `awk` används för mönsterinriktad bearbetning och rapportering av text i ett Unix-liknande operativsystem. Det är ett kraftfullt verktyg för textbearbetning och manipulation av textströmmar.

Syntax

awk [ALTERNATIV] 'PROGRAM' [FIL]...

Beskrivning

Kommandot `awk` är ett programmeringsspråk som används för att skriva små program som bearbetar text. Det används för att extrahera information från textfiler, bearbeta textströmmar och generera rapporter. `awk` arbetar genom att läsa in en rad i taget från en fil eller standardinmatning, och utför sedan ett mönster och åtgärd på varje rad som matchar mönstret.

Alternativ

Kommandot `awk` stöder flera alternativ som kan användas för att justera hur bearbetningen utförs:

  • -F FS - Ange fältseparatorn (FS) till ett specifikt tecken eller sträng.
  • -v VAR=VAL - Ange en variabel (VAR) till ett specifikt värde (VAL) innan bearbetningen börjar.
  • -f FIL - Läs in ett `awk`-program från en fil (FIL) istället för från kommandoraden.
  • -mf N - Ange det maximala antalet fält till N.
  • -mr N - Ange det maximala antalet poster till N.
  • -W version - Visa `awk`-version och avsluta.
  • -W exec - Kör `awk`-programmet utan att tolka resterande argument.

Exempel

Här är några praktiska exempel som visar hur du kan använda `awk`-kommandot:

  • För att skriva ut den första kolumnen i en textfil:

awk '{print $1}' fil.txt

  • För att skriva ut den andra kolumnen av en fil med kommatecken som fältseparator:

awk -F, '{print $2}' fil.txt

  • För att skriva ut rader som matchar ett specifikt mönster:

awk '/mönster/' fil.txt

  • För att summera värden i den tredje kolumnen:

awk '{sum += $3} END {print sum}' fil.txt

  • För att sätta en variabel och använda den i programmet:

awk -v var=10 '{print $1 * var}' fil.txt

  • För att använda ett `awk`-program från en fil:

awk -f program.awk fil.txt

Programstruktur

Ett `awk`-program består av mönster och åtgärder som utförs på varje rad som matchar mönstret. Programstrukturen ser ut så här:


mönster { åtgärd }

  • Mönster - Ett uttryck som bestämmer vilka rader åtgärden ska utföras på. Om inget mönster anges, utförs åtgärden på alla rader.
  • Åtgärd - Ett block av kod som utförs på varje rad som matchar mönstret. Åtgärder omges av klammerparenteser {}.

Vanliga Mönster

  • /regexp/ - Matchar rader som innehåller reguljära uttryck.
  • BEGIN - Åtgärder som utförs innan någon rad bearbetas.
  • END - Åtgärder som utförs efter alla rader har bearbetats.
  • NR==num - Matchar radnummer num.
  • FNR==num - Matchar radnummer num i den aktuella filen.
  • $num ~ /regexp/ - Matchar när fält num innehåller reguljära uttryck.

Vanliga Inbyggda Variabler

  • $0 - Innehåller hela raden.
  • $1, $2, ... - Innehåller fält i raden.
  • FS - Fältseparator (standard är blanksteg).
  • OFS - Utdatafältseparator (standard är blanksteg).
  • RS - Postseparator (standard är ny rad).
  • ORS - Utpostseparator (standard är ny rad).
  • NR - Håller det totala antalet lästa rader.
  • FNR - Håller antalet lästa rader i den aktuella filen.
  • NF - Håller antalet fält i den aktuella raden.
  • FILENAME - Håller namnet på den aktuella filen.

Skillnader mellan macOS och Linux

Det finns några viktiga skillnader att tänka på när man använder `awk`-kommandot på macOS jämfört med Linux:

  • Standardinstallationer: På de flesta Linux-distributioner är `awk` förinstallerat som en del av GNU `awk` (gawk). På macOS används en version av `awk` som är baserad på BSD-implementationen.
  • Alternativ och funktioner: GNU `awk` på Linux har fler funktioner och alternativ jämfört med BSD `awk` på macOS. Till exempel har `gawk` stöd för flera inbyggda funktioner och tillägg som inte finns i BSD `awk`.
  • Kompatibilitet: Skript skrivna för GNU `awk` kan ibland behöva anpassas för att fungera korrekt på BSD `awk`, och vice versa, beroende på de specifika funktioner och tillägg som används.

Det är alltid bra att konsultera `man`-sidan för `awk` på din specifika plattform för att se vilka alternativ och funktioner som är tillgängliga och hur de används.


Exempel

För att bättre förstå användningen av `awk`, här är fler praktiska exempel:

  • För att skriva ut specifika kolumner från en textfil:

awk '{print $2, $5}' fil.txt

Detta skriver ut den andra och femte kolumnen från varje rad i filen.
  • För att skriva ut rader som matchar ett mönster och skriva ut en specifik kolumn:

awk '/mönster/ {print $3}' fil.txt

Detta skriver ut den tredje kolumnen från alla rader som innehåller "mönster".
  • För att räkna antalet rader i en fil:

awk 'END {print NR}' fil.txt

Detta skriver ut det totala antalet rader i filen efter att ha bearbetat alla rader.
  • För att beräkna medelvärdet av siffror i en kolumn:

awk '{sum += $1} END {print sum/NR}' fil.txt

Detta beräknar och skriver ut medelvärdet av siffrorna i den första kolumnen.
  • För att byta ut en specifik textsträng i en fil:

awk '{gsub(/gammal_text/, "ny_text"); print}' fil.txt

Detta byter ut alla förekomster av "gammal_text" med "ny_text" och skriver ut resultatet.
  • För att kombinera `awk` med andra kommandon:

ps aux | awk '{print $1, $2, $3, $11}'

Detta kombinerar `ps aux`-kommandot med `awk` för att skriva ut specifika kolumner från processlistan.

Inbyggda Funktioner

`awk` har många inbyggda funktioner som kan användas för att bearbeta text och data:

  • **length([str])** - Returnerar längden på strängen str eller längden på $0 om inget argument ges.
  • **substr(str, start, [length])** - Returnerar en delsträng av str som börjar vid position start och är length tecken lång.
  • **index(str, search)** - Returnerar positionen för första förekomsten av söksträngen search i str.
  • **tolower(str)** - Konverterar alla tecken i str till gemener.
  • **toupper(str)** - Konverterar alla tecken i str till versaler.
  • **systime()** - Returnerar den aktuella tiden som antalet sekunder sedan epoken (1970-01-01 00:00:00 UTC).
  • **strftime(format, [timestamp])** - Returnerar ett formaterat datum/tidssträng baserat på formatsträngen och den valfria timestamp.

Avancerade Mönster och Åtgärder

Här är några exempel på avancerade mönster och åtgärder:

  • För att skriva ut varannan rad i en fil:

awk 'NR % 2 == 0' fil.txt

Detta skriver ut endast de jämna numrerade raderna.
  • För att summera värden i en kolumn och skriva ut en varning om ett värde överstiger en gräns:

awk '{sum += $1; if ($1 > 100) print "Varning:", $1} END {print "Summa:", sum}' fil.txt

  • För att räkna antalet unika värden i en kolumn:

awk '!seen[$1]++' fil.txt

Detta skriver ut varje unikt värde i den första kolumnen en gång.

Användardefinitioner och Funktioner

Du kan definiera egna funktioner i `awk` för att återanvända kod:

function square(x) {

   return x * x

}

awk '{print $1, square($2)}' fil.txt Detta definierar en funktion som beräknar kvadraten av ett tal och använder den i ett `awk`-program.

Skillnader mellan GNU awk och BSD awk

För att ytterligare förstå skillnaderna mellan GNU `awk` (gawk) och BSD `awk`, här är några specifika punkter:

  • **Utökad Funktionalitet i gawk**: GNU `awk` innehåller flera utökade funktioner och tillägg som inte finns i BSD `awk`. Till exempel stödjer gawk `BEGINFILE` och `ENDFILE` mönster, vilket gör det möjligt att utföra åtgärder i början och slutet av varje fil, och även inbyggda funktioner för att arbeta med nätverk.
  • **Tilläggsmoduler i gawk**: GNU `awk` kan utökas med dynamiska moduler som erbjuder ytterligare funktioner. Dessa moduler kan laddas vid körning med hjälp av `@load`-direktivet.
  • **Prestandaförbättringar**: GNU `awk` har optimerats för bättre prestanda vid bearbetning av stora datamängder och komplexa mönster.
  • **Kommandoradsverktyg**: På macOS används BSD `awk` som standard, vilket innebär att vissa skript kan behöva modifieras för att fungera korrekt på macOS om de är skrivna specifikt för GNU `awk`.

Det är alltid bra att granska dokumentationen för respektive version av `awk` för att säkerställa kompatibilitet och förstå vilka funktioner som är tillgängliga.


Felsökning

Om du får ett felmeddelande när du använder `awk`, kontrollera följande:

  • Att syntaxen för ditt `awk`-program är korrekt. Kontrollera att du använder rätt mönster och åtgärder.
  • Att du använder rätt fältseparator (FS) om du arbetar med en fil med en annan separator än blanksteg.
  • Att variabler och funktioner som används i ditt `awk`-program är tillgängliga på din specifika plattform.

Se även

  • sed - Strömredigerare som används för att bearbeta textströmmar.
  • grep - Sök efter mönster i filer.
  • cut - Ta bort sektioner från varje rad i en fil.
  • sort - Sortera rader i textfiler.
  • uniq - Rapportera eller ta bort dubbletter av linjer.

Ytterligare Resurser

För att fördjupa dina kunskaper om `awk`, här är några ytterligare resurser:


Källor