Cuando ejecutamos ciertos comandos en Linux para leer o editar texto de una cadena o archivo, a menudo intentamos filtrar la salida a una sección específica de interés. Aquí es donde resulta útil el uso de expresiones regulares.
¿Qué son las Expresiones Regulares?
A regular expression can be defined as strings that represent several sequences of characters. One of the most important things about regular expressions is that they allow you to filter the output of a command or file, edit a section of a text or configuration file, and so on.
Características de las Expresiones Regulares
Las expresiones regulares están compuestas de:
- Caracteres ordinarios tales como espacio, guion bajo (_), A-Z, a-z, 0-9.
- Meta caracteres que se expanden a caracteres ordinarios, incluyen:
(.)
coincide con cualquier carácter único excepto un salto de línea.(*)
coincide con cero o más ocurrencias del carácter inmediatamente anterior a él.[carácter(es)]
coincide con cualquiera de los caracteres especificados en carácter(es), también se puede usar un guion(-)
para indicar un rango de caracteres como[a-f]
,[1-5]
, y así sucesivamente.^
coincide con el comienzo de una línea en un archivo.$
coincide con el final de la línea en un archivo.\
es un carácter de escape.
Para filtrar texto, uno tiene que usar una herramienta de filtrado de texto como awk. Puedes pensar en awk como un lenguaje de programación propio. Pero para el alcance de esta guía sobre el uso de awk, lo cubriremos como una simple herramienta de filtrado de línea de comandos.
La sintaxis general de awk es:
awk 'script' filename
Donde 'script'
es un conjunto de comandos que son comprendidos por awk y se ejecutan en el archivo, nombre_del_archivo.
Funciona leyendo una línea dada en el archivo, haciendo una copia de la línea, y luego ejecutando el script en la línea. Esto se repite en todas las líneas del archivo.
El 'script'
está en forma de '/patrón/ acción'
donde el patrón es una expresión regular y la acción es lo que awk hará cuando encuentre el patrón dado en una línea.
Cómo Usar la Herramienta de Filtrado Awk en Linux
En los siguientes ejemplos, nos enfocaremos en los metacaracteres que discutimos anteriormente bajo las características de awk.
Imprimir Todas las Líneas del Archivo Usando Awk
El ejemplo a continuación imprime todas las líneas en el archivo /etc/hosts ya que no se da ningún patrón.
awk '//{print}'/etc/hosts

Usar Patrones de Awk: Coincidir Líneas con ‘localhost’ en el Archivo
En el siguiente ejemplo, se ha dado el patrón localhost
, por lo que awk coincidirá con la línea que tenga localhost en el archivo /etc/hosts
.
awk '/localhost/{print}' /etc/hosts

Usando Awk con el Comodín (.) en un Patrón
El (.)
coincidirá con cadenas que contengan loc, localhost, localnet en el ejemplo siguiente.
Es decir * l un_carácter_único c *.
awk '/l.c/{print}' /etc/hosts

Usando Awk con el Carácter (*) en un Patrón
Coincidirá con cadenas que contengan localhost, localnet, líneas, capaces, como en el ejemplo siguiente:
awk '/l*c/{print}' /etc/localhost

También notarás que (*)
intenta obtener la coincidencia más larga posible que pueda detectar.
Veamos un caso que lo demuestra, toma la expresión regular t*t
que significa coincidir con cadenas que empiecen con la letra t
y terminen con t
en la línea siguiente:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
Obtendrás las siguientes posibilidades cuando uses el patrón /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
Y (*)
en el carácter comodín /t*t/
permite a awk elegir la última opción:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
Usando Awk con conjunto [carácter(es)]
Toma por ejemplo el conjunto [al1]
, aquí awk coincidirá con todas las cadenas que contengan el carácter a
o l
o 1
en una línea en el archivo /etc/hosts.
awk '/[al1]/{print}' /etc/hosts

El siguiente ejemplo coincide con cadenas que empiezan con K
o k
seguido de T
:
# awk '/[Kk]T/{print}' /etc/hosts

Especificar caracteres en un rango
Entender caracteres con awk:
[0-9]
significa un solo número[a-z]
significa coincidir con una sola letra minúscula[A-Z]
significa coincidir con una sola letra mayúscula[a-zA-Z]
significa coincidir con una sola letra[a-zA-Z 0-9]
significa coincidir con una sola letra o número
Vamos a ver un ejemplo a continuación:
awk '/[0-9]/{print}' /etc/hosts

Todas las líneas del archivo /etc/hosts contienen al menos un solo número [0-9]
en el ejemplo anterior.
Usar Awk con el Carácter Meta (^)
Coincide con todas las líneas que comienzan con el patrón proporcionado como en el ejemplo siguiente:
# awk '/^fe/{print}' /etc/hosts # awk '/^ff/{print}' /etc/hosts

Usar Awk con el Carácter Meta ($)
Coindicde con todas las líneas que terminan con el patrón proporcionado:
awk '/ab$/{print}' /etc/hosts awk '/ost$/{print}' /etc/hosts awk '/rs$/{print}' /etc/hosts

Usar Awk con el Carácter de Escape (\)
Te permite tomar el carácter siguiente como un literal, es decir, considerarlo tal como es.
En el ejemplo siguiente, el primer comando imprime todas las líneas en el archivo, y el segundo comando no imprime nada porque quiero coincidir con una línea que tenga $25.00, pero no se usa un carácter de escape.
El tercer comando es correcto ya que se ha usado un carácter de escape para leer $ tal como es.
awk '//{print}' deals.txt awk '/$25.00/{print}' deals.txt awk '/\$25.00/{print}' deals.txt

Resumen
Eso no es todo con la herramienta de filtrado de línea de comando awk, los ejemplos anteriores son las operaciones básicas de awk. En las próximas partes, avanzaremos en cómo usar características complejas de awk.
Gracias por leer y por cualquier adición o aclaración, por favor, publica un comentario en la sección de comentarios.
Source:
https://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/