Wéi benotzt Awk a regelméisseg Ausdréck fir Text oder String a Dateien ze filteren


Wa mir verschidde Kommandoen an Unix/Linux lafen fir Text aus enger String oder Datei ze liesen oder z'änneren, probéieren mir meeschtens d'Output op eng bestëmmten Sektioun vun Interesse ze filteren. Dëst ass wou d'Benotzung vun reguläre Ausdréck praktesch ass.

E reegelméissegen Ausdrock kann als Strings definéiert ginn, déi verschidde Sequenz vun Zeechen duerstellen. Ee vun de wichtegsten Saachen iwwer regulär Ausdréck ass datt se Iech erlaben d'Output vun engem Kommando oder Datei ze filteren, e Sektioun vun engem Text oder Konfiguratiounsdatei z'änneren an sou weider.

Regelméisseg Ausdréck ginn aus:

  1. Allgemeng Zeechen wéi Raum, Ënnersträich(_), A-Z, a-z, 0-9.
  2. Meta Charaktere déi op normal Charaktere erweidert ginn, si enthalen:
    1. (.) et entsprécht all eenzel Zeechen ausser enger Neilinn.
    2. (*) et entsprécht null oder méi Existenz vum direkten Zeechen virdru.
    3. [ Zeeche(n) ] et entsprécht engem vun den Zeechen, déi an de Charakter(en) spezifizéiert sinn, et kann een och en Bindestrecken benotzen (-) fir e Beräich ze bedeiten vu Charaktere wéi [a-f], [1-5], a sou weider.
    4. ^ et entsprécht den Ufank vun enger Zeil an engem Fichier.
    5. $ entsprécht dem Enn vun der Zeil an engem Fichier.
    6. \ et ass en Escape Charakter.

    Fir Text ze filteren, muss een en Textfiltertool wéi awk benotzen. Dir kënnt un awk als eegene Programméierungssprooch denken. Awer fir den Ëmfang vun dësem Guide fir awk ze benotzen, wäerte mir et als einfach Kommandozeilfiltertool ofdecken.

    Déi allgemeng Syntax vun awk ass:

    # awk 'script' filename
    

    Wou Skript eng Rei vu Kommandoen ass, déi duerch awk versteet ginn an op Datei, Dateinumm ausgefouert ginn.

    Et funktionnéiert andeems Dir eng gegebene Linn an der Datei liest, eng Kopie vun der Linn mécht an dann de Skript op der Linn ausféiert. Dëst gëtt op all Linnen an der Datei widderholl.

    De Skript ass an der Form /pattern/ action wou Muster e reegelméissegen Ausdrock ass an d'Aktioun ass wat awk wäert maachen wann et dat gegebene Muster an enger Zeil fënnt.

    Wéi benotzen ech Awk Filtering Tool a Linux

    An de folgende Beispiller wäerte mir op d'Meta Charaktere konzentréieren, déi mir hei uewen ënner de Features vun awk diskutéiert hunn.

    D'Beispill hei drënner dréckt all d'Zeilen an der Datei /etc/hosts aus well kee Muster gëtt.

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

    Ech d'Beispill hei ënnendrënner, e Muster localhost gouf uginn, sou datt awk d'Linn mat localhost an der /etc/hosts Datei passt.

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

    De (.) passt op Strings mat loc, localhost, localnet am Beispill hei ënnen.

    Dat ass ze soen * l puer_single_character c *.

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

    Et passt Strings mat localhost, localnet, Linnen, kapabel, wéi am Beispill hei drënner:

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

    Dir wäert mierken och dass (*) probéiert e kritt Dir de längsten Match méiglech et entdecken kann.

    Loosst eis e Fall kucken deen dat weist, huelt de regulären Ausdrock t*t dat heescht Match Saiten déi mam Buschtaf t ufänken a mat t ophalen an der Linn hei drënner:

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

    Dir kritt déi folgend Méiglechkeeten wann Dir de Muster /t*t/ benotzt:

    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
    

    An (*) am /t*t/ Wildcard Charakter erlaabt awk déi lescht Optioun ze wielen:

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

    Huelt zum Beispill de Set [al1], hei passt awk all Strings mat Zeeche a oder l oder 1 mat. an enger Zeil an der Datei /etc/hosts.

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

    Dat nächst Beispill entsprécht Strings mat entweder K oder k gefollegt vun T:

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

    Charaktere mat awk verstoen:

    1. [0-9] heescht eng eenzeg Zuel
    2. [a-z] heescht mat engem klenge Buschtaf passen
    3. [A-Z] heescht mat engem eenzege grousse Buschtaf passen
    4. [a-zA-Z] heescht mat engem eenzege Buschtaf passen
    5. [a-zA-Z 0-9] heescht mat engem eenzege Buschtaf oder Zuel passen

    Loosst eis e Beispill hei ënnen kucken:

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

    All d'Linn aus der Datei /etc/hosts enthält op d'mannst eng eenzeg Zuel [0-9] am uewe genannte Beispill.

    Et entsprécht all d'Zeilen, déi mam Muster starten wéi am Beispill hei ënnen:

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

    Et entsprécht all d'Zeilen déi mam Muster ophalen:

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

    Et erlaabt Iech de Charakter no him als wuertwiertlech ze huelen, dat heescht et betruecht wéi et ass.

    Am Beispill hei drënner dréckt den éischte Kommando all Linn an der Datei aus, den zweeten Kommando dréckt näischt aus well ech wëll eng Linn passen déi $25,00 huet, awer kee Flucht Charakter gëtt benotzt.

    Den drëtte Kommando ass richteg well e Flucht Charakter benotzt gouf fir $ze liesen wéi et ass.

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

    Resumé

    Dat ass net alles mam awk Kommandozeil Filtertool, d'Beispiller uewendriwwer an d'Basis Operatioune vun awk. An den nächsten Deeler wäerte mir virugoen wéi Dir komplex Features vun awk benotzt. Merci fir d'Liesen duerch a fir all Ergänzunge oder Erklärungen, post e Kommentar an der Kommentarsektioun.