Awk: Skillnad mellan sidversioner
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
||
Rad 59: | Rad 59: | ||
</code> | </code> | ||
* 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 === | === Exempel === | ||
Rad 154: | Rad 184: | ||
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. | 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 === | === Felsökning === | ||
Rad 204: | Rad 198: | ||
* [[sort]] - Sortera rader i textfiler. | * [[sort]] - Sortera rader i textfiler. | ||
* [[uniq]] - Rapportera eller ta bort dubbletter av linjer. | * [[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: | |||
* [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`. | |||
=== Källor === | === Källor === |
Versionen från 26 maj 2024 kl. 09.55
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:
- [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`.