Nyheter, Prylar, Android, Mobiler, Appnedladdningar, Android

40 Praktiskt och användbart awk-kommando i Linux och BSD

AWK är ett kraftfullt datadrivet programmeringsspråk som går tillbaka till Unix tidiga dagar. Det utvecklades ursprungligen för att skriva “one-liner”-program men har sedan dess utvecklats till ett fullfjädrat programmeringsspråk. AWK har fått sitt namn från initialerna till dess författare – Aho, Weinberger och Kernighan. Kommandot awk i Linux och andra Unix-system anropar tolken som kör AWK-skript.

Resurslänk: 10 Unix-baserade operativsystem som inte är Linux

Flera implementeringar av awk finns i nya system, såsom gawk (GNU awk), mawk (Minimal awk) och nawk (New awk), bland andra. Kolla in exemplen nedan om du vill behärska awk.

Förstå AWK-program


Program skrivna i awk består av regler, som helt enkelt är ett par mönster och handlingar. Mönstren är grupperade inom ett klammerparentes {}, och handlingsdelen utlöses när awk hittar texter som matchar mönstret. Även om awk utvecklades för att skriva one-liners, kan erfarna användare enkelt skriva komplexa skript med det.

AWK-program är mycket användbara för storskalig filbehandling. Den identifierar textfält med hjälp av specialtecken och avgränsare. Den erbjuder också högnivåprogrammeringskonstruktioner som arrayer och loopar. Så det är mycket möjligt att skriva robusta program med vanlig awk.

Praktiska exempel på awk-kommando i Linux


Administratörer använder normalt awk för dataextraktion och rapportering tillsammans med andra typer av filmanipulationer. Nedan har vi diskuterat awk mer i detalj. Följ kommandona noggrant och prova dem i din terminal för en fullständig förståelse.

1. Skriv ut specifika fält från textutdata


De mest använda Linux-kommandona visar sin utdata med olika fält. Normalt använder vi kommandot Linux cut för att extrahera ett specifikt fält från sådan data. Men kommandot nedan visar hur du gör detta med kommandot awk.

$ who | awk '{print $1}'

Detta kommando visar endast det första fältet från utdata från who-kommandot. Så du får helt enkelt användarnamnen för alla för närvarande inloggade användare. Här, $1 representerar det första fältet. Du måste använda $N om du vill extrahera det N:te fältet.

2. Skriv ut flera fält från textutmatning


Med awk-tolken kan vi skriva ut hur många fält vi vill. Exemplen nedan visar oss hur man extraherar de två första fälten från utdata från who-kommandot.

$ who | awk '{print $1, $2}'

Du kan också styra ordningen på utdatafälten. Följande exempel visar först den andra kolumnen som skapas av who-kommandot och sedan den första kolumnen i det andra fältet.

$ who | awk '{print $2, $1}'

Utelämna helt enkelt fältparametrarna ($N) för att visa hela data.

3. Använd BEGIN-satser


BEGIN-satsen tillåter användare att skriva ut viss känd information i utdata. Det används vanligtvis för att formatera utdata som genereras av awk. Syntaxen för detta uttalande visas nedan.

BEGIN { Actions}
{ACTION}

Åtgärderna som bildar BEGIN-sektionen utlöses alltid. Sedan läser awk de återstående raderna en efter en och ser om något behöver göras.

$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2}'

Ovanstående kommando kommer att märka de två utdatafälten som extraherats från WHO kommandots utdata.

4. Använd END-satser


Du kan också använda END-satsen för att säkerställa att vissa åtgärder alltid utförs i slutet av din operation. Placera helt enkelt END-sektionen efter huvuduppsättningen av åtgärder.

$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2} END {print "--COMPLETED--"}'

Ovanstående kommando kommer att lägga till den givna strängen i slutet av utdata.

5. Sök med mönster


