Cómo usar Awk y expresiones regulares para filtrar texto o cadena 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 determinada de interés. Aquí es donde usar expresiones regulares es útil.

Una expresión regular se puede definir como una cadena que representa varias secuencias de caracteres. Una de las cosas más importantes sobre 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 están hechas de:

  1. Ordinary characters such as space, underscore(_), A-Z, a-z, 0-9.
  2. Meta characters that are expanded to ordinary characters, they include:
    1. (.) it matches any single character except a newline.
    2. (*) it matches zero or more existences of the immediate character preceding it.
    3. [ character(s) ] it matches any one of the characters specified in character(s), one can also use a hyphen (-) to mean a range of characters such as [a-f], [1-5], and so on.
    4. ^ it matches the beginning of a line in a file.
    5. $ matches the end of line in a file.
    6. \ it is an escape character.

    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 sencilla 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 entendidos por awk y se ejecutan en el archivo, nombre de archivo.

    Funciona leyendo una línea dada 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 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 centraremos en los metacaracteres que discutimos anteriormente en 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 dado 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 las cadenas que contienen loc , localhost , localnet en el siguiente ejemplo.

    Es decir, * l some_single_character c * .

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

    Coincidirá con las cadenas que contienen localhost , localnet , líneas , 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 que pueda detectar.

    Veamos un caso que demuestre esto, toma la expresión regular t * t que significa cadenas de caracteres que comienzan con la letra t y termina con t en la siguiente línea:

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

    Obtendrá las siguientes posibilidades cuando use 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
    

    Tome por ejemplo el conjunto [al1] , aquí awk coincidirá con todas las cadenas que contienen 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 seguido de T :

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

    Entender los personajes con awk:

    1. [0-9] means a single number
    2. [a-z] means match a single lower case letter
    3. [A-Z] means match a single upper case letter
    4. [a-zA-Z] means match a single letter
    5. [a-zA-Z 0-9] means match a single letter or number

    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
    

    Le 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 toda la línea en el archivo, el segundo comando no imprime nada porque quiero hacer coincidir una línea que tiene 5.00 , pero no se usa ningún carácter de escape.

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

    # awk '//{print}' deals.txt
    # awk '/$25.00/{print}' deals.txt
    # awk '/\.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 siguientes partes, estaremos avanzando en cómo usar las características complejas de awk. Gracias por leer y por cualquier adición o aclaración, publique un comentario en la sección de comentarios.