AZ-kommandoer

40 Praktisk og nyttig awk-kommando i Linux og BSD

40 Praktisk og nyttig awk-kommando i Linux og BSD

AWK er et kraftigt datadrevet programmeringssprog, der daterer sin oprindelse tilbage til de tidlige dage af Unix. Det blev oprindeligt udviklet til at skrive 'one-liner' programmer, men har siden udviklet sig til et fuldt udviklet programmeringssprog. AWK får sit navn fra initialerne fra dets forfattere - Aho, Weinberger og Kernighan. AWK-kommandoen i Linux og andre Unix-systemer påkalder tolken, der kører AWK-scripts. Flere implementeringer af awk findes i nyere systemer såsom gawk (GNU awk), mawk (Minimal awk) og nawk (New awk), blandt andre. Tjek nedenstående eksempler, hvis du vil mestre awk.

Forståelse af AWK-programmer


Programmer skrevet i awk består af regler, der simpelthen er et par mønstre og handlinger. Mønstrene er grupperet i en bøjle , og handlingsdelen udløses, når awk finder tekster, der matcher mønsteret. Selvom awk blev udviklet til at skrive one-liners, kan erfarne brugere nemt skrive komplekse scripts med det.

AWK-programmer er meget nyttige til filbehandling i stor skala. Det identificerer tekstfelter ved hjælp af specialtegn og separatorer. Det tilbyder også programmeringskonstruktioner på højt niveau som arrays og loop. Så det er meget muligt at skrive robuste programmer ved hjælp af almindelig awk.

Praktiske eksempler på awk Command i Linux


Administratorer bruger normalt awk til dataekstraktion og rapportering sammen med andre typer filmanipulationer. Nedenfor har vi diskuteret awk mere detaljeret. Følg kommandoerne omhyggeligt, og prøv dem i din terminal for en fuldstændig forståelse.

1. Udskriv specifikke felter fra tekstoutput


De mest anvendte Linux-kommandoer viser deres output ved hjælp af forskellige felter. Normalt bruger vi Linux cut-kommandoen til at udtrække et specifikt felt fra sådanne data. Imidlertid viser kommandoen nedenfor dig, hvordan du gør dette ved hjælp af kommandoen awk.

$ hvem | awk 'print $ 1'

Denne kommando viser kun det første felt fra output fra who-kommandoen. Så du får simpelthen brugernavne på alle aktuelt loggede brugere. Her, $ 1 repræsenterer det første felt. Du skal bruge $ N hvis du vil udtrække det niende felt.

2. Udskriv flere felter fra tekstoutput


Awk-tolken giver os mulighed for at udskrive et hvilket som helst antal felter, vi ønsker. Eksemplerne nedenfor viser os, hvordan man udtrækker de to første felter fra output fra who-kommandoen.

$ hvem | awk 'udskriv $ 1, $ 2'

Du kan også kontrollere rækkefølgen af ​​outputfelterne. I det følgende eksempel vises først den anden kolonne produceret af who-kommandoen og derefter den første kolonne i det andet felt.

$ hvem | awk 'udskriv $ 2, $ 1'

Du skal blot udelade feltparametrene ($ N) for at få vist hele data.

3. Brug BEGIN-erklæringer


BEGIN-sætningen giver brugerne mulighed for at udskrive nogle kendte oplysninger i output. Det bruges normalt til formatering af outputdata genereret af awk. Syntaksen for denne erklæring er vist nedenfor.

BEGIN Actions ACTION

De handlinger, der danner BEGIN-sektionen, udløses altid. Derefter læser awk de resterende linjer en efter en og ser om noget skal gøres.

$ hvem | awk 'BEGIN print "User \ tFrom" print $ 1, $ 2'

Ovenstående kommando markerer de to outputfelter, der er udvundet fra who-kommandos output.

4. Brug END-erklæringer


Du kan også bruge END-erklæringen for at sikre dig, at visse handlinger altid udføres i slutningen af ​​din operation. Du skal blot placere END-sektionen efter det vigtigste sæt handlinger.

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

Ovenstående kommando tilføjer den givne streng i slutningen af ​​output.

5. Søg ved hjælp af mønstre


En stor del af awks arbejde involverer mønster matching og regex. Som vi allerede har diskuteret, søger awk efter mønstre i hver inputlinje og udfører kun handlingen, når et match udløses. Vores tidligere regler bestod kun af handlinger. Nedenfor har vi illustreret det grundlæggende i mønstermatchning ved hjælp af kommandoen awk i Linux.

