![]() |
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