Com utilitzar expressions Awk i regulars per filtrar text o cadena als fitxers


Quan executem determinades ordres a Unix/Linux per llegir o editar text d'una cadena o fitxer, la majoria de vegades intentem filtrar la sortida a una secció d'interès determinada. Aquí és on l'ús d'expressions regulars és útil.

Una expressió regular es pot definir com una cadena que representen diverses seqüències de caràcters. Una de les coses més importants de les expressions regulars és que us permeten filtrar la sortida d'una ordre o fitxer, editar una secció d'un fitxer de text o de configuració, etc.

Les expressions regulars estan fetes de:

  1. Caràcters habituals com ara espai, guió baix (_), A-Z, a-z, 0-9.
  2. Meta caràcters que s'amplien a caràcters normals, inclouen:
    1. (.) coincideix amb qualsevol caràcter, excepte una nova línia.
    2. (*) coincideix amb zero o més existències del caràcter immediat que el precedeix.
    3. [ caràcter(s) ] coincideix amb qualsevol dels caràcters especificats als caràcters, també es pot utilitzar un guionet (-) per significar un interval de caràcters com ara [a-f], [1-5], etc.
    4. ^ coincideix amb el començament d'una línia d'un fitxer.
    5. $ coincideix amb el final de línia d'un fitxer.
    6. \ és un caràcter d'escapada.

    Per filtrar text, cal utilitzar una eina de filtratge de text com ara awk. Podeu pensar en awk com un llenguatge de programació propi. Però per a l'abast d'aquesta guia per utilitzar awk, el tractarem com una senzilla eina de filtratge de línia d'ordres.

    La sintaxi general de awk és:

    # awk 'script' filename
    

    On script és un conjunt d'ordres que s'entenen per awk i que s'executen al fitxer, nom de fitxer.

    Funciona llegint una línia determinada al fitxer, fa una còpia de la línia i després executa l'script a la línia. Això es repeteix a totes les línies del fitxer.

    El script té la forma /pattern/ action on el patró és una expressió regular i l'acció és el que farà l'awk quan trobi el patró donat en una línia.

    Com utilitzar l'eina de filtratge Awk a Linux

    En els exemples següents, ens centrarem en els meta caràcters que hem comentat anteriorment sota les característiques d'awk.

    L'exemple següent imprimeix totes les línies del fitxer /etc/hosts ja que no es dóna cap patró.

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

    A l'exemple següent, s'ha donat un patró localhost, de manera que awk coincidirà amb la línia que tingui localhost al fitxer /etc/hosts.

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

    El (.) coincidirà amb les cadenes que continguin loc, localhost, localnet a l'exemple següent.

    És a dir * l algun_caràcter_únic c *.

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

    Coincidirà amb les cadenes que continguin localhost, localnet, lines, capable, com a l'exemple següent:

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

    També us adonareu que (*) intenta aconseguir-vos la coincidència més llarga possible que pugui detectar.

    Vegem un cas que ho demostra, prenem l'expressió regular t*t que significa que coincideixen cadenes que comencen amb la lletra t i acaben amb t a la línia següent:

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

    Tindreu les possibilitats següents quan utilitzeu el patró /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
    

    I (*) al caràcter comodí /t*t/ permet a awk triar l'última opció:

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

    Prengui per exemple el conjunt [al1], aquí awk coincidirà amb totes les cadenes que continguin el caràcter a o l o 1 en una línia al fitxer /etc/hosts.

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

    L'exemple següent coincideix amb cadenes que comencen per K o k seguides de T:

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

    Entendre els personatges amb awk:

    1. [0-9] significa un sol número
    2. [a-z] significa que coincideix amb una única lletra minúscula
    3. [A-Z] significa que coincideix amb una única lletra majúscula
    4. [a-zA-Z] significa que coincideix amb una sola lletra
    5. [a-zA-Z 0-9] significa que coincideix amb una sola lletra o número

    Vegem un exemple a continuació:

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

    Tota la línia del fitxer /etc/hosts conté almenys un sol número [0-9] a l'exemple anterior.

    Coincideix amb totes les línies que comencen amb el patró proporcionat com a l'exemple següent:

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

    Coincideix amb totes les línies que acaben amb el patró proporcionat:

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

    Permet prendre el personatge que el segueix com un literal, és a dir, considerar-lo tal com és.

    A l'exemple següent, la primera ordre imprimeix tota la línia del fitxer, la segona ordre no imprimeix res perquè vull fer coincidir una línia que tingui 25,00 $, però no s'utilitza cap caràcter d'escapada.

    La tercera ordre és correcta ja que s'ha utilitzat un caràcter d'escapada per llegir $tal com és.

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

    Resum

    Això no és tot amb l'eina de filtratge de línia d'ordres awk, els exemples anteriors són les operacions bàsiques d'awk. En les properes parts avançarem en com utilitzar les funcions complexes d'awk. Gràcies per llegir-ho i per qualsevol addició o aclariment, publiqueu un comentari a la secció de comentaris.