Awk
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.
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.
Fler 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.
Ytterligare Resurser
För att fördjupa dina kunskaper om `awk`, här är några ytterligare resurser:
- [The AWK Programming Language](https://archive.org/details/pdfy-MgN0H1joIoDVoIC7) - En klassisk bok av Aho, Kernighan och Weinberger, de ursprungliga skaparna av `awk`.
- [GNU Awk User's Guide](https://www.gnu.org/software/gawk/manual/) - Den officiella användarguiden för GNU `awk`, som täcker alla funktioner och tillägg.
- [Effective Awk Programming](https://www.gnu.org/software/gawk/manual/gawk.html) - En bok av Arnold Robbins som ger en djupgående introduktion till användning av `awk` och `gawk`.
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.
Källor
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.