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 kraftig datadrevet programmeringsspråk som stammer fra begynnelsen til Unix. Den ble opprinnelig utviklet for å skrive 'one-liner' programmer, men har siden utviklet seg til et fullverdig programmeringsspråk. AWK får navnet sitt fra initialene til forfatterne - Aho, Weinberger og Kernighan. Awk-kommandoen i Linux og andre Unix-systemer påkaller tolk som kjører AWK-skript. Flere implementeringer av awk finnes i nyere systemer som blant annet gawk (GNU awk), mawk (Minimal awk) og nawk (New awk). Ta en titt på eksemplene nedenfor hvis du vil mestre awk.

Forstå AWK-programmer


Programmer skrevet i awk består av regler, som bare er et par mønstre og handlinger. Mønstrene er gruppert i en avstivning , og handlingsdelen utløses når awk finner tekster som samsvarer med mønsteret. Selv om awk ble utviklet for å skrive en-liners, kan erfarne brukere enkelt skrive komplekse skript med det.

AWK-programmer er veldig nyttige for storskala filbehandling. Den identifiserer tekstfelt ved hjelp av spesialtegn og skilletegn. Det tilbyr også programmeringskonstruksjoner på høyt nivå som matriser og sløyfer. Så det er veldig mulig å skrive robuste programmer med vanlig awk.

Praktiske eksempler på awk Command i Linux


Administratorer bruker normalt awk for datautvinning og rapportering sammen med andre typer filmanipulasjoner. Nedenfor har vi diskutert awk mer detaljert. Følg kommandoene nøye og prøv dem i terminalen din for fullstendig forståelse.

1. Skriv ut spesifikke felt fra tekstutdata


De mest brukte Linux-kommandoene viser utdataene sine ved hjelp av forskjellige felt. Normalt bruker vi kommandoen Linux cut for å trekke ut et bestemt felt fra slike data. Imidlertid viser kommandoen nedenfor deg hvordan du gjør dette ved hjelp av kommandoen awk.

$ hvem | awk 'print $ 1'

Denne kommandoen viser bare det første feltet fra utdataene fra hvem-kommandoen. Så du vil ganske enkelt få brukernavnene til alle nåværende loggede brukere. Her, $ 1 representerer det første feltet. Du må bruke $ N hvis du vil trekke ut det niende feltet.

2. Skriv ut flere felt fra tekstutdata


Awk-tolken lar oss skrive ut et hvilket som helst antall felt vi ønsker. Eksemplene nedenfor viser hvordan vi trekker ut de to første feltene fra utdataene fra hvem-kommandoen.

$ hvem | awk 'skriv ut $ 1, $ 2'

Du kan også kontrollere rekkefølgen på utgangsfeltene. Følgende eksempel viser først den andre kolonnen produsert av who-kommandoen og deretter den første kolonnen i det andre feltet.

$ hvem | awk 'skriv ut $ 2, $ 1'

Bare utelat feltparametrene ($ N) for å vise hele dataene.

3. Bruk BEGIN Statements


BEGIN-setningen lar brukerne skrive ut kjent informasjon i utdataene. Det brukes vanligvis til formatering av utdataene generert av awk. Syntaksen for denne påstanden er vist nedenfor.

BEGIN Actions ACTION

Handlingene som utgjør BEGIN-delen utløses alltid. Så leser awk de resterende linjene en etter en og ser om noe må gjøres.

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

Ovennevnte kommando vil merke de to utgangsfeltene ekstrahert fra hvem-kommandos utdata.

4. Bruk END-uttalelser


Du kan også bruke END-setningen for å sikre at visse handlinger alltid utføres på slutten av operasjonen. Bare plasser END-delen etter det viktigste settet med handlinger.

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

Ovennevnte kommando vil legge til den gitte strengen på slutten av utgangen.

5. Søk ved hjelp av mønstre


En stor del av awks arbeid innebærer mønstermatching og regex. Som vi allerede har diskutert, søker awk etter mønstre i hver inngangslinje og utfører bare handlingen når en kamp utløses. Våre tidligere regler besto av bare handlinger. Nedenfor har vi illustrert det grunnleggende om mønstermatching ved hjelp av awk-kommandoen i Linux.

$ hvem | awk '/ mary / print'

