Awk: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Ingen redigeringssammanfattning
Ingen redigeringssammanfattning
Rad 1: Rad 1:
==== '''NAMN''' ====
== awk - Mönsterinriktad textbearbetning ==
''mawk'' - mönsterskanning och textbearbetningsspråk
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.


==== '''SYNOPSIS''' ====
=== Syntax ===
mawk [-W alternativ] [-F värde] [-v var=värde] [--] 'program text' [fil ...]
awk [ALTERNATIV] 'PROGRAM' [FIL]...


mawk [-W alternativ] [-F värde] [-v var=värde] [-f program-fil] [--] [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.


==== '''BESKRIVNING''' ====
=== Alternativ ===
mawk är en tolk för programmeringsspråket AWK. AWK-språket är användbart för manipulering av datafiler, texthämtning och bearbetning,och för prototyper och experimenterande med algoritmer. mawk är en ny awk vilket betyder att den implementerar AWK-språket som definierats i Aho, ernighan och  Weinberger, The AWK Programming Language, Addison-Wesley Publishing, 1988 (hädanefter kallad AWK-boken.) mawk överensstämmer med POSIX  1003.2 (utkast 11.3) definition av AWK-språket som innehåller några funktioner som inte beskrivs i AWK-boken, och mawk tillhandahåller ett litet antal förlängningar. Ett AWK-program är en sekvens av mönster {action}-par och funktionsdefinitioner. Korta program skrivs in på kommandoraden som vanligtvis är innesluten i   ' ' för att undvika skaltolkning. Längre program kan läsas in från en fil med alternativet -f. Datainmatning läses från listan över filer på  kommandoraden eller från standardinmatning när listan är tom. Inmatningen delas upp i poster som bestäms av postseparatorvariabeln, RS. Inledningsvis är RS = "\n" och poster är synonyma med linjer. Varje post jämförs mot varje mönster och om det stämmer överens, programtexten  för {action} exekveras.
Kommandot `awk` stöder flera alternativ som kan användas för att justera hur bearbetningen utförs:


==== '''ALTERNATIV''' ====
* -F FS - Ange fältseparatorn (FS) till ett specifikt tecken eller sträng.
-F värde ställer in fältseparatorn, FS, till värde.
* -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.


-f fil  Programtext läses från filen istället för från kommandoraden. Flera -f-alternativ är tillåtna.
=== Exempel ===
Här är några praktiska exempel som visar hur du kan använda `awk`-kommandot:


-v var=värde  tilldelar värde till programvariabel var.
* För att skriva ut den första kolumnen i en textfil:
<code>
awk '{print $1}' fil.txt
</code>


Alternativen ovan kommer att vara tillgängliga med alla POSIX-kompatibla implementeringar av AWK. Implementeringsspecifika alternativ inleds med -W. mawk tillhandahåller dessa:
* För att skriva ut den andra kolumnen av en fil med kommatecken som fältseparator:
<code>
awk -F, '{print $2}' fil.txt
</code>


--    indikerar det entydiga slutet av alternativen.
* För att skriva ut rader som matchar ett specifikt mönster:
<code>
awk '/mönster/' fil.txt
</code>


       -W dump   skriver en assembler-liknande lista över programmets interna representation till stdout och avslutar 0 (vid framgångsrik kompilering).
* För att summera värden i den tredje kolumnen:
<code>
awk '{sum += $3} END {print sum}' fil.txt
</code>


       -W exec file Programtext läses från fil och detta är det sista alternativet.
* För att sätta en variabel och använda den i programmet:
<code>
awk -v var=10 '{print $1 * var}' fil.txt
</code>


Detta är ett användbart alternativ till -f på system som stöder #! "magiskt nummer"-konvention för körbara skript. De  implicerade
* För att använda ett `awk`-program från en fil:
<code>
awk -f program.awk fil.txt
</code>


skicka in sökvägen till själva skriptet som den sista parametern och förvänta dig inte mer än ett "-"-alternativ #! linje. Därför att
=== Programstruktur ===
Ett `awk`-program består av mönster och åtgärder som utförs varje rad som matchar mönstret. Programstrukturen ser ut så här:


mawk kan kombinera flera -W-alternativ separerade med kommatecken, du kan använda det här alternativet när ett extra -W-alternativ behövs.
<code>
mönster { åtgärd }
</code>


-W help skriver ut ett användningsmeddelande till stderr och avslutar (samma som "-W usage").      
* **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 `{}`.


-W interactive ställer in obuffrad skrivning till stdout och linjebuffrad läsning från stdin. Poster från stdin är linjer oavsett värdet på RS.
=== 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.


-W posix_space tvingar mawk att inte betrakta '\n' som utrymme.
=== 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.


-W random=num anropar srand med den givna parametern (och åsidosätter beteendet för automatisk seeding).
=== 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:


-W sprintf=num justerar storleken mawks interna sprintf-buffert till antal byte. Mer än sällsynt användning av det här alternativet indikerar att mawk bör kompileras om.
* 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 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.


-W usage      skriver ut ett användningsmeddelande till stderr och avslutar (samma som "-W help").
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.


-W version     mawk skriver sin version och upphovsrätt till stdout och kompilerade gränser till stderr och avslutar 0.
=== Felsökning ===
Om du får ett felmeddelande när du använder `awk`, kontrollera följande:


mawk accepterar förkortningar för något av dessa alternativ, t.ex. "-W v" och "-Wv" säger båda till mawk att visa sin version.
* 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.


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


=== DET AWK SPRÅKET ===
* 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.


=====     1. Programstruktur =====
* För att skriva ut rader som matchar ett mönster och skriva ut en specifik kolumn:
        Ett AWK-program är en sekvens av mönster {action}-par och användarfunktionsdefinitioner.
<code>
awk '/mönster/ {print $3}' fil.txt
</code>
Detta skriver ut den tredje kolumnen från alla rader som innehåller "mönster".


        Ett mönster kan vara:
* 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.


             BÖRJA
* 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.


             SLUTET
* 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.


             uttryck
* 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.


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


En, men inte båda, av mönster {action} kan utelämnas. Om {action} utelämnas är det implicit { print }. Om mönstret utelämnas är det im‐
* **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.


uttryckligen matchade. BEGIN- och END-mönster kräver en åtgärd.
=== Avancerade Mönster och Åtgärder ===
Här är några exempel på avancerade mönster och åtgärder:


Uttalandet avslutas med nya rader, semikolon eller båda. Grupper av satser som åtgärder eller loopkroppar blockeras via { ... } som i C.
* 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.


Den sista satsen i ett block behöver ingen terminator. Tomma linjer har ingen betydelse; en tom sats avslutas med semikolon. Lång uttalanden kan fortsätta med ett snedstreck, \. Ett uttalande kan brytas utan ett snedstreck efter kommatecken, vänster klammerparentes, &&, ||, gör, annars, höger parentes för en if, while eller for-sats, och höger parentes för en funktionsdefinition. En kommentar börjar med # och sträcker sig till, men inkluderar inte slutet av raden.
* 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:


'''Följande satser styr programflödet inuti block.'''
<code>
function square(x) {
    return x * x
}


if ( expr ) påstående
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.


if ( expr ) påstående else påstående
=== 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:


while ( expr ) påstående
* **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`.


do påstående while ( expr )
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.


for ( opt_expr ; opt_expr ; opt_expr ) påstående
=== Ytterligare Resurser ===
För att fördjupa dina kunskaper om `awk`, här är några ytterligare resurser:


for ( var in array ) påstående
* [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`.


continue
=== 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.


break
=== 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)]


