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:
- Caràcters habituals com ara espai, guió baix (_), A-Z, a-z, 0-9.
- Meta caràcters que s'amplien a caràcters normals, inclouen:
(.)
coincideix amb qualsevol caràcter, excepte una nova línia.(*)
coincideix amb zero o més existències del caràcter immediat que el precedeix.[ 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.^
coincideix amb el començament d'una línia d'un fitxer.$
coincideix amb el final de línia d'un fitxer.\
é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 lletrat
i acaben ambt
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àctera
ol
o1
en una línia al fitxer /etc/hosts.# awk '/[al1]/{print}' /etc/hosts
L'exemple següent coincideix amb cadenes que comencen per
K
ok
seguides deT
:# awk '/[Kk]T/{print}' /etc/hosts
Entendre els personatges amb awk:
[0-9]
significa un sol número[a-z]
significa que coincideix amb una única lletra minúscula[A-Z]
significa que coincideix amb una única lletra majúscula[a-zA-Z]
significa que coincideix amb una sola lletra[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.