Hvordan bruke Awk og regulære uttrykk for å filtrere tekst eller streng i filer


Når vi kjører visse kommandoer i Unix/Linux for å lese eller redigere tekst fra en streng eller fil, prøver vi oftest å filtrere utdata til en gitt del av interesse. Det er her bruk av regulære uttrykk kommer godt med.

Les også: 10 nyttige Linux-kjedeoperatører med praktiske eksempler

Hva er regulære uttrykk?

Et regulært uttrykk kan defineres som en strenger som representerer flere tegnsekvenser. En av de viktigste tingene med regulære uttrykk er at de lar deg filtrere utdataene til en kommando eller fil, redigere en del av en tekst eller konfigurasjonsfil og så videre.

Funksjoner av regulært uttrykk

Regelmessige uttrykk er laget av:

  1. Vanlige tegn som mellomrom, understrek(_), A-Z, a-z, 0-9.
  2. Metategn som utvides til vanlige tegn, de inkluderer:

    1. (.) den samsvarer med ethvert enkelt tegn bortsett fra en ny linje.
    2. (*) den samsvarer med null eller flere eksistenser av det umiddelbare tegnet foran det.
    3. [ tegn(er) ] det samsvarer med et av tegnene som er spesifisert i tegn(er), man kan også bruke en bindestrek (-) for å bety en rekke tegn som f.eks. som [a-f], [1-5], og så videre.
    4. ^ den samsvarer med begynnelsen av en linje i en fil.
    5. $ samsvarer med slutten av linjen i en fil.
    6. \ det er et escape-tegn.

For å filtrere tekst, må man bruke et tekstfiltreringsverktøy som awk. Du kan tenke på awk som et eget programmeringsspråk. Men for omfanget av denne veiledningen for å bruke awk, skal vi dekke det som et enkelt kommandolinjefiltreringsverktøy.

Den generelle syntaksen til awk er:

awk 'script' filename

Hvor 'script' er et sett med kommandoer som forstås av awk og kjøres på fil, filnavn.

Det fungerer ved å lese en gitt linje i filen, lage en kopi av linjen og deretter kjøre skriptet på linjen. Dette gjentas på alle linjene i filen.

'script' har formen '/pattern/ action' der pattern er et regulært uttrykk og handlingen > er det awk vil gjøre når den finner det gitte mønsteret i en linje.

Slik bruker du Awk-filtreringsverktøyet i Linux

I de følgende eksemplene skal vi fokusere på metategnene som vi diskuterte ovenfor under funksjonene til awk.

Et enkelt eksempel på bruk av awk:

Eksemplet nedenfor skriver ut alle linjene i filen /etc/hosts siden det ikke er gitt noe mønster.

awk '//{print}'/etc/hosts

Bruk Awk med mønster:

I eksemplet nedenfor har et mønster localhost blitt gitt, så awk vil matche linjen med localhost i /etc/hosts-filen.

awk '/localhost/{print}' /etc/hosts 

Bruk av Awk med (.) jokertegn i et mønster

(.) vil samsvare med strenger som inneholder loc, localhost, localnet i eksemplet nedenfor.

Det vil si * l noen_single_character c *.

awk '/l.c/{print}' /etc/hosts

Bruke Awk med (*)-tegn i et mønster

Den vil matche strenger som inneholder localhost, localnet, lines, capable, som i eksemplet nedenfor:

awk '/l*c/{print}' /etc/localhost

Du vil også innse at (*) prøver å gi deg den lengste matchen den kan oppdage.

La oss se på en kasus som viser dette, ta det regulære uttrykket t*t som betyr matchstrenger som starter med bokstaven t og slutter med t i linjen under:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Du vil få følgende muligheter når du bruker mønsteret /t*t/:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

Og (*) i /t*t/ jokertegn lar awk velge det siste alternativet:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Bruke Awk med sett [ tegn(er) ]

Ta for eksempel settet [al1], her vil awk matche alle strenger som inneholder tegnet a eller l eller 1 på en linje i filen /etc/hosts.

awk '/[al1]/{print}' /etc/hosts

Det neste eksemplet samsvarer med strenger som starter med enten K eller k etterfulgt av T:

awk '/[Kk]T/{print}' /etc/hosts 

Spesifisere tegn i et område

Forstå tegn med awk:

  1. [0-9] betyr et enkelt tall
  2. [a-z] betyr samsvar med en enkelt liten bokstav
  3. [A-Z] betyr samsvar med en enkelt stor bokstav
  4. [a-zA-Z] betyr samsvar med en enkelt bokstav
  5. [a-zA-Z 0-9] betyr samsvar med en enkelt bokstav eller et tall

La oss se på et eksempel nedenfor:

awk '/[0-9]/{print}' /etc/hosts 

Alle linjen fra filen /etc/hosts inneholder minst et enkelt tall [0-9] i eksemplet ovenfor.

Bruk Awk med (^) Meta Character

Den samsvarer med alle linjene som starter med mønsteret gitt som i eksemplet nedenfor:

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Bruk Awk med ($) Meta Character

Den samsvarer med alle linjene som slutter med mønsteret som følger med:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Bruk Awk med (\) Escape Character

Det lar deg ta karakteren som følger den som en bokstavelig, det vil si betrakt den akkurat som den er.

I eksemplet nedenfor skriver den første kommandoen ut alle linjen i filen, den andre kommandoen skriver ikke ut noe fordi jeg vil matche en linje som har $25.00, men ingen escape-tegn brukes.

Den tredje kommandoen er riktig siden et escape-tegn har blitt brukt til å lese $ som det er.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

Sammendrag

Det er ikke alt med kommandolinjefiltreringsverktøyet awk, eksemplene ovenfor er de grunnleggende operasjonene til awk. I de neste delene skal vi gå videre med hvordan du bruker komplekse funksjoner i awk. Takk for at du leste gjennom og for eventuelle tillegg eller forklaringer, legg inn en kommentar i kommentarfeltet.