En stor del av awks arbete involverar mönstermatchning och regex. Som vi redan har diskuterat, söker awk efter mönster i varje inmatningsrad och utför endast åtgärden när en matchning utlöses. Våra tidigare regler bestod endast av handlingar. Nedan har vi illustrerat grunderna för mönstermatchning med kommandot awk i Linux.

$ who | awk '/mary/ {print}'

Detta kommando kommer att se om användaren Mary för närvarande är inloggad eller inte. Den kommer att mata ut hela raden om någon matchning hittas.


Kommandot awk fungerar mycket bra med filer och kan användas för komplexa filbearbetningsuppgifter. Följande kommando illustrerar hur awk hanterar filer.

$ awk '/hello/ {print}' /usr/share/dict/american-english

Det här kommandot söker efter mönstret “hej” i den amerikansk-engelska ordboksfilen. Den är tillgänglig på de flesta Linux-baserade distributioner. Således kan du enkelt prova awk-program på den här filen.

7. Läs AWK-skriptet från källfilen


Även om det är användbart att skriva en-liner-program, kan du också skriva stora program med awk helt. Du kommer att vilja spara dem och köra ditt program med hjälp av källfilen.

$ awk -f script-file
$ awk --file script-file

De -f eller -fil alternativet låter oss specificera programfilen. Du behöver dock inte använda citattecken (‘ ‘) i skriptfilen eftersom Linux-skalet inte kommer att tolka programkoden på detta sätt.

8. Ställ in inmatningsfältseparator


En fältavgränsare är en avgränsare som delar indataposten. Vi kan enkelt specificera fältavgränsare till awk med hjälp av -F eller –fältavskiljare alternativ. Kolla in kommandona nedan för att se hur detta fungerar.

$ echo "This-is-a-simple-example" | awk -F - ' {print $1} '
$ echo "This-is-a-simple-example" | awk --field-separator - ' {print $1} '

Det fungerar på samma sätt när man använder skriptfiler snarare än one-liner awk-kommando i Linux.

9. Skriv ut information baserat på skick


Vi har diskuterat kommandot Linux cut i en tidigare guide. Nu kommer vi att visa dig hur du extraherar information med hjälp av awk endast när vissa kriterier matchas. Vi kommer att använda samma testfil som vi använde i den guiden. Så gå dit och gör en kopia av filen.

$ awk '$4 > 50' test.txt

Detta kommando kommer att skriva ut alla nationer från test.txt-filen, som har mer än 50 miljoner invånare.

10. Skriv ut information genom att jämföra reguljära uttryck


Följande awk-kommando kontrollerar om det tredje fältet på någon rad innehåller mönstret ‘Lira’ och skriver ut hela raden om en matchning hittas. Återigen använder vi filen test.txt som används för att illustrera kommandot Linux cut. Så se till att du har den här filen innan du fortsätter.

$ awk '$3 ~ /Lira/' test.txt

Du kan välja att bara skriva ut en specifik del av en match om du vill.

11. Räkna det totala antalet rader i inmatning


Kommandot awk har många specialvariabler som gör att vi enkelt kan göra många avancerade saker. En sådan variabel är NR, som innehåller det aktuella radnumret.

$ awk 'END {print NR} ' test.txt

Detta kommando kommer att mata ut hur många rader som finns i vår test.txt-fil. Den itererar först över varje rad, och när den har nått END, kommer den att skriva ut värdet på NR – som innehåller det totala antalet rader i detta fall.

12. Ställ in utgångsfältseparator


Tidigare har vi visat hur man väljer inmatningsfältseparatorer med hjälp av -F eller –fältavskiljare alternativ. Kommandot awk låter oss också specificera utdatafältseparatorn. Exemplet nedan visar detta med ett praktiskt exempel.

$ date | awk 'OFS="-" {print$2,$3,$6}'

Detta kommando skriver ut det aktuella datumet med formatet dd-mm-åå. Kör datumprogrammet utan awk för att se hur standardutgången ser ut.

13. Använda If Construct


Liksom andra populära programmeringsspråk förser awk också användare med if-else-konstruktionerna. If-satsen i awk har syntaxen nedan.

