Sondeo

Escritorios alternativos Linux

¿Cuál prefieres?

  •  Xfce
  •  LXDE
  •  Razor-qt
  •  Enlightenment 0.17

Resultados
Other polls | 1,919 voters | 2 comentarios
· Próximas fechas Curso Global de Servidores con CentOS 6.
· Taller de programación de Python.
· Curso de programación de PHP.
· Prueba ALDOS 1.4.5. Nuestro sistema operativo para escritorio.

Introducción a AWK

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2012 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos. Esta licencia deberá aparecer como primer texto del documento distribuido

Introducción.

Acerca de AWK.

AWK, cuyo nombre deriva de la primera letra de los apellidos de sus autores Alfred Aho, Peter Weinberger y Brian Kernighan, es un lenguaje de programación que fue diseñado con el objetivo de procesar datos basados sobre texto y una de las primeras herramientas en aparecer en Unix. Utiliza listas en un índice ordenado por cadenas clave (listas asociativas) y expresiones regulares. Es un lenguaje ampliamente utilizado para la programación de guiones ejecutables pues añade funcionalidad a las tuberías en los sistemas operativos tipo POSIX. Está incluido en las instalaciones básicas de prácticamente todas las distribuciones de GNU/Linux.

Estructura de los programas escritos en AWK.

El mandato awk utiliza un archivo o emisión de ordenes y un archivo o emisión de entrada. El primero indica como procesar al segundo. El archivo de entrada es por lo general texto con algún formato que puede ser un archivo o bien la salida de otro mandato.

La sintaxis general utilizada para el mandato awk utiliza el siguiente patrón:

awk 'expresión-regular { orden }'

Cuando se utiliza el mandato awk, éste examina el archivo de entrada y ejecuta la orden cuando encuentra la expresión regular especificada.

El siguiente modelo ejecutaría la orden al inicio del programa y antes de que sean procesados los datos del archivo de entrada:

awk 'BEGIN { orden }'

El siguiente modelo ejecutaría la orden al final del programa y después de que sean procesados los datos del archivo de entrada:

awk 'END { orden }'

El siguiente modelo ejecutaría la orden por cada una de las líneas del archivo de entrada:

awk '{ orden }'

Procedimientos.

A continuación se mostrarán ejemplos del uso de AWK.

El siguiente mandato específica que al inicio se imprima en la salida la frase "Hola mundo" y terminar el procesamiento.

awk 'BEGIN { print "Hola mundo"; exit }'

Lo anterior deberá devolver una salida como la siguiente:

Hola mundo

Si se genera el archivo prueba.txt del siguiente modo:

echo -e "Columna1\tColumna2\tColumna3\tColumna4\n" > ejemplo.txt

Y se visualiza con el mandato cat:

cat ejemplo.txt

Devolverá el siguiente contenido:

Columna1        Columna2        Columna3        Columna4

Si se utiliza el mandato awk para que solo muestre la columna 1 y la columna 3 del siguiente modo:

awk '{ print $1, $3}' ejemplo.txt

La salida devolverá lo siguiente:

Columna1 Columna3

Si se utiliza el mandato awk para que solo muestre la columna 3 y la columna 1, en ese orden, del siguiente modo:

awk '{ print $3, $1}' ejemplo.txt

La salida devolverá lo siguiente:

Columna3 Columna1

Si se añaden datos al archivo ejemplo.txt del siguiente modo:

echo -e "Dato1\tDato2\tDato3\tDato4\n" >> ejemplo.txt
echo -e "Dato5\tDato6\tDato7\tDato8\n" >> ejemplo.txt
echo -e "Dato9\tDato10\tDato11\tDato12\n" >> ejemplo.txt

Y se visualiza con el mandato cat:

cat ejemplo.txt

Devolverá el siguiente contenido:

Columna1        Columna2        Columna3        Columna4
Dato1   Dato2   Dato3   Dato4
Dato5   Dato6   Dato7   Dato8
Dato9   Dato10  Dato11  Dato12

Si se utiliza nuevamente el mandato awk para que solo muestre la columna 1 y la columna 3 del siguiente modo:

awk '{ print $1, $3 }' ejemplo.txt

La salida devolverá lo siguiente:

Columna1 Columna3
Dato1 Dato3
Dato5 Dato7
Dato9 Dato11

Si se utiliza el mandato awk del siguiente modo para que solo muestre solo la línea cuya columna contenga la expresión regular Dato5:

