Hvordan bruke AWK på Linux

Hvordan bruke AWK på Linux

Verktøyene Linux -tilbudet følger ofte UNIX -filosofien om design. Ethvert verktøy skal være lite, bruk ren tekst for I/O, og operere på en modulær måte. Takket være arven har vi noen av de fineste tekstbehandlingsfunksjonalitetene ved hjelp av verktøy som SED og AWK.

I Linux kommer AWK-verktøyet forhåndsinstallert på alle Linux-distros. AWK i seg selv er et programmeringsspråk. AWK -verktøyet er bare en tolk av AWK -programmeringsspråket. I denne guiden, sjekk ut hvordan du bruker AWK på Linux.

Awk bruk

AWK -verktøyet er mest nyttig når tekster er organisert i et forutsigbart format. Det er ganske bra til å analysere og manipulere tabelldata. Den fungerer på linje-for-linje, på hele tekstfilen.

Standardoppførselen til AWK er å bruke Whitespaces (mellomrom, faner osv.) for å skille felt. Heldigvis følger mange av konfigurasjonsfilene på Linux dette mønsteret.

Grunnleggende syntaks

Slik ser kommandostrukturen til AWK ut.

$ awk '// ; ; '

Delene av kommandoen er ganske selvforklarende. AWK kan operere uten søk eller handlingsdel. Hvis ingenting er spesifisert, vil standardhandlingen på kampen bare utskrift. I utgangspunktet vil AWK skrive ut alle kampene som finnes på filen.

Hvis det ikke er noen spesifisert søkemønster, vil AWK utføre de spesifiserte handlingene på hver eneste linje i filen.

Hvis begge delene er gitt, vil AWK bruke mønsteret for å avgjøre om den nåværende linjen gjenspeiler det. Hvis matchet, utfører AWK den spesifiserte handlingen.

Merk at AWK også kan fungere på omdirigerte tekster. Dette kan oppnås ved å pipere innholdet i kommandoen til AWK for å handle på. Lær mer om Linux Pipe -kommandoen.

For demoformål, her er en eksempler på tekstfil. Den inneholder 10 linjer, 2 ord per linje.

$ katteprøve.tekst

Vanlig uttrykk

En av nøkkelfunksjonene som gjør AWK til et kraftig verktøy er støtten til vanlig uttrykk (Regex, for kort). Et vanlig uttrykk er en streng som representerer et visst mønster av karakterer.

Her er en liste over noen av de vanligste syntaksene for vanlige uttrykk. Disse regex -syntaksene er ikke bare unike for AWK. Dette er nesten universelle regex -syntaks, så det å mestre dem vil også hjelpe i andre apper/programmering som innebærer regelmessig uttrykk.

  • Grunnleggende tegn: Alle alfanumeriske tegn understreker (_) osv.
    • Karaktersett: For å gjøre ting enklere, er det karaktergrupper i regex. For eksempel store bokstaver (A-Z), små bokstaver (A-Z) og numeriske sifre (0-9).
  • Metakaraktører: Dette er karakterer som forklarer forskjellige måter å utvide de vanlige karakterene.
    • Periode (.): Enhver karakterkamp i stillingen er gyldig (bortsett fra en ny linje).
    • Asterisk (*): Null eller flere eksistenser av den umiddelbare karakteren før den er gyldig.
    • Bracket ([]): Kampen er gyldig hvis, i stillingen, noen av karakterene fra braketten blir matchet. Det kan kombineres med karaktersett.
    • Caret (^): Kampen må være i starten av linjen.
    • Dollar ($): Kampen må være på slutten av linjen.
    • Backslash (\): Hvis noen metakarakter må brukes i bokstavelig forstand.

Skrive ut teksten

For å skrive ut alt innholdet i en tekstfil, bruk utskriftskommandoen. Når det gjelder søkemønsteret, er det ikke noe mønster definert. Så, AWK skriver ut alle linjene.

$ awk 'print' prøve.tekst

Her er "Print" en AWK -kommando som skriver ut innholdet i inngangen.

Strengsøk

AWK kan utføre et grunnleggende tekstsøk på den gitte teksten. I mønsterdelen må det være teksten å finne.

I den følgende kommandoen vil AWK søke etter teksten "rask" på alle linjene i filprøven.tekst.

$ awk '/hurtig/' prøve.tekst

La oss nå bruke noen vanlige uttrykk for å finjustere søket ytterligere. Følgende kommando vil skrive ut alle linjene som har "brune" i begynnelsen.

$ awk '/^brun/' prøve.tekst

Hva med å finne noe på slutten av en linje? Følgende kommando vil skrive ut alle linjene som har "raske" på slutten.

$ awk '/hurtig $/' prøve.tekst

Wild Card -mønster

Det neste eksemplet kommer til å vise frem bruken av karetten (.). Her kan det være noen to tegn før karakteren "e".