Denne kommandoen vil se om brukeren Mary er pålogget eller ikke. Det vil sende ut hele linjen hvis noen samsvar blir funnet.

6. Pakk ut informasjon fra filer


Kommandoen awk fungerer veldig bra med filer og kan brukes til komplekse filbehandlingsoppgaver. Følgende kommando illustrerer hvordan awk håndterer filer.

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

Denne kommandoen søker etter mønsteret 'hei' i den amerikansk-engelske ordboksfilen. Den er tilgjengelig på de fleste Linux-baserte distribusjoner. Dermed kan du enkelt prøve awk-programmer på denne filen.

7. Les AWK-skript fra kildefilen


Selv om det er nyttig å skrive en-linjeprogrammer, kan du også skrive store programmer med awk helt. Du vil lagre dem og kjøre programmet ditt ved hjelp av kildefilen.

$ awk -f skriptfil $ awk --fil skriptfil

De -f eller -fil alternativet lar oss spesifisere programfilen. Du trenger imidlertid ikke bruke anførselstegn (") inne i skriptfilen, siden Linux-skallet ikke tolker programkoden på denne måten.

8. Angi inndatafelteseparator


En feltseparator er en avgrenser som deler inngangsposten. Vi kan enkelt spesifisere feltseparatorer som skal awk ved hjelp av -F eller -feltutskiller alternativ. Sjekk ut kommandoene nedenfor for å se hvordan dette fungerer.

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

Det fungerer det samme når du bruker skriptfiler i stedet for en-liner awk-kommando i Linux.

9. Utskriftsinformasjon basert på tilstand


Vi har diskutert Linux cut-kommandoen i en tidligere guide. Nå viser vi deg hvordan du bare henter ut informasjon ved hjelp av awk når visse kriterier samsvarer. Vi bruker den samme testfilen som vi brukte i den guiden. Så gå der borte og lag en kopi av test.tekst fil.

$ awk '$ 4> 50' test.tekst

Denne kommandoen vil skrive ut alle nasjoner fra testen.txt-fil, som har mer enn 50 millioner innbyggere.

10. Skriv ut informasjon ved å sammenligne vanlige uttrykk


Følgende awk-kommando sjekker om det tredje feltet på en linje inneholder mønsteret 'Lira' og skriver ut hele linjen hvis en samsvar blir funnet. Vi bruker igjen testen.txt-fil som brukes til å illustrere Linux cut-kommandoen. Så sørg for at du har denne filen før du fortsetter.

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

Du kan velge å bare skrive ut en bestemt del av en hvilken som helst kamp hvis du vil.

11. Telle totalt antall linjer i inngangen


Awk-kommandoen har mange spesielle variabler som lar oss gjøre mange avanserte ting enkelt. En slik variabel er NR, som inneholder gjeldende linjenummer.

$ awk 'END print NR' test.tekst

Denne kommandoen vil gi ut hvor mange linjer det er i testen.txt-fil. Den gjentas først over hver linje, og når den har nådd SLUTT, vil den skrive ut verdien til NR - som inneholder det totale antallet linjer i dette tilfellet.

12. Sett utgangsfeltutskiller


Tidligere har vi vist hvordan du velger inndatafelteseparatorer ved hjelp av -F eller -feltutskiller alternativ. Med awk-kommandoen kan vi også spesifisere separatoren for utgangsfeltet. Eksemplet nedenfor viser dette ved hjelp av et praktisk eksempel.

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

Denne kommandoen skriver ut gjeldende dato ved hjelp av dd-mm-åå-formatet. Kjør datoprogrammet uten problemer for å se hvordan standardutgangen ser ut.

1. 3. Bruke If Construct


Som andre populære programmeringsspråk, gir awk også brukerne if-else-konstruksjonene. If-setningen i awk har syntaksen nedenfor.

hvis (uttrykk) first_action second_action

De tilsvarende handlingene utføres bare hvis det betingede uttrykket er sant. Eksemplet nedenfor viser dette ved hjelp av vår referansefil test.tekst.

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

Du trenger ikke å opprettholde fordypningen strengt.

14. Bruke If-Else-konstruksjoner


Du kan konstruere nyttige if-else-stiger ved hjelp av syntaksen nedenfor. De er nyttige når du lager komplekse awk-skript som håndterer dynamiske data.

hvis (uttrykk) første_handling annet sekund_handling
$ awk 'if ($ 4> 100) utskrift; else print 'test.tekst

Kommandoen ovenfor vil skrive ut hele referansefilen, siden det fjerde feltet ikke er større enn 100 for hver linje.

15. Still inn feltbredden


Noen ganger er inngangsdata ganske rotete, og brukere kan synes det er vanskelig å visualisere dem i rapportene sine. Heldigvis gir awk en kraftig innebygd variabel kalt FIELDWIDTHS som lar oss definere en blanktegn-delt liste over bredder.

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

Det er veldig nyttig når man analyserer spredte data, siden vi kan kontrollere bredden på utgangsfeltet akkurat som vi vil.

16. Still inn plateutskilleren


RS eller Record Separator er en annen innebygd variabel som lar oss spesifisere hvordan poster skilles. La oss først lage en fil som vil demonstrere hvordan denne awk-variabelen fungerer.

$ katt 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.tekst

Denne kommandoen vil analysere dokumentet og spytte ut navnet og adressen til de to personene.

17. Skriv ut miljømessige variabler


Awk-kommandoen i Linux lar oss enkelt skrive ut miljøvariabler ved hjelp av variabelen ENVIRON. Kommandoen nedenfor viser hvordan du bruker dette til å skrive ut innholdet i PATH-variabelen.

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

Du kan skrive ut innholdet i alle miljøvariabler ved å erstatte argumentet til ENVIRON-variabelen. Kommandoen nedenfor skriver ut verdien av miljøvariabelen HOME.

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

18. Utelat noen felt fra produksjonen


Med awk-kommandoen kan vi utelate spesifikke linjer fra utdataene våre. Følgende kommando vil demonstrere dette ved hjelp av vår referansefil test.tekst.

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

Denne kommandoen vil utelate den andre kolonnen i filen vår, som inneholder navnet på hovedstaden for hvert land. Du kan også utelate mer enn ett felt, som vist i neste kommando.

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

19. Fjern tomme linjer


Noen ganger kan data inneholde for mange blanke linjer. Du kan bruke awk-kommandoen for å fjerne tomme linjer ganske enkelt. Sjekk ut neste kommando for å se hvordan dette fungerer i praksis.

$ awk '/ ^ [\ t] * $ / neste print' ny.tekst

Vi har fjernet alle tomme linjer fra filen ny.txt ved hjelp av et enkelt regulært uttrykk og en innebygd awk kalt neste.

20. Fjern etterfølgende hvite mellomrom


Resultatet av mange Linux-kommandoer inneholder etterfølgende mellomrom. Vi kan bruke awk-kommandoen i Linux for å fjerne slike mellomrom som mellomrom og faner. Sjekk ut kommandoen nedenfor for å se hvordan du kan takle slike problemer ved hjelp av awk.

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

Legg til noen etterfølgende mellomrom i referansefilene, og kontroller om awk fjernet dem med hell eller ikke. Det gjorde dette med suksess i maskinen min.

21. Kontroller antall felt i hver linje


Vi kan enkelt sjekke hvor mange felt det er på en linje ved hjelp av en enkel awk one-liner. Det er mange måter å gjøre dette på, men vi vil bruke noen av awks innebygde variabler for denne oppgaven. NR-variabelen gir oss linjenummeret, og NF-variabelen gir antall felt.

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

Nå kan vi bekrefte hvor mange felt det er per linje i vår test.tekst dokument. Siden hver linje i denne filen inneholder 5 felt, er vi sikre på at kommandoen fungerer som forventet.

22. Bekreft nåværende filnavn


Awk-variabelen FILENAME brukes til å verifisere gjeldende filnavn. Vi demonstrerer hvordan dette fungerer ved hjelp av et enkelt eksempel. Det kan imidlertid være nyttig i situasjoner der filnavnet ikke er kjent eksplisitt, eller det er mer enn en inndatafil.

$ awk 'print FILENAME' test.txt $ awk 'print FILENAME' test.txt ny.tekst

Ovennevnte kommandoer skriver ut filnavnet awk jobber med hver gang det behandler en ny linje med inndatafilene.

23. Bekreft antall behandlede poster


Følgende eksempel viser hvordan vi kan verifisere antall poster behandlet av awk-kommandoen. Siden et stort antall Linux-systemadministratorer bruker awk for å generere rapporter, er det veldig nyttig for dem.

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

Jeg bruker ofte dette awk-utdraget for å ha en klar oversikt over handlingene mine. Du kan enkelt justere den for å imøtekomme nye ideer eller handlinger.

24. Skriv ut totalt antall tegn i en post


Awk-språket gir en praktisk funksjon kalt lengde () som forteller oss hvor mange tegn som er tilstede i en post. Det er veldig nyttig i en rekke scenarier. Se raskt på følgende eksempel for å se hvordan dette fungerer.

$ echo "En tilfeldig tekststreng ..." | awk 'utskriftslengde ($ 0);  '
$ awk 'utskriftslengde ($ 0);  '/ etc / passwd

Ovennevnte kommando vil skrive ut det totale antallet tegn som er til stede i hver linje i inngangsstrengen eller filen.

25. Skriv ut alle linjene lenger enn en spesifisert lengde


Vi kan legge til noen betingelser i kommandoen ovenfor og gjøre at den bare skriver ut linjene som er større enn en forhåndsdefinert lengde. Det er nyttig når du allerede har en idé om lengden på en bestemt plate.

$ echo "En tilfeldig tekststreng ..." | awk 'lengde ($ 0)> 10'
$ awk 'lengde ($ 0)> 5;  '/ etc / passwd

Du kan kaste inn flere alternativer og / eller argumenter for å tilpasse kommandoen basert på dine krav.

26. Skriv ut antall linjer, tegn og ord


Følgende awk-kommando i Linux skriver ut antall linjer, tegn og ord i en gitt inngang. Den bruker NR-variabelen, så vel som noen grunnleggende aritmetikk for å utføre denne operasjonen.

$ echo "Dette er en inngangslinje ..." | awk 'w + = NF; c + = lengde + 1 SLUT skriv NR, w, c '

Det viser at det er 1 linje, 5 ord og nøyaktig 24 tegn til stede i inngangsstrengen.

27. Beregn ordfrekvensen


Vi kan kombinere assosiative matriser og for-loop i awk for å beregne ordfrekvensen til et dokument. Følgende kommando kan virke litt kompleks, men det er ganske enkelt når du forstår de grunnleggende konstruksjonene tydelig.

$ 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 kodebiten, kan du kopiere følgende kode i en ny fil og kjøre den ved hjelp av kilden.

$ cat> 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] 