==== 2. Datatyper, konvertering och jämförelse ====
[[Kategori:Unix-kommandon]]
Det finns två grundläggande datatyper, numerisk och sträng. Numeriska konstanter kan vara heltal som -2, decimal som 1,08 eller i vetenskaplig notation som -1.1e4 eller .28E-3. Alla tal representeras internt och alla beräkningar görs i float‐ing-punktsaritmetik.


Så till exempel är uttrycket 0.2e2 == 20 sant och sant representeras som 1.0. Strängkonstanter omges av dubbla citattecken. "Detta är en sträng med en nyrad i slutet.\n" Strängar kan fortsätta över en linje genom att escape (\) den nya raden. Följande flyktsekvenser känns igen.




Strängkonstanter omges av dubbla citattecken.


"Detta är en sträng med en nyrad i slutet.\n"
=== 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.


       Strängar kan fortsätta över en linje genom att escape (\) den nya raden. Följande flyktsekvenser känns igen.
=== 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:Unix-kommandon]]
 
            \" "
 
            \a alert, ascii 7
 
            \b backsteg, ascii 8
 
            \t tab, ascii 9
 
            \n nyrad, ascii 10
 
            \v vertikal flik, ascii 11
 
            \f formfeed, ascii 12
 
            \r vagnretur, ascii 13
 
            \ddd 1, 2 eller 3 oktala siffror för ascii ddd
 
            \xhh 1 eller 2 hexadecimala siffror för ascii hh
 
 Om du escape någon annan karaktär \c, får du \c, d.v.s. mawk ignorerar escape.
 
Det finns egentligen tre grundläggande datatyper; den tredje är nummer och sträng som har både ett numeriskt värde och ett strängvärde på samma gång. Användardefinierade variabler uppstår när de först refereras och initieras till null, ett tal och strängvärde som har numeriskt värde 0 och strängvärde "". Icke-trivialt antal och strängtypade data kommer från indata och lagras vanligtvis i fält. (Se avsnitt 4).
 
Strängkonstanter omges av dubbla citattecken.
 
