|  | 
| Awk | 
Estructura de los programas escritos en AWK.
El mandato awk utiliza un fichero o emisión de ordenes y un fichero o emisión de entrada. El primero indica como procesar al segundo. El fichero de entrada es por lo general texto con algún formato que puede ser un fichero o bien la salida de otro mandato.
La sintaxis general utilizada para el mandato awk sigue el siguiente patrón:
awk 'expresión-regular { orden }'
Cuando se utiliza el mandato awk, éste examina el fichero 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 fichero 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 fichero de entrada:
| awk 'BEGIN { orden }' | 
El siguiente modelo ejecutaría la orden por cada una de las líneas del fichero 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 fichero 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 fichero 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\tDato4\12" >> 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 Dato4 | 
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 fichero /etc/crontab:
| awk 'length > 35' /etc/crontab | 
La salida devolverá lo siguiente:
| 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly | 
Si se utiliza el mandato awk del siguiente modo para que muestre solo las líneas con menos de 35 caracteres en el fichero /etc/crontab:
| awk 'length < 35' /etc/crontab | 
La salida devolverá lo siguiente:
| SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts | 
Utiliza vi para crear el fichero usuario.txt:
| vi usuario.txt | 
Ingrese 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 wsea 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 fichero 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 s es igual a la suma del valor de los campos de la primera columna del fichero numeros.txt, e imprime el valor de s:
| awk '{ s += $1 } END { print s }' numeros.txt | 
La salida devolverá lo siguiente (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 (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 a a la z y desde la A a la 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á lo siguiente:
| 7 bin 3 run 5 etc 4 sbin 3 bash 1 weekly 1 daily 1 cron 4 usr 2 path 1 shell 1 parts 5 home 1 mailto 1 monthly 1 hourly 1 root 6 | 
 
No hay comentarios:
Publicar un comentario