Awk: Skillnad mellan sidversioner
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
Admin (diskussion | bidrag) (→Källor) |
||
(6 mellanliggande sidversioner av samma användare visas inte) | |||
Rad 1: | Rad 1: | ||
== | == 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. | |||
-F | * -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: | |||
<code> | |||
awk '{print $1}' fil.txt | |||
</code> | |||
* För att skriva ut den andra kolumnen av en fil med kommatecken som fältseparator: | |||
<code> | |||
awk -F, '{print $2}' fil.txt | |||
</code> | |||
* För att skriva ut rader som matchar ett specifikt mönster: | |||
<code> | |||
awk '/mönster/' fil.txt | |||
</code> | |||
* För att summera värden i den tredje kolumnen: | |||
<code> | |||
awk '{sum += $3} END {print sum}' fil.txt | |||
</code> | |||
* För att sätta en variabel och använda den i programmet: | |||
<code> | |||
awk -v var=10 '{print $1 * var}' fil.txt | |||
</code> | |||
* För att använda ett `awk`-program från en fil: | |||
<code> | |||
awk -f program.awk fil.txt | |||
</code> | |||
=== 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: | |||
<code> | |||
mönster { åtgärd } | |||
</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. | ||
=== 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. | |||
=== | === Källor === | ||
* [https://www.gnu.org/software/gawk/manual/gawk.html GNU gawk manual] | |||
* [https://man7.org/linux/man-pages/man1/awk.1.html awk manual (Linux)] | |||
* [https://www.unix.com/man-page/osx/1/awk/ awk manual (macOS)] | |||
=== | === 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: | |||
<code> | |||
awk '{print $2, $5}' fil.txt | |||
</code> | |||
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: | |||
<code> | |||
awk '/mönster/ {print $3}' fil.txt | |||
</code> | |||
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: | |||
<code> | |||
awk 'END {print NR}' fil.txt | |||
</code> | |||
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: | |||
<code> | |||
awk '{sum += $1} END {print sum/NR}' fil.txt | |||
</code> | |||
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: | |||
<code> | |||
awk '{gsub(/gammal_text/, "ny_text"); print}' fil.txt | |||
</code> | |||
Detta byter ut alla förekomster av "gammal_text" med "ny_text" och skriver ut resultatet. | |||
* För att kombinera `awk` med andra kommandon: | |||
<code> | |||
ps aux | awk '{print $1, $2, $3, $11}' | |||
</code> | |||
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: | |||
<code> | |||
awk 'NR % 2 == 0' fil.txt | |||
</code> | |||
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: | |||
<code> | |||
awk '{sum += $1; if ($1 > 100) print "Varning:", $1} END {print "Summa:", sum}' fil.txt | |||
</code> | |||
'' | * För att räkna antalet unika värden i en kolumn: | ||
<code> | |||
awk '!seen[$1]++' fil.txt | |||
</code> | |||
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: | |||
<code> | |||
function square(x) { | |||
return x * x | |||
} | |||
awk '{print $1, square($2)}' fil.txt | |||
</code> | |||
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 === | |||
* [https://www.gnu.org/software/gawk/manual/gawk.html GNU gawk manual] | |||
* [https://man7.org/linux/man-pages/man1/awk.1.html awk manual (Linux)] | |||
* [https://www.unix.com/man-page/osx/1/awk/ awk manual (macOS)] | |||
[[Kategori:Linuxkommandon]] | |||
Nuvarande version från 26 maj 2024 kl. 09.59
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.
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
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.