Kā lietot Awk un regulāras izteiksmes, lai filtrētu tekstu vai virknes failos


Palaižot noteiktas komandas Unix/Linux, lai lasītu vai rediģētu tekstu no virknes vai faila, mēs visbiežāk mēģinām filtrēt izvadi noteiktā interesējošajā sadaļā. Šeit noder regulāru izteicienu lietošana.

Regulāru izteiksmi var definēt kā virknes, kas attēlo vairākas rakstzīmju secības. Viena no vissvarīgākajām parasto izteicienu lietām ir tā, ka tās ļauj filtrēt komandas vai faila izvadi, rediģēt teksta vai konfigurācijas faila sadaļu un tā tālāk.

Regulāras izteiksmes veido:

  1. Parastas rakstzīmes, piemēram, atstarpe, pasvītrojums (_), A-Z, a-z, 0–9.
  2. Meta rakstzīmes, kas paplašinātas līdz parastajām rakstzīmēm, un tās ietver:
    1. (.) tas atbilst jebkurai atsevišķai rakstzīmei, izņemot jaunu līniju.
    2. (*) tas atbilst nullei vai vairākām tiešajām rakstzīmēm, kas atrodas pirms tā.
    3. [character (s)] tas atbilst jebkurai no rakstzīmēs norādītajām rakstzīmēm, var izmantot arī defisi (-) , lai apzīmētu diapazonu rakstzīmes, piemēram, [af] , [1-5] un tā tālāk.
    4. ^ tas atbilst faila rindas sākumam.
    5. $ sakrīt ar faila rindas beigām.
    6. \ tas ir bēgšanas raksturs.

    Lai filtrētu tekstu, ir jāizmanto teksta filtrēšanas rīks, piemēram, awk. Jūs varat iedomāties awk kā savu programmēšanas valodu. Bet šīs rokasgrāmatas darbības jomai, lai izmantotu awk, mēs to aplūkosim kā vienkāršu komandrindas filtrēšanas rīku.

    Vispārīgā awk sintakse ir šāda:

    # awk 'script' filename
    

    Kur skripts ir komandu kopa, kuras saprot awk un kuras izpilda failā, faila nosaukums.

    Tas darbojas, nolasot failā norādīto rindu, izveido līnijas kopiju un pēc tam izpilda skriptu uz līnijas. Tas tiek atkārtots visās faila rindās.

    skripts ir formā /pattern/action , kur modelis ir regulāra izteiksme, un darbība ir tā, ko awk darīs, atrodot doto modeli līnijā.

    Kā Linux operētājsistēmā izmantot Awk filtrēšanas rīku

    Turpmākajos piemēros mēs pievērsīsimies meta rakstzīmēm, kuras mēs iepriekš apspriedām zem awk iezīmēm.

    Zemāk esošajā piemērā tiek izdrukātas visas faila/etc/hosts rindas, jo nav norādīts neviens modelis.

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

    Šajā piemērā ir dots šablons localhost , tāpēc awk atbilst līnijai, kurā localhost atrodas failā /etc/hosts .

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

    (.) zemāk esošajā piemērā sakritīs ar virknēm, kas satur loc, localhost, localnet.

    Tas nozīmē, ka * l daži_viena_zīme c *.

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

    Tas sakritīs ar virknēm, kas satur localhost, localnet, līnijas, kas spējīgas, kā parādīts zemāk esošajā piemērā:

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

    Jūs arī sapratīsit, ka (*) mēģina iegūt pēc iespējas garāku atbilstību, kādu tā var atklāt.

    Apskatīsim gadījumu, kas to pierāda, paņemiet regulāro izteiksmi t * t , kas nozīmē atbilstības virknes, kas sākas ar burtu t un beidzas ar t zemāk esošajā rindā:

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

    Izmantojot modeli /t * t/, jūs iegūsiet šādas iespējas:

    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
    

    Un aizstājējzīmes rakstā (*) /t * t/ aizstājējzīmē ļauj awk izvēlēties pēdējo opciju:

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

    Piemēram, ņemiet kopu [al1] , šeit awk sakritīs ar visām virknēm, kas satur rakstzīmi a vai l vai 1 rindā failā/etc/hosts.

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

    Nākamais piemērs sakrīt ar virknēm, kas sākas ar K vai k , kam seko T :

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

    Izprotiet rakstzīmes ar awk:

    1. [0-9] ir viens skaitlis
    2. [a-z] nozīmē sakrist ar vienu mazo burtu
    3. [A-Z] nozīmē sakrist ar vienu lielo burtu
    4. [a-zA-Z] nozīmē atbilst vienam burtam
    5. [a-zA-Z 0-9] nozīmē sakrist ar vienu burtu vai ciparu

    Apskatīsim zemāk redzamo piemēru:

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

    Visā faila/etc/hosts rindiņā iepriekš minētajā piemērā ir vismaz viens skaitlis [0-9] .

    Tas sakrīt ar visām līnijām, kas sākas ar modeli, kā norādīts zemāk esošajā piemērā:

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

    Tas atbilst visām līnijām, kas beidzas ar norādīto modeli:

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

    Tas ļauj jums uztvert sekojošo varoni kā burtisku, proti, uzskatīt to gluži tādu, kāds tas ir.

    Tālāk sniegtajā piemērā pirmā komanda izdrukā visu faila rindu, otrā komanda neko neizdrukā, jo es vēlos saskaņot līniju, kurai ir 25,00 ASV dolāri, bet netiek izmantots izbēgšanas raksturs.

    Trešā komanda ir pareiza, jo evakuācijas raksturs ir izmantots, lai nolasītu $, kā tas ir.

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

    Kopsavilkums

    Tas vēl nav viss ar awk komandrindas filtrēšanas rīku, piemēri, kas minēti awk pamatdarbībās. Nākamajās daļās mēs virzīsimies uz priekšu par to, kā izmantot sarežģītās awk funkcijas. Paldies, ka izlasījāt un par visiem papildinājumiem vai precizējumiem, ievietojiet komentāru komentāru sadaļā.