awk '/Dato5/ { print }' ejemplo.txt

La salida devolverá lo siguiente:

Dato5   Dato6   Dato7   Dato8

Si se utiliza el mandato awk del siguiente modo para que solo muestre solo la línea cuya columna contenga la expresión regular Dato5 y además solo las columnas 1 y 4:

awk '/Dato5/ { print $1, $4}' ejemplo.txt

La salida devolverá lo siguiente:

Dato5 Dato8

Si se utiliza el mandato awk del siguiente modo para que muestre solo las líneas con más de 35 caracteres en el archivo /etc/crontab:

awk 'length > 35' /etc/crontab

La salida devolverá algo similar a lo siguiente:

# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# *  *  *  *  * user-name  command to be executed

Si se utiliza el mandato awk del siguiente modo para que muestre solo las líneas con menos de 35 caracteres en el archivo /etc/crontab:

awk 'length < 35' /etc/crontab

La salida devolverá algo similar a lo siguiente:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# |  .------------- hour (0 - 23)
# |  |  |  |  |

Utilice el mandato vi para crear el archivo usuario.txt:

vi usuario.txt

Añada el siguiente contenido:

Fulano Algo
Calle Mengana 123
Colonia Perengana
Ciudad de Zutano, C.P. 123456

Para que el mandato awk reconozca cada línea como un registro completo, en lugar de considerar cada palabra como una columna, se utiliza 'BEGIN { FS="\n" ; RS=""}', donde el valor de FS (Field Separator o separador de campo) se establece como un retorno de carro y el valor de RS (Record Separator o separador de registro) se establece como una línea vacía. Si utiliza el siguiente mandato donde se establecen los valores mencionados para FS y RS y se pide se impriman los valores de cada registro (cada línea) separados por una coma y un espacio:

awk 'BEGIN { FS="\n"; RS="" } \
    { print $1 ", " $2 ", " $3 ", " $4 }' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo, Calle Mengana 123, Colonia Perengana, Ciudad de Zutano, C.P. 123456

El mandato awk puede realizar conteo de líneas, palabras y caracteres. El siguiente mandato se establece que el valor de w sea igual al número de campos (New Field o NF), c sea igual la longitud de cada campo y que se imprima el número de campos, el valor de w y el valor de c:

awk '{ w += NF; c += length } \
    END { print \
    "Campos: " NR , "\nPalabras: " w, "\nCaracteres: " c }' \
    usuario.txt

La salida devolverá lo siguiente:

Campos: 4 
Palabras: 12
Caracteres: 74

Genere el archivo numeros.txt con el siguiente contenido, donde las columnas serán separadas por un tabulador:

1 2 3 4
5 6 7 8
9 10 11 12

el mandato awk puede realizar operaciones matemáticas. El siguiente mandato establece que la variable s es igual a la suma del valor de los campos de la primera columna del archivo numeros.txt e imprime el valor de s:

awk '{ s += $1 } END { print s }' numeros.txt

La salida devolverá lo siguiente (que corresponde al resultado de la suma de 1+5+9):

15

Si se hace lo mismo, pero con los valores de la columna 2:

awk '{ s += $2 } END { print s }' numeros.txt

La salida devolverá lo siguiente (que corresponde al resultado de la suma de 2+6+10):

18

Para hacer conteo de frecuencia de palabras, Se establece que el valor para FS (Field Separator o separador de línea) sea igual a expresiones regulares que van desde la letra a hasta la letra z y desde la letra A hasta la letra Z, se establece que el valor de la variable i es igual a 1 y menor al número de campos.

awk 'BEGIN { FS="[^a-zA-Z]+" } \
    { for (i=1; i<=NF; i++) words[tolower($i)]++ } \
    END { for (i in words) print i, words[i] }' /etc/crontab

La salida devolverá algo similar a lo siguiente:

 15
job 1
to 1
usr 2
root 1
shell 1
mon 1
hour 1
bin 3
executed 1
name 1
wed 1
fri 1
details 1
of 3
feb 1
week 1
sun 1
path 1
crontabs 1
or 3
be 1
apr 1
definition 1
month 2
sbin 2
tue 1
jan 1
day 2
command 1
for 1
sunday 1
man 1
mar 1
user 1
minute 1
example 1
see 1
bash 1
sat 1
mailto 1
thu 1

Última Edición: 15/06/2013, 12:14|Hits: 46,143 Ver la versión para imprimir