Sådan bruges Awk og regulære udtryk til at filtrere tekst eller streng i filer


Når vi kører bestemte kommandoer i Unix/Linux for at læse eller redigere tekst fra en streng eller fil, prøver vi oftest at filtrere output til et givet afsnit af interesse. Det er her brug af regulære udtryk er nyttigt.

Et regulært udtryk kan defineres som en streng, der repræsenterer flere sekvenser af tegn. En af de vigtigste ting ved regulære udtryk er, at de giver dig mulighed for at filtrere output fra en kommando eller fil, redigere et afsnit af en tekst- eller konfigurationsfil og så videre.

Regelmæssige udtryk er lavet af:

  1. Almindelige tegn som mellemrum, understregning (_), A-Z, a-z, 0-9.
  2. Metategn, der udvides til almindelige tegn, de inkluderer:
    1. (.) den matcher ethvert enkelt tegn undtagen en ny linje.
    2. (*) den matcher nul eller flere eksistenser af den umiddelbare karakter, der går forud for den.
    3. [character (s)] det matcher et hvilket som helst af de tegn, der er specificeret i character (s), man kan også bruge en bindestreg (-) til at betyde et interval af tegn som [af] , [1-5] osv.
    4. ^ det matcher begyndelsen på en linje i en fil.
    5. $ matcher slutningen af linjen i en fil.
    6. \ det er et escape-tegn.

    For at filtrere tekst skal man bruge et tekstfiltreringsværktøj som f.eks. Awk. Du kan tænke på awk som et eget programmeringssprog. Men for rækkevidden af denne vejledning til brug af awk, skal vi dække det som et simpelt kommandolinjefiltreringsværktøj.

    Den generelle syntaks for awk er:

    # awk 'script' filename
    

    Hvor script er et sæt kommandoer, der forstås af awk og udføres på fil, filnavn.

    Det fungerer ved at læse en given linje i filen, laver en kopi af linjen og derefter udføre scriptet på linjen. Dette gentages på alle linjer i filen.

    scriptet er i formen /mønster/handling hvor mønster er et regulært udtryk, og handlingen er hvad awk vil gøre, når det finder det givne mønster i en linje.

    Sådan bruges Awk Filtreringsværktøj i Linux

    I de følgende eksempler skal vi fokusere på de metategn, som vi diskuterede ovenfor under funktionerne i awk.

    Eksemplet nedenfor udskriver alle linjerne i filen/etc/hosts, da der ikke er noget mønster.

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

    I eksemplet nedenfor er der givet et mønster localhost , så awk vil matche linje med localhost i filen /etc/hosts .

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

    (.) matcher strenge, der indeholder loc, localhost, localnet i eksemplet nedenfor.

    Det vil sige * l nogle_single_karakter c *.

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

    Det matcher strenge, der indeholder localhost, localnet, linjer, der er i stand, som i eksemplet nedenfor:

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

    Du vil også indse, at (*) forsøger at give dig den længst mulige match, den kan registrere.

    Lad os se på en sag, der demonstrerer dette, tag det regulære udtryk t * t hvilket betyder matchstrenge, der starter med bogstavet t og slutter med t i linjen nedenfor:

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

    Du får følgende muligheder, når du bruger 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/ wild card-karakter tillader awk at vælge den sidste mulighed:

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

    Tag for eksempel sættet [al1] , her vil awk matche alle strenge, der indeholder tegn a eller l eller 1 i en linje i filen/etc/hosts.

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

    Det næste eksempel matcher strenge, der starter med enten K eller k efterfulgt af T :

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

    Forstå tegn med awk:

    1. [0-9] betyder et enkelt nummer
    2. [a-z] betyder matche et enkelt lille bogstav
    3. [A-Z] betyder matche et enkelt stort bogstav
    4. [a-zA-Z] betyder matche et enkelt bogstav
    5. [a-zA-Z 0-9] betyder matche et enkelt bogstav eller tal

    Lad os se på et eksempel nedenfor:

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

    Alle linjer fra filen/etc/hosts indeholder mindst et enkelt nummer [0-9] i ovenstående eksempel.

    Det matcher alle de linjer, der starter med det mønster, der er angivet som i eksemplet nedenfor:

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

    Det matcher alle de linjer, der slutter med det angivne mønster:

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

    Det giver dig mulighed for at tage karakteren, der følger den, som en bogstavelig, det vil sige overveje det ligesom det er.

    I eksemplet nedenfor udskriver den første kommando hele linjen i filen, den anden kommando udskriver intet, fordi jeg vil matche en linje, der har $ 25,00, men der bruges ingen escape-tegn.

    Den tredje kommando er korrekt, da et escape-tegn er blevet brugt til at læse $, som det er.

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

    Resumé

    Det er ikke alt sammen med awk-kommandolinjefiltreringsværktøjet, eksemplerne ovenfor er de grundlæggende operationer for awk. I de næste dele skal vi gå videre med, hvordan man bruger komplekse funktioner i awk. Tak for at have læst igennem og for eventuelle tilføjelser eller præciseringer, skriv en kommentar i kommentarfeltet.