$ hvem | awk '/ mary / print'

Denne kommando vil se, om brugermarien i øjeblikket er logget på eller ej. Det udsender hele linjen, hvis der findes et match.

6. Uddrag information fra filer


Kommandoen awk fungerer meget godt med filer og kan bruges til komplekse filbehandlingsopgaver. Følgende kommando illustrerer, hvordan awk håndterer filer.

$ awk '/ hej / print' / usr / share / dict / american-english

Denne kommando søger efter mønsteret 'hej' i filen amerikansk-engelsk ordbog. Den er tilgængelig på de fleste Linux-baserede distributioner. Således kan du nemt prøve awk-programmer på denne fil.

7. Læs AWK-script fra kildefilen


Selvom det er nyttigt at skrive one-liner-programmer, kan du også skrive store programmer ved hjælp af awk helt. Du vil gerne gemme dem og køre dit program ved hjælp af kildefilen.

$ awk -f script-fil $ awk -fil script-fil

Det -f eller -fil mulighed giver os mulighed for at specificere programfilen. Du behøver dog ikke bruge citater (") inde i script-filen, da Linux-shell ikke fortolker programkoden på denne måde.

8. Indstil inputfeltadskiller


En feltseparator er en afgrænser, der deler inputposten. Vi kan nemt angive feltadskillere, der skal awk ved hjælp af -F eller -felt-separator mulighed. Tjek nedenstående kommandoer for at se, hvordan dette fungerer.

$ echo "Dette er et simpelt eksempel" | awk -F - 'print $ 1' $ echo "This-is-a-simple-example" | awk --field-separator - 'print $ 1'

Det fungerer det samme, når du bruger scriptfiler i stedet for en-liner awk-kommando i Linux.

9. Udskriv oplysninger baseret på tilstand


Vi har diskuteret Linux cut-kommandoen i en tidligere guide. Nu viser vi dig, hvordan du kun udtrækker information ved hjælp af awk, når visse kriterier matches. Vi bruger den samme testfil, som vi brugte i den vejledning. Så gå derovre og lav en kopi af prøve.txt fil.

$ awk '$ 4> 50' test.txt

Denne kommando vil udskrive alle nationer fra testen.txt-fil, der har mere end 50 millioner indbyggere.

10. Udskriv oplysninger ved at sammenligne regulære udtryk


Følgende awk-kommando kontrollerer, om det tredje felt på en linje indeholder mønsteret 'Lira' og udskriver hele linjen, hvis der findes et match. Vi bruger igen testen.txt-fil, der bruges til at illustrere Linux cut-kommandoen. Så sørg for at du har denne fil, inden du fortsætter.

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

Du kan vælge kun at udskrive en bestemt del af et match, hvis du vil.

11. Tæl det samlede antal linjer i input


Awk-kommandoen har mange specialvariabler, der giver os mulighed for nemt at gøre mange avancerede ting. En sådan variabel er NR, som indeholder det aktuelle linjenummer.

$ awk 'END print NR' test.txt

Denne kommando afgiver, hvor mange linjer der er i vores test.txt-fil. Den gentages først over hver linje, og når den har nået END, vil den udskrive værdien af ​​NR - som indeholder det samlede antal linjer i dette tilfælde.

12. Indstil outputfeltadskiller


Tidligere har vi vist, hvordan du vælger inputfeltadskillere ved hjælp af -F eller -feltseparator mulighed. Kommandoen awk tillader os også at specificere outputfeltadskilleren. Nedenstående eksempel viser dette ved hjælp af et praktisk eksempel.

$ dato | awk 'OFS = "-" udskriv $ 2, $ 3, $ 6'

Denne kommando udskriver den aktuelle dato ved hjælp af dd-mm-åå-formatet. Kør datoprogrammet uden problemer for at se, hvordan standardoutputtet ser ud.

13. Brug af If Construct


Ligesom andre populære programmeringssprog giver awk også brugerne if-else-konstruktioner. If-sætningen i awk har nedenstående syntaks.

hvis (udtryk) first_action second_action

De tilsvarende handlinger udføres kun, hvis det betingede udtryk er sandt. Nedenstående eksempel viser dette ved hjælp af vores referencefil prøve.txt.

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

Du behøver ikke at opretholde indrykningen nøje.

14. Brug af If-Else-konstruktioner


Du kan konstruere nyttige if-else stiger ved hjælp af nedenstående syntaks. De er nyttige ved udformning af komplekse awk-scripts, der beskæftiger sig med dynamiske data.

hvis (udtryk) første_handling andet sekund_handling
$ awk 'if ($ 4> 100) print; ellers print 'test.txt

Ovenstående kommando udskriver hele referencefilen, da det fjerde felt ikke er større end 100 for hver linje.

15. Indstil feltbredden


Nogle gange er inputdataene ganske rodet, og brugere kan have svært ved at visualisere dem i deres rapporter. Heldigvis giver awk en kraftig indbygget variabel kaldet FIELDWIDTHS, der giver os mulighed for at definere en hvidrumsadskilt liste over bredder.

$ ekko 5675784464657 | awk 'BEGIN FIELDWIDTHS = "3 4 5" udskriv $ 1, $ 2, $ 3'

Det er meget nyttigt ved analyse af spredte data, da vi kan styre outputfeltbredden nøjagtigt, som vi ønsker.

16. Indstil Record Separator


RS eller Record Separator er en anden indbygget variabel, der giver os mulighed for at specificere, hvordan poster adskilles. Lad os først oprette en fil, der viser, hvordan denne awk-variabel fungerer.

$ kat ny.txt Melinda James 23 New Hampshire (222) 466-1234 Daniel James 99 Phonenix Road (322) 677-3412
$ awk 'BEGIN FS = "\ n"; print $ 1, $ 3' ny.txt

Denne kommando analyserer dokumentet og spytter navn og adresse ud til de to personer.

17. Udskriv miljøvariabler


Kommandoen awk i Linux giver os mulighed for nemt at udskrive miljøvariabler ved hjælp af variablen ENVIRON. Nedenstående kommando viser, hvordan man bruger dette til at udskrive indholdet af PATH-variablen.

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

Du kan udskrive indholdet af alle miljøvariabler ved at erstatte argumentet for ENVIRON-variablen. Nedenstående kommando udskriver værdien af ​​miljøvariablen HOME.

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

18. Udelad nogle felter fra output


Kommandoen awk giver os mulighed for at udelade specifikke linjer fra vores output. Den følgende kommando viser dette ved hjælp af vores referencefil prøve.txt.

$ awk -F ":" '$ 2 = ""; udskriv 'test.txt

Denne kommando udelader den anden kolonne i vores fil, som indeholder navnet på hovedstaden for hvert land. Du kan også udelade mere end et felt som vist i den næste kommando.

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

19. Fjern tomme linjer


Nogle gange kan data indeholde for mange tomme linjer. Du kan bruge kommandoen awk til nemt at fjerne tomme linjer. Tjek den næste kommando for at se, hvordan dette fungerer i praksis.

$ awk '/ ^ [\ t] * $ / næste print' nyt.txt

Vi har fjernet alle tomme linjer fra filen ny.txt ved hjælp af et simpelt regulært udtryk og en awk indbygget kaldet næste.

20. Fjern efterfølgende hvide rum


Outputtet fra mange Linux-kommandoer indeholder efterfølgende mellemrum. Vi kan bruge awk-kommandoen i Linux til at fjerne sådanne hvide rum som mellemrum og faner. Tjek nedenstående kommando for at se, hvordan man tackler sådanne problemer ved hjælp af awk.

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

Føj nogle efterfølgende mellemrum til vores referencefiler, og kontroller, om awk har fjernet dem med succes eller ej. Det gjorde det med succes i min maskine.

21. Kontroller antallet af felter i hver linje


Vi kan nemt kontrollere, hvor mange felter der er på en linje ved hjælp af en simpel awk one-liner. Der er mange måder at gøre dette på, men vi bruger nogle af awk's indbyggede variabler til denne opgave. NR-variablen giver os linjenummeret, og NF-variablen giver antallet af felter.

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

Nu kan vi bekræfte, hvor mange felter der er pr. Linje i vores prøve.txt dokument. Da hver linje i denne fil indeholder 5 felter, er vi sikre på, at kommandoen fungerer som forventet.

22. Bekræft aktuelt filnavn


Awk-variablen FILENAME bruges til at verificere det aktuelle inputfilnavn. Vi demonstrerer, hvordan dette fungerer ved hjælp af et simpelt eksempel. Det kan dog være nyttigt i situationer, hvor filnavnet ikke kendes eksplicit, eller der er mere end en inputfil.

$ awk 'print FILENAME' test.txt $ awk 'print FILENAME' test.txt nyt.txt

Ovenstående kommandoer udskriver filnavnet, awk arbejder på, hver gang det behandler en ny linje med inputfilerne.

23. Bekræft antallet af behandlede poster


Følgende eksempel viser, hvordan vi kan verificere antallet af poster, der behandles af awk-kommandoen. Da et stort antal Linux-systemadministratorer bruger awk til at generere rapporter, er det meget nyttigt for dem.

$ awk 'print "Processing Record -", NR; END print "\ nTotale poster behandlet:", NR;' test.txt

Jeg bruger ofte dette awk-uddrag til at have et klart overblik over mine handlinger. Du kan nemt tilpasse det for at imødekomme nye ideer eller handlinger.

24. Udskriv det samlede antal tegn i en post


Awk-sproget giver en praktisk funktion kaldet længde (), der fortæller os, hvor mange tegn der er til stede i en post. Det er meget nyttigt i en række scenarier. Se hurtigt på følgende eksempel for at se, hvordan dette fungerer.

$ echo "En tilfældig tekststreng ..." | awk 'udskrivningslængde ($ 0);  '
$ awk 'udskrivningslængde ($ 0);  '/ etc / passwd

Ovenstående kommando udskriver det samlede antal tegn til stede i hver linje i inputstrengen eller filen.

25. Udskriv alle linjer længere end en specificeret længde


Vi kan tilføje nogle betingelser til ovenstående kommando og lade den kun udskrive de linjer, der er større end en foruddefineret længde. Det er nyttigt, når du allerede har en idé om længden af ​​en bestemt post.

$ echo "En tilfældig tekststreng ..." | awk 'længde ($ 0)> 10'
$ awk 'længde ($ 0)> 5;  '/ etc / passwd

Du kan smide flere muligheder og / eller argumenter for at finjustere kommandoen baseret på dine krav.

26. Udskriv antallet af linjer, tegn og ord


Den følgende awk-kommando i Linux udskriver antallet af linjer, tegn og ord i en given input. Den bruger NR-variablen såvel som nogle grundlæggende aritmetikker til at udføre denne operation.

$ echo "Dette er en inputlinje ..." | awk 'w + = NF; c + = længde + 1 AFSLUT print NR, w, c '

Det viser, at der er 1 linje, 5 ord og nøjagtigt 24 tegn til stede i inputstrengen.

27. Beregn hyppigheden af ​​ord


Vi kan kombinere associerende arrays og for-loop i awk for at beregne ordets hyppighed i et dokument. Følgende kommando kan virke lidt kompleks, men det er ret simpelt, når du først har forstået de grundlæggende konstruktioner.

$ 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

Hvis du har problemer med one-liner-uddraget, skal du kopiere følgende kode i en ny fil og køre den ved hjælp af kilden.

$ kat> frekvens.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 det derefter ved hjælp af -f mulighed.

$ awk -f frekvens.awk test.txt

28. Omdøb filer ved hjælp af AWK


Kommandoen awk kan bruges til at omdøbe alle filer, der matcher bestemte kriterier. Den følgende kommando illustrerer, hvordan man bruger awk til at omdøbe alle .MP3-filer i et bibliotek til .mp3-filer.

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

Først oprettede vi nogle demo-filer med .MP3 udvidelse. Den anden kommando viser brugeren, hvad der sker, når omdøbet er vellykket. Endelig omdøber operationen ved hjælp af kommandoen mv i Linux.

29. Udskriv kvadratroden af ​​et tal


AWK tilbyder flere indbyggede funktioner til manipulation af tal. En af dem er funktionen sqrt (). Det er en C-lignende funktion, der returnerer kvadratroden af ​​et givet tal. Se hurtigt på det næste eksempel for at se, hvordan dette fungerer generelt.

$ awk 'BEGIN print sqrt (36)
        
Sådan installeres og afspilles Doom på Linux
Introduktion til undergang Doom-serien opstod i 90'erne efter frigivelsen af ​​den originale Doom. Det var et øjeblikkeligt hit, og fra den tid af har...
Vulkan til Linux-brugere
Med hver nye generation af grafikkort ser vi spiludviklere skubbe grænserne for grafisk troskab og komme et skridt tættere på fotorealisme. Men på tro...
OpenTTD vs Simutrans
Oprettelse af din egen transportsimulering kan være sjovt, afslappende og ekstremt lokkende. Derfor skal du sørge for at prøve så mange spil som mulig...