if (expression)
{
  first_action
  second_action
}

Motsvarande åtgärder utförs endast om det villkorliga uttrycket är sant. Exemplet nedan visar detta med vår referensfil.

$ awk '{ if ($4>100) print }' test.txt

Du behöver inte underhålla indraget strikt.

14. Använda If-Else-konstruktioner


Du kan konstruera användbara if-else-stegar med hjälp av syntaxen nedan. De är användbara när du skapar komplexa awk-skript som hanterar dynamisk data.

if (expression)
  first_action
else
  second_action
$ awk '{ if ($4>100) print; else print }' test.txt

Ovanstående kommando kommer att skriva ut hela referensfilen eftersom det fjärde fältet inte är större än 100 för varje rad.

15. Ställ in fältbredden


Ibland är indata ganska rörig och användare kan ha svårt att visualisera dem i sina rapporter. Lyckligtvis tillhandahåller awk en kraftfull inbyggd variabel som heter FIELDWIDTHS som låter oss definiera en blankstegsseparerad lista med bredder.

$ echo 5675784464657 | awk 'BEGIN {FIELDWIDTHS= "3 4 5"} {print $1, $2, $3}'

Det är mycket användbart när vi analyserar spridd data eftersom vi kan styra utdatafältets bredd precis som vi vill.

16. Ställ in postseparatorn


RS eller Record Separator är en annan inbyggd variabel som låter oss specificera hur poster separeras. Låt oss först skapa en fil som visar hur denna awk-variabel fungerar.

$ cat new.txt
Melinda James

23 New Hampshire

(222) 466-1234

Daniel James

99 Phonenix Road

(322) 677-3412
$ awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' new.txt

Detta kommando kommer att analysera dokumentet och spotta ut namn och adress för de två personerna.

17. Utskriftsmiljövariabler


Kommandot awk i Linux låter oss enkelt skriva ut miljövariabler med hjälp av variabeln ENVIRON. Kommandot nedan visar hur man använder detta för att skriva ut innehållet i PATH-variabeln.

$ awk 'BEGIN{ print ENVIRON["PATH"] }'

Du kan skriva ut innehållet i alla miljövariabler genom att ersätta argumentet för variabeln ENVIRON. Kommandot nedan skriver ut värdet för miljövariabeln HOME.

$ awk 'BEGIN{ print ENVIRON["HOME"] }'

18. Utelämna några fält från utdata


Kommandot awk låter oss utelämna specifika rader från vår utdata. Följande kommando kommer att demonstrera detta med vår referensfil.

$ awk -F":" '{$2=""; print}' test.txt

Detta kommando kommer att utelämna den andra kolumnen i vår fil, som innehåller namnet på huvudstaden för varje land. Du kan också utelämna mer än ett fält, som visas i nästa kommando.

$ awk -F":" '{$2="";$3="";print}' test.txt

19. Ta bort tomma rader


Ibland kan data innehålla för många tomma rader. Du kan använda kommandot awk för att ta bort tomma rader ganska enkelt. Kolla in nästa kommando för att se hur detta fungerar i praktiken.

$ awk '/^[ \t]*$/{next}{print}' new.txt

Vi har tagit bort alla tomma rader från filen new.txt med ett enkelt reguljärt uttryck och en inbyggd awk som heter next.

20. Ta bort efterföljande blanksteg


Utdata från många Linux-kommandon innehåller efterföljande blanksteg. Vi kan använda kommandot awk i Linux för att ta bort sådana blanksteg som mellanslag och flikar. Kolla in kommandot nedan för att se hur du löser sådana problem med awk.

$ awk '{sub(/[ \t]*$/, "");print}' new.txt test.txt

Lägg till några efterföljande blanksteg i våra referensfiler och kontrollera om awk tog bort dem framgångsrikt eller inte. Det gjorde detta framgångsrikt på min maskin.

21. Kontrollera antalet fält på varje rad


