Blog

Lunes, 11 Enero 2021 15:04

Ejemplos de uso de awk o gawk

awk o la versión GNU gawk es más que un simple comando de procesamiento de patrones, es todo un lenguaje de análisis semántico. Su dominio es como aprender todo un lenguaje de programación, pero en esta ocasión veremos unos ejemplos de su potencia en unos casos sencillos de análisis de patrones de cadenas.

Ejemplo 1: Una lista personalizada de usuarios para HTML

Una línea típica de /etc/passwd es como la siguiente:

luis:x:504:504:Luis Hernandez:/home/luis:/bin/bash

Bien, supongamos que deseamos un listado de todos los usuarios normales (personas) del sistema, pero solo necesitamos su nombre de usuario, su nombre o real y su shell por defecto, es decir, si vemos la línea anterior, la separación entre campos es ":" asi que para nuestro reporte queremos el campo 1,5 y 7. Pero además, este reporte será parte de una tabla HTML, asi que sería bueno si puderian incluirse de una vez las etquietas "<tr> y "<td> necesarias de una vez. Es decir, el resultado deseado es el siguiente:

<tr><td>luis<td><td>Luis Hernandez</td><td>/bin/bash</td></tr>

El primer paso es determinar los usuarios normales del sistema, podríamos usar un grep "home" /etc/passw | gawk ..., pero podría haber usuarios que tengan su HOME en otra ubicación, además se trata de usar solo awk, asi que lo primero que entenderemos es que los campos obtenidos del resultado de un comando awk, se numeran por $1, $2, etc. y el delimitador de campos se indica mediante la variable "FS".

#> gawk '{print $3}' FS=":" /etc/passwd

0

1

2

...

81

86

500

501

502

503

504

Aunque no muy útil todavía, podemos ver como seleccionamos el caracter separador FS=":", que viene de 'Field Separator', y tenemos indicada una acción '{print $3}', que significa imprime el campo 3. Aunque realmente no lo queremos imprimir, lo queremos evaluar, y si deseamos imprimir el $1, $5 y $7 que se mencionarion previamente, asi que agregamos una expresión de evaluación antes de la acción:

 

#> awk '$3 >= 500 {print $1 $5 $7 }' FS=":" /etc/passwd

sergonSergio Gonzalez/bin/bash

valeriaValeria Perez/bin/bash

fernandaFernanda Lozano/bin/sh

alejandraAlejandra Lopez/bin/nologin

luisLuis Hernandez/bin/bash

Mucho mejor, agregamos '$3 >= 500' previo a la acción (que es imprimir lo que deseamos), ya que como se sabe en la mayoría de distros modernas, los usuarios normales del sistema se numeran del 500 en adelante (más sobre administración de usuarios). Nótese que los campos en el resultado salen pegados, es necesario agregar entre comillas " ", ya sea un espacio o lo que se desee, en este caso etiquetas de tablas de HTML y además ordenaremos "sort" los registros obtenidos:

 

#> awk  '$3 >= 500 {print "<tr><td>"$1"</td><td>"$5"</td><td>"$7"</td></tr>" | "sort" }' FS=":" /etc/passwd

<tr><td>alejandra</td><td>Alejandra Lopez</td><td>/bin/nologin</td></tr>

<tr><td>fernanda</td><td>Fernanda Lozano</td><td>/bin/sh</td></tr>

<tr><td>luis</td><td>Luis Hernandez</td><td>/bin/bash</td></tr>

<tr><td>sergon</td><td>Sergio Gonzalez</td><td>/bin/bash</td></tr>

<tr><td>valeria</td><td>Valeria Perez</td><td>/bin/bash</td></tr>

Sobre CNERIS

CNERIS es una empresa constituida por jóvenes emprendedores procedentes de diferentes sectores del mundo de la información. Nuestro equipo está compuesto por programadores, administradores de sistemas, administradores de base de datos, diseñadores gráficos, maquetadores,