"Detta är en sträng med en nyrad i slutet.\n"
 
Strängar kan fortsätta över en linje genom att escape (\) den nya raden. Följande flyktsekvenser känns igen.
 
 \\ \
 
 \" "
 
 \a alert, ascii 7
 
 \b backsteg, ascii 8
 
 \t tab, ascii 9
 
\n nyrad, ascii 10
 
 \v vertikal flik, ascii 11
 
 \f formfeed, ascii 12
 
 \r vagnretur, ascii 13
 
 \ddd 1, 2 eller 3 oktala siffror för ascii ddd
 
  \xhh 1 eller 2 hexadecimala siffror för ascii hh
 
  Om du escape någon annan karaktär \c, får du \c, d.v.s. mawk ignorerar flykt. Det finns egentligen tre grundläggande datatyper; den tredje är nummer och sträng som har både ett numeriskt värde och ett strängvärde på samma gång. Användardefinierade variabler uppstår när de först refereras och initieras till null, ett ta och strängvärde som har numeriskt värde 0 och strängvärde "". Icke-trivialt antal och strängtypade data kommer från indata och lagras allmänt i fält. (Se avsnitt 4).
 
==== 3. Vanliga uttryck ====
        I AWK-språket testas ofta poster, fält och strängar för att matcha ett reguljärt uttryck. Reguljära uttryck bifogas
 
        i snedstreck, och
 
             expr ~ /r/
 
är ett AWK-uttryck som utvärderas till 1 om expr "matchar" r, vilket betyder att en delsträng av expr finns i uppsättningen strängar som definieras av r.  Utan matchning evalueras uttrycket till 0; ersätter ~ med operatorn "matchar inte", !~ , vänder innebörden. Som mönsterhandling par,
 
/r/ { action } och $0 ~ /r/ { action }
 
är desamma, och för varje indatapost som matchar r, exekveras åtgärd. Faktum är att /r/ är ett AWK-uttryck som motsvarar ($0 ~ /r/) var som helst utom när på höger sida av en matchningsoperator eller skickas som ett argument till en inbyggd funktion som förväntar sig en reguljära uttrycksargument.
 
AWK använder utökade reguljära uttryck som med alternativet -E för grep(1). De reguljära uttryckets metatecken, dvs de med special betydelse i reguljära uttryck är
 
             \ ^ $ . [ ] | ( ) * + ?
 
        Reguljära uttryck byggs upp av tecken enligt följande:
 
             c matchar alla icke-metatecken c.
 
             \c matchar ett tecken som definieras av samma escape-sekvenser som används i strängkonstanter eller det bokstavliga tecknet c om \c är inte en flyktsekvens.
 
             . matchar alla tecken (inklusive nyrad).
 
             ^ matchar framsidan av en sträng.
 
             $ matchar baksidan av en sträng.
 
             [c1c2c3...] matchar alla tecken i klassen c1c2c3... . Ett teckenintervall betecknas c1-c2 i en klass [...].
 
[^c1c2c3...] matchar alla tecken som inte ingår i klassen c1c2c3...
 
        Reguljära uttryck byggs upp från andra reguljära uttryck enligt följande:
 
             r1r2 matchar r1 följt omedelbart av r2 (konkatenering).
 
             r1 | r2 matchar r1 eller r2 (alternering).
 
             r* matchar r som upprepas noll eller fler gånger.
 
             r+ matchar r som upprepas en eller flera gånger.
 
             r? matchar r noll eller en gång.
 
             (r) matchar r, tillhandahåller gruppering.
 
        Operatörernas ökande företräde är alternering, sammanlänkning och unär (*, + eller ?).
 
        Till exempel,
 
             /^[_a-zA-Z][_a-zA-Z0-9]*$/ och
 
             /^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$ /
 
        matchas av AWK-identifierare respektive AWK-numeriska konstanter. Anteckna det "." måste undvikas för att identifieras som en decimal
 
        punkt, och att metatecken inte är speciella inuti karaktärsklasser.
 
        Vilket uttryck som helst kan användas på höger sida om operatorerna ~ eller !~ eller skickas till en inbyggd som förväntar sig ett reguljärt uttryck.
 
        Om det behövs konverteras det till sträng och tolkas sedan som ett reguljärt uttryck. Till exempel,
 
             BEGIN { identifier = "[_a-zA-Z][_a-zA-Z0-9]*" }
 
             $0 ~ "^" identifierare
 
        skriver ut alla rader som börjar med en AWK-identifierare.
 
mawk känner igen det tomma reguljära uttrycket, //, som matchar den tomma strängen och därför matchas av valfri sträng framtill, baktill och mellan varje karaktär. Till exempel,
 
             echo abc | mawk { gsub(//, "X"); print }
 
             XaXbXcX

Versionen från 26 maj 2024 kl. 09.49

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:

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.

Källor