Vi kan enkelt kontrollera hur många fält som finns på en rad med en enkel awk one-liner. Det finns många sätt att göra detta, men vi kommer att använda några av awks inbyggda variabler för denna uppgift. NR-variabeln ger oss radnumret och NF-variabeln ger antalet fält.

$ awk '{print NR,"-->",NF}' test.txt

Nu kan vi bekräfta hur många fält som finns per rad i vårt dokument. Eftersom varje rad i den här filen innehåller 5 fält, är vi säkra på att kommandot fungerar som förväntat.

22. Verifiera aktuellt filnamn


awk-variabeln FILENAME används för att verifiera det aktuella indatafilnamnet. Vi visar hur detta fungerar med ett enkelt exempel. Det kan dock vara användbart i situationer där filnamnet inte är explicit känt eller det finns mer än en indatafil.

$ awk '{print FILENAME}' test.txt
$ awk '{print FILENAME}' test.txt new.txt

Ovanstående kommandon skriver ut filnamnet awk arbetar med varje gång den bearbetar en ny rad av indatafilerna.

23. Verifiera antalet bearbetade poster


Följande exempel visar hur vi kan verifiera antalet poster som behandlas av kommandot awk. Eftersom ett stort antal Linux-systemadministratörer använder awk för att generera rapporter, är det mycket användbart för dem.

$ awk '{print "Processing Record - ",NR;} END {print "\nTotal Records Processed:", NR;}' test.txt

Jag använder ofta det här awk-utdraget för att få en tydlig överblick över mina handlingar. Du kan enkelt justera den för att ta emot nya idéer eller åtgärder.

24. Skriv ut det totala antalet tecken i en post


Språket awk tillhandahåller en praktisk funktion som kallas length() som talar om för oss hur många tecken som finns i en post. Det är mycket användbart i ett antal scenarier. Ta en snabb titt på följande exempel för att se hur detta fungerar.

$ echo "A random text string..." | awk '{ print length($0); }'
$ awk '{ print length($0); }' /etc/passwd

Kommandot ovan kommer att skriva ut det totala antalet tecken som finns på varje rad i inmatningssträngen eller filen.

25. Skriv ut alla rader längre än en specificerad längd


Vi kan lägga till några villkor till kommandot ovan och få det att bara skriva ut de rader som är större än en fördefinierad längd. Det är användbart när du redan har en idé om längden på en specifik post.

$ echo "A random text string..." | awk 'length($0) > 10'
$ awk '{ length($0) > 5; }' /etc/passwd

Du kan lägga in fler alternativ och/eller argument för att justera kommandot baserat på dina krav.

26. Skriv ut antalet rader, tecken och ord


Följande awk-kommando i Linux skriver ut antalet rader, tecken och ord i en given inmatning. Den använder NR-variabeln samt lite grundläggande aritmetik för att utföra denna operation.

$ echo "This is a input line..." | awk '{ w += NF; c += length + 1 } END { print NR, w, c }'

Den visar att det finns 1 rad, 5 ord och exakt 24 tecken i inmatningssträngen.

27. Beräkna frekvensen av ord


Vi kan kombinera associativa arrayer och for-loopen i awk för att beräkna ordfrekvensen för ett dokument. Följande kommando kan verka lite komplicerat, men det är ganska enkelt när du väl förstår de grundläggande konstruktionerna tydligt.

$ awk 'BEGIN {FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) words[tolower($i)]++ } END { for (i in words) print i, words[i] }' test.txt

Om du har problem med det enradiga kodavsnittet kopierar du följande kod till en ny fil och kör den med källan.

$ cat > frequency.awk
BEGIN {
FS="[^a-zA-Z]+"
}
{
for (i=1; i<=NF; i++)
words[tolower($i)]++
}
END {
for (i in words)
print i, words[i]
}

Kör den sedan med hjälp av -f alternativ.

$ awk -f frequency.awk test.txt

28. Byt namn på filer med AWK


