Búsqueda de sitios web

Cómo utilizar expresiones regulares y Awk para filtrar texto o cadenas en archivos


Cuando ejecutamos ciertos comandos en Unix/Linux para leer o editar texto de una cadena o archivo, la mayoría de las veces intentamos filtrar la salida a una sección de interés determinada. Aquí es donde resulta útil el uso de expresiones regulares.

Lea también: 10 operadores de encadenamiento de Linux útiles con ejemplos prácticos

¿Qué son las expresiones regulares?

Una expresión regular se puede definir como una cadena que representa varias secuencias de caracteres. Una de las cosas más importantes de las expresiones regulares es que le permiten filtrar la salida de un comando o archivo, editar una sección de un texto o archivo de configuración, etc.

Características de la expresión regular

Las expresiones regulares están formadas por:

  1. Caracteres normales como espacio, guión bajo (_), A-Z, a-z, 0-9.
  2. Metacaracteres que se expanden a caracteres comunes, incluyen:

    1. (.) coincide con cualquier carácter excepto una nueva línea.
    2. (*) coincide con cero o más existencias del carácter inmediato que lo precede.
    3. [ carácter(es) ] coincide con cualquiera de los caracteres especificados en carácter(es), también se puede usar un guión (-) para indicar un rango de caracteres como como [a-f], [1-5], etc.
    4. ^ coincide con el comienzo de una línea en un archivo.
    5. $ coincide con el final de la línea de un archivo.
    6. \ es un carácter de escape.

Para filtrar texto, es necesario utilizar 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 awk entiende y se ejecutan en el archivo, nombre de archivo.

Funciona leyendo una línea determinada en el archivo, hace una copia de la línea y luego ejecuta el script en la línea. Esto se repite en todas las líneas del archivo.

El 'script' tiene el formato '/pattern/ action' donde pattern es una expresión regular y la acción es lo que hará awk cuando encuentre el patrón dado en una línea.

Cómo utilizar la herramienta de filtrado Awk en Linux

En los siguientes ejemplos, nos centraremos en los metacaracteres que analizamos anteriormente en las características de awk.

Un ejemplo sencillo del uso de awk:

El siguiente ejemplo imprime todas las líneas del archivo /etc/hosts ya que no se proporciona ningún patrón.

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

Utilice Awk con patrón:

En el siguiente ejemplo, se ha proporcionado un patrón localhost, por lo que awk coincidirá con la línea que tiene localhost en el archivo /etc/hosts.

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

Usando Awk con comodín (.) en un patrón

El (.) coincidirá con cadenas que contengan loc, localhost, localnet en el siguiente ejemplo.

Es decir *l some_single_character c*.

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

Usando Awk con carácter (*) en un patrón

Coincidirá con cadenas que contengan localhost, localnet, lines, capable, como en el siguiente ejemplo:

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

También te darás cuenta de que (*) intenta conseguirte la coincidencia más larga posible que pueda detectar.

Veamos un caso que demuestra esto, tomemos la expresión regular t*t que significa hacer coincidir cadenas que comienzan con la letra t y terminan con t en la línea siguiente:

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

Obtendrá las siguientes posibilidades cuando utilice 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 set [caracteres]

Tomemos, 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 del archivo /etc/hosts.

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

El siguiente ejemplo coincide con cadenas que comienzan con K o k seguido de T:

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

Especificación de caracteres en un rango

Entender personajes con awk:

  1. [0-9] significa un solo número
  2. [a-z] significa coincidir con una sola letra minúscula
  3. [A-Z] significa coincidir con una sola letra mayúscula
  4. [a-zA-Z] significa coincidir con una sola letra
  5. [a-zA-Z 0-9] significa coincidir con una sola letra o número

Veamos un ejemplo a continuación:

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

Todas las líneas del archivo /etc/hosts contienen al menos un único número [0-9] en el ejemplo anterior.

Utilice Awk con metacarácter (^)

Coincide con todas las líneas que comienzan con el patrón proporcionado como en el siguiente ejemplo:

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

Utilice Awk con el metacarácter ($)

Coincide 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

Utilice Awk con carácter de escape (\)

Te permite tomar el carácter que le sigue como literal, es decir, considerarlo tal como es.

En el siguiente ejemplo, el primer comando imprime todas las líneas del archivo, el segundo comando no imprime nada porque quiero hacer coincidir una línea que tiene $25.00, pero no se utiliza ningún carácter de escape.

El tercer comando es correcto ya que se ha utilizado un carácter de escape para leer $ tal como está.

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 comandos awk, los ejemplos anteriores muestran las operaciones básicas de awk. En las próximas partes avanzaremos sobre cómo utilizar funciones complejas de awk. Gracias por leer y por cualquier adición o aclaración, publique un comentario en la sección de comentarios.