Cómo usar Awk y expresiones regulares 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 tratamos de filtrar la salida a una determinada sección de interés. Aquí es donde el uso de expresiones regulares resulta útil.

Una expresión regular se puede definir como cadenas que representan 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.

Las expresiones regulares se componen de:

  1. Caracteres ordinarios como espacio, guión bajo (_), A-Z, a-z, 0-9.
  2. Metacaracteres que se expanden a caracteres normales, que incluyen:
    1. (.) coincide con cualquier carácter, excepto con una nueva línea.
    2. (*) coincide con cero o más existencias del carácter inmediato que lo precede.
    3. [carácter (s)] coincide con cualquiera de los caracteres especificados en carácter (s), también se puede usar un guión (-) para significar un rango de caracteres como [af] , [1-5] , etc.
    4. ^ coincide con el comienzo de una línea en un archivo.
    5. $ coincide con el final de la línea en un archivo.
    6. \ es un carácter de escape.

    Para filtrar texto, uno tiene que usar una herramienta de filtrado de texto como awk. Puede 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 patrón 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 discutimos anteriormente bajo las características de awk.

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

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

    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 
    

    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
    

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

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

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

    Veamos un caso que demuestre esto, tome la expresión regular t * t que significa coincidir cadenas que comienzan con la letra t y terminan con t en la línea de abajo:

    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 el carácter comodín (*) en /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
    

    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 en el archivo/etc/hosts.

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

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

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

    Comprender los personajes con awk:

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

    Veamos un ejemplo a continuación:

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

    Toda la línea del archivo/etc/hosts contiene al menos un solo número [0-9] en el ejemplo anterior.

    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
    

    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
    

    Te permite tomar el carácter que lo sigue como un 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 usa ningún carácter de escape.

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

    # 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 de awk, los ejemplos anteriores son 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.