Kommandot awk kan användas för att byta namn på alla filer som matchar vissa kriterier. Följande kommando illustrerar hur man använder awk för att byta namn på alla .MP3 filer i en katalog till .mp3.

$ touch {a,b,c,d,e}.MP3
$ ls *.MP3 | awk '{ printf("mv \"%s\" \"%s\"\n", $0, tolower($0)) }'
$ ls *.MP3 | awk '{ printf("mv \"%s\" \"%s\"\n", $0, tolower($0)) }' | sh

Först skapade vi några demofiler med tillägget .MP3. Det andra kommandot visar användaren vad som händer när namnbytet lyckas. Slutligen utför det sista kommandot byta namn med kommandot mv i Linux.

29. Skriv ut kvadratroten av ett tal


AWK erbjuder flera inbyggda funktioner för att manipulera siffror. En av dem är funktionen sqrt(). Det är en C-liknande funktion som returnerar kvadratroten ur ett givet tal. Ta en snabb titt på nästa exempel för att se hur detta fungerar i allmänhet.

$ awk 'BEGIN{ print sqrt(36); print sqrt(0); print sqrt(-16) }'

Eftersom du inte kan bestämma kvadratroten av ett negativt tal, kommer resultatet att visa ett speciellt nyckelord som kallas ‘nan’ i stället för sqrt(-12).

30. Skriv ut logaritmen för ett tal


Funktionen awk log() tillhandahåller den naturliga logaritmen för ett tal. Det kommer dock bara att fungera med positiva siffror, så var medveten om att validera användarnas input. Annars kan någon bryta dina awk-program och få oprivilegierad tillgång till systemresurser.

$ awk 'BEGIN{ print log(36); print log(0); print log(-16) }'

Du bör se logaritmen för 36 och verifiera att logaritmen för 0 är oändlig och logaritmen för ett negativt värde är ‘Inte ett tal’ eller nan.

31. Skriv ut exponentialen för ett tal


Det exponentiella os a-talet n ger värdet av e^n. Det används vanligtvis i awk-skript som hanterar stora siffror eller komplex aritmetisk logik. Vi kan generera exponentialen för ett tal med den inbyggda awk-funktionen exp().

$ awk 'BEGIN{ print exp(30); print log(0); print exp(-16) }'

Däremot kan awk inte beräkna exponentiellt för extremt stora tal. Du bör göra sådana beräkningar med hjälp av lågnivåprogrammeringsspråk som C och mata värdet till dina awk-skript.

32. Generera slumptal med AWK


Vi kan använda kommandot awk i Linux för att generera slumptal. Dessa tal kommer att ligga i intervallet 0 till 1, men aldrig 0 eller 1. Du kan multiplicera ett fast värde med det resulterande talet för att få ett större slumpmässigt värde.

$ awk 'BEGIN{ print rand(); print rand()*99 }'

Rand()-funktionen behöver inget argument. Dessutom är siffrorna som genereras av denna funktion inte exakt slumpmässiga utan snarare pseudo-slumpmässiga. Dessutom är det ganska lätt att förutsäga dessa siffror från körning till körning. Så du bör inte lita på dem för känsliga beräkningar.

33. Färgkompilatorvarningar i rött


Moderna Linux-kompilatorer kommer att skicka varningar om din kod inte upprätthåller språkstandarder eller har fel som inte stoppar programexekveringen. Följande awk-kommando kommer att skriva ut varningsraderna som genereras av en kompilator i rött.

$ gcc -Wall main.c |& awk '/: warning:/{print "\x1B[01;31m" $0 "\x1B[m";next;}{print}'

Det här kommandot är användbart om du vill hitta kompilatorvarningar specifikt. Du kan använda det här kommandot med vilken kompilator som helst förutom GCC; se bara till att ändra mönstret /: warning:/ för att återspegla just den kompilatorn.

34. Skriv ut UUID-informationen för filsystemet