$ awk '/… e/' prøve.tekst

Wild Card Pattern (ved hjelp av Asterisk)

Hva om det kan være et hvilket som helst antall tegn på stedet? For å matche for enhver mulig karakter i stillingen, bruk stjerne (*). Her vil AWK matche alle linjene som har noen mengder tegn etter “The”.

$ awk '/*/' -prøven.tekst

Brakettuttrykk

Følgende eksempel kommer til å vise hvordan du bruker brakettuttrykket. Bracket Expression forteller at på stedet vil kampen være gyldig hvis den samsvarer med settet med tegn som er omsluttet av parentesene. For eksempel vil følgende kommando samsvare med “The” og “Tee” som gyldige kamper.

$ awk '/t [he] e/' prøve.tekst

Det er noen forhåndsdefinerte karaktersett i det vanlige uttrykket. For eksempel er settet med alle store bokstaver merket som "A-Z". I den følgende kommandoen vil AWK samsvare med alle ordene som inneholder en store bokstaver.

$ awk '/[a-z]/' prøve.tekst

Ta en titt på følgende bruk av karaktersett med brakettuttrykk.

  • [0-9]: Indikerer et enkelt siffer
  • [A-Z]: Indikerer et enkelt små bokstaver
  • [A-Z]: Indikerer en enkelt store bokstav
  • [A-Za-Z]: Indikerer en enkelt bokstav
  • [A-Za-Z 0-9]: Indikerer et enkelt tegn eller siffer.

AWK forhåndsdefinerte variabler

AWK kommer med en haug med forhåndsdefinerte og automatiske variabler. Disse variablene kan lage skriveprogrammer og skript med AWK enklere.

Her er noen av de vanligste AWK -variablene du kommer over.

  • FILNAVN: Filnavnet til den gjeldende inndatafilen.
  • Rs: Rekordseparatoren. På grunn av arten av AWK, behandler den data en post om gangen. Her spesifiserer denne variabelen avgrenseren som brukes til å dele opp datastrømmen i poster. Som standard er denne verdien Newline -karakteren.
  • Nr: Gjeldende inngangsrekordnummer. Hvis RS -verdien er satt til standard, vil denne verdien indikere gjeldende inngangslinjenummer.
  • FS/OFS: Karakteren (e) som brukes som feltskiller. Når den er lest, deler AWK en rekord i forskjellige felt. Avgrenseren er definert av verdien av FS. Når du skriver ut, blir AWK igjen i alle feltene. På dette tidspunktet bruker AWK imidlertid OFS -separatoren i stedet for FS -separatoren. Generelt er både FS og OFS de samme, men ikke obligatoriske å være slik.
  • Nf: Antall felt i gjeldende post. Hvis standardverdien “Whitespace” brukes, vil den samsvare med antall ord i gjeldende post.
  • Ors: Registreringsseparatoren for utdataene. Standardverdien er Newline -tegnet.

La oss sjekke dem i aksjon. Følgende kommando vil bruke NR -variabelen til utskriftslinje 2 til linje 4 fra prøven.tekst. AWK støtter også logiske operatører som Logical og (&&).

$ awk 'nr> 1 && nr < 5' sample.txt

For å tilordne en spesifikk verdi til en AWK -variabel, bruk følgende struktur.

$ awk '// ; ; ' =,

For eksempel for å fjerne alle de blanke linjene fra inndatafilen, endre verdien av RS til i utgangspunktet ingenting. Det er et triks som bruker en uklar posix -regel. Den spesifiserer at hvis verdien av RS er en tom streng, så blir poster separert med en sekvens som består av en ny linje med en eller flere blanke linjer. I posix er en tom linje uten innhold helt tom. Imidlertid, hvis linjen inneholder hvitespasninger, regnes den ikke som "blank".

$ awk 'print' rs = "prøve.tekst

Tilleggsressurser

AWK er et kraftig verktøy med mange funksjoner. Mens denne guiden dekker mange av dem, er det fortsatt bare det grunnleggende. Mestring av AWK vil ta mer enn bare dette. Denne guiden skal være en fin introduksjon til verktøyet.

Hvis du virkelig vil mestre verktøyet, er her noen ekstra ressurser du bør sjekke ut.

  • Trim Whitespace
  • Ved hjelp av en betinget uttalelse
  • Skriv ut en rekke kolonner
  • Regex med awk
  • 20 AWK -eksempler

Internett er et ganske bra sted å lære noe. Det er mange fantastiske opplæringsprogrammer om AWK -grunnleggende for veldig avanserte brukere.

Endelig tanke

Forhåpentligvis bidro denne guiden til å gi en god forståelse av det grunnleggende AWK. Selv om det kan ta en stund, er det å mestre AWK ekstremt givende når det gjelder kraften det gir.

Glad databehandling!