Kjør den deretter med -f alternativ.

$ awk -f frekvens.awk test.tekst

28. Gi nytt navn til filer ved hjelp av AWK


Kommandoen awk kan brukes til å gi nytt navn til alle filer som samsvarer med bestemte kriterier. Følgende kommando illustrerer hvordan du bruker awk for å gi nytt navn til alle .MP3-filer i en katalog 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, tolower ($ 0))' | sh

Først opprettet vi noen demofiler med .MP3-utvidelse. Den andre kommandoen viser brukeren hva som skjer når omdøpet vellykkes. Til slutt gjør den siste kommandoen nytt navn ved hjelp av mv-kommandoen i Linux.

29. Skriv ut kvadratrot av et nummer


AWK tilbyr flere innebygde funksjoner for å manipulere tall. En av dem er funksjonen sqrt (). Det er en C-lignende funksjon som returnerer kvadratroten til et gitt tall. Ta en rask titt på neste eksempel for å se hvordan dette fungerer generelt.

$ awk 'BEGIN print sqrt (36)
        
Beste spill å spille med håndsporing
Oculus Quest introduserte nylig den gode ideen om håndsporing uten kontrollere. Med et stadig økende antall spill og aktiviteter som utfører støtte en...
Hvordan vise OSD-overlegg i fullskjerm Linux-apper og spill
Å spille fullskjermspill eller bruke apper i distraksjonsfri fullskjermmodus kan avskrekke deg fra relevant systeminformasjon som er synlig i et panel...
Topp 5 spillfangstkort
Vi har alle sett og elsket streaming av spill på YouTube. PewDiePie, Jakesepticye og Markiplier er bare noen av de beste spillerne som har tjent milli...