UUID, eller Universellt unik identifierareär ett nummer som kan användas för att identifiera resurser som Linux-filsystemet. Vi kan helt enkelt skriva ut UUID-informationen för vårt filsystem genom att använda följande Linux awk-kommando.

$ awk '/UUID/ {print $0}' /etc/fstab

Detta kommando söker efter texten UUID i /etc/fstab fil med hjälp av awk-mönster. Det returnerar en kommentar från filen som vi inte är intresserade av. Kommandot nedan kommer att se till att vi bara får de rader som börjar med UUID.

$ awk '/^UUID/ {print $1}' /etc/fstab

Det begränsar utmatningen till det första fältet. Så vi får bara UUID-numren.

35. Skriv ut versionen av Linux Kernel Image


Olika Linux-kärnavbildningar används av olika Linux-distributioner. Vi kan enkelt skriva ut den exakta kärnbilden som vårt system bygger på att använda awk. Kolla in följande kommando för att se hur detta fungerar i allmänhet.

$ uname -a | awk '{print $3}'

Vi har först utfärdat kommandot uname med -a alternativet och skickade sedan dessa data till awk. Sedan extraherade vi versionsinformationen för kärnavbildningen med awk.

36. Lägg till radnummer före rader


Användare kan stöta på textfiler som inte innehåller radnummer ganska ofta. Lyckligtvis kan du enkelt lägga till radnummer till en fil med kommandot awk i Linux. Ta en närmare titt på exemplet nedan för att se hur detta fungerar i verkligheten.

$ awk '{ print FNR ". " $0 ;next}{print}' test.txt

Ovanstående kommando kommer att lägga till ett radnummer före var och en av raderna i vår test.txt-referensfil. Den använder den inbyggda awk-variabeln FNR för att hantera detta.

37. Skriv ut en fil efter att ha sorterat innehållet


Vi kan också använda awk för att skriva ut en sorterad lista över alla rader. Följande kommandon skriver ut namnen på alla länder i vår test.txt i sorterad ordning.

$ awk -F ':' '{ print $1 }' test.txt | sort

Nästa kommando kommer att skriva ut inloggningsnamnet för alla användare från filen.

$ awk -F ':' '{ print $1 }' /etc/passwd | sort

Du kan enkelt ändra sorteringsordningen genom att ändra sorteringskommandot.

38. Skriv ut manualsidan


Manualsidan innehåller detaljerad information om kommandot awk tillsammans med alla tillgängliga alternativ. Det är oerhört viktigt för personer som vill behärska kommandot awk grundligt.

$ man awk

Om du vill lära dig komplexa awk-funktioner kommer detta att vara till stor hjälp för dig. Läs denna dokumentation när du har fastnat med ett problem.

39. Skriv ut hjälpsidan


Hjälpsidan innehåller sammanfattad information om alla möjliga kommandoradsargument. Du kan anropa hjälpguiden för awk med ett av följande kommandon.

$ awk -h
$ awk --help

Konsultera den här sidan om du vill ha en snabb översikt över alla tillgängliga alternativ för awk.

40. Information om utskriftsversion


Versionsinformationen ger oss information om ett programs konstruktion. Versionssidan för awk innehåller information som dess upphovsrätt, kompileringsverktyg och så vidare. Du kan se denna information med ett av följande awk-kommandon.

$ awk -V
$ awk --version

Avslutande tankar


Kommandot awk i Linux låter oss göra alla möjliga saker, inklusive filbearbetning och systemunderhåll. Det ger ett brett utbud av operationer för att hantera dagliga datoruppgifter ganska enkelt.

Våra redaktörer har sammanställt den här guiden med 40 användbara awk-kommandon som kan användas för textmanipulation eller administration. Eftersom AWK är ett fullfjädrat programmeringsspråk i sig, finns det flera sätt att göra samma jobb.

Så undra inte varför vi gör vissa saker på ett annat sätt. Du kan alltid sammanställa dina egna recept baserat på din kompetens och erfarenhet. Lämna oss dina tankar och låt oss veta om du har några frågor.