

Este fue uno de mis primeros amores. Y no, este tampoco es un tutorial.
Indice
Introducción
Conozco y uso extensamente AWK desde hace casi 30 años (al 2023). AWK es un lenguaje de programación cuyo intérprete se invoca mediante el comando awk(1). Esto es una fuente de confusión muy usual y común pues muchos consideran AWK y awk como equivalentes, pero debe uno ser claro cuando se refiere al lenguaje de programación y cuando al intérprete.
A veces, awk es llamado un «filtro» por las acciones que éste puede realizar con una entrada de datos. Sin embargo, el intérprete, mediante el scripting que puede hacerse con AWK logra mucho más que «sólo filtrar». Un filtro por ejemplo, para tenerlo en contexto, es cut(1) o algún comando similar.
Descripción
AWK es un lenguaje de scripting, interpretado, orientado al procesamiento de textos y archivos de texto, i.e. las construcciones gramaticales del lenguaje están pensadas para facilitar la lectura de archivos estructurados, semiestructurados e, incluso, de texto libre, buscar cadenas y patrones de cadenas en estos y llevar a cabo acciones al encontrarse, no encontrarse o, en forma general, sobre todos los registros del archivo.
Información adicional sobre la historia de este lenguaje puede encontrarse en algunos posts (1, 2, 3) de este sitio.
Entornos
macOS
![]()





Estas notas inician con macOS Catalina, que incluyó la implementación clásica de AWK, lo cual está bien, pero en la actualidad presenta ciertas limitaciones. Salvo que se indique expresamente alguna consideración especial o acción específica, las instrucciones aquí indicadas se mantienen vigentes para las versiones indicadas, con su correspondiente icono, en el título de esta sección.
En algunas ocasiones, una implementación más moderna puede resultar preferible. Si este es el caso, puede procederse como se ilustra aquí. Primero, para validar la versión, hacer:
$ awk --version
awk version 20070501
Instalación o actualización
La forma más fácil de instalar AWK es mediante un administrador de paquetes, como Homebrew. Para este caso, un posible problema puede ser los permisos. Por ejemplo:
$ brew install gawk
...
Error: The following directories are not writable by your user:
/usr/local/share/locale
You should change the ownership of these directories to your user.
sudo chown -R $(whoami) /usr/local/share/locale
And make sure that your user has write permission.
chmod u+w /usr/local/share/locale
Intentar hacerlo con sudo no funcionará, pues el Homebrew «es muy cobarde»:
$ sudo brew install gawk
Error: Running Homebrew as root is extremely dangerous and no longer supported. As Homebrew does not drop privileges on installation you would be giving all build scripts full access to your system.
Aunque esto puede ser resuelto simplemente permitiendo escribir en los directorios señalados, puede haber problemas después si el macOS llega a hacer una revisión o actualización de estos. Así,
$ sudo chmod -R g+w /usr/local/share/locale
permite poder ejecutar:
$ brew install gawk
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
No changes to formulae.
==> Installing dependencies for gawk: gettext, gmp, mpfr and readline
==> Installing gawk dependency: gettext
==> Downloading https://homebrew.bintray.com/bottles/gettext-0.20.1.catalina.bot
Already downloaded: /Users/admin/Library/Caches/Homebrew/downloads/5f0623a7810dc5225d94f823a8ff0d216a063934ba6579d4a5d0f5996b289ac9--gettext-0.20.1.catalina.bottle.tar.gz
==> Pouring gettext-0.20.1.catalina.bottle.tar.gz
==> Caveats
gettext is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD gettext library & some software gets confused if both are in the library path.
If you need to have gettext first in your PATH run:
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
For compilers to find gettext you may need to set:
export LDFLAGS="-L/usr/local/opt/gettext/lib"
export CPPFLAGS="-I/usr/local/opt/gettext/include"
==> Summary
🍺 /usr/local/Cellar/gettext/0.20.1: 1,893 files, 18.4MB
==> Installing gawk dependency: gmp
==> Downloading https://homebrew.bintray.com/bottles/gmp-6.1.2_2.catalina.bottle
Already downloaded: /Users/admin/Library/Caches/Homebrew/downloads/5aa09afe716bf4318e4482ea17edb1822a33ad814017ec7846346c8d59688ed2--gmp-6.1.2_2.catalina.bottle.1.tar.gz
==> Pouring gmp-6.1.2_2.catalina.bottle.1.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink include/gmp.h
Target /usr/local/include/gmp.h
already exists. You may want to remove it:
rm '/usr/local/include/gmp.h'
To force the link and overwrite all conflicting files:
brew link --overwrite gmp
To list all files that would be deleted:
brew link --overwrite --dry-run gmp
Possible conflicting files are:
/usr/local/include/gmp.h
/usr/local/share/info/gmp.info
/usr/local/share/info/gmp.info-1
/usr/local/share/info/gmp.info-2
/usr/local/lib/libgmp.10.dylib
/usr/local/lib/libgmp.a
/usr/local/lib/libgmp.dylib -> /usr/local/lib/libgmp.10.dylib
==> Summary
🍺 /usr/local/Cellar/gmp/6.1.2_2: 18 files, 3MB
==> Installing gawk dependency: mpfr
==> Downloading https://homebrew.bintray.com/bottles/mpfr-4.0.2.catalina.bottle.
Already downloaded: /Users/admin/Library/Caches/Homebrew/downloads/c2450a9a667c06cfb8a429ac0eb4357094224fede788da6755e8dd58a0ef92d5--mpfr-4.0.2.catalina.bottle.tar.gz
==> Pouring mpfr-4.0.2.catalina.bottle.tar.gz
🍺 /usr/local/Cellar/mpfr/4.0.2: 28 files, 4.7MB
==> Installing gawk dependency: readline
==> Downloading https://homebrew.bintray.com/bottles/readline-8.0.1.catalina.bot
Already downloaded: /Users/admin/Library/Caches/Homebrew/downloads/7ba173dce0bacf0af49b0e00117a945c0329420f77a21d0986a0e69a4f7f2780--readline-8.0.1.catalina.bottle.tar.gz
==> Pouring readline-8.0.1.catalina.bottle.tar.gz
==> Caveats
readline is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.
For compilers to find readline you may need to set:
export LDFLAGS="-L/usr/local/opt/readline/lib"
export CPPFLAGS="-I/usr/local/opt/readline/include"
For pkg-config to find readline you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
==> Summary
🍺 /usr/local/Cellar/readline/8.0.1: 48 files, 1.5MB
==> Installing gawk
==> Downloading https://homebrew.bintray.com/bottles/gawk-5.0.1.catalina.bottle.
==> Downloading from https://akamai.bintray.com/3b/3bb22749e869048a14e444e738813
######################################################################## 100.0%
==> Pouring gawk-5.0.1.catalina.bottle.1.tar.gz
🍺 /usr/local/Cellar/gawk/5.0.1: 90 files, 4.7MB
==> Caveats
==> gettext
gettext is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD gettext library & some software gets confused if both are in the library path.
If you need to have gettext first in your PATH run:
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
For compilers to find gettext you may need to set:
export LDFLAGS="-L/usr/local/opt/gettext/lib"
export CPPFLAGS="-I/usr/local/opt/gettext/include"
==> readline
readline is keg-only, which means it was not symlinked into /usr/local,
because macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.
For compilers to find readline you may need to set:
export LDFLAGS="-L/usr/local/opt/readline/lib"
export CPPFLAGS="-I/usr/local/opt/readline/include"
For pkg-config to find readline you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
Como puede verse arriba, señalado en rojo, hay un problema con la instalación. Este se ha sobrellevado con los siguiente comandos:
$ mv /usr/local/include/gmp.h /usr/local/include/gmp.h-20191117
$ mv /usr/local/share/info/gmp.info /usr/local/share/info/gmp.info-20191117
$ mv /usr/local/share/info/gmp.info-1 /usr/local/share/info/gmp.info-1-20191117
$ mv /usr/local/share/info/gmp.info-2 /usr/local/share/info/gmp.info-2-20191117
$ mv /usr/local/lib/libgmp.10.dylib /usr/local/lib/libgmp.10.dylib-20191117
$ mv /usr/local/lib/libgmp.a /usr/local/lib/libgmp.a-20191117
$ mv /usr/local/lib/libgmp.dylib /usr/local/lib/libgmp.dylib-20191117
Para prever cualquier posible problema, después de un fallo como éste en la instalación, conviene hacer una reinstalación:
$ brew unlink gawk
Unlinking /usr/local/Cellar/gawk/5.0.1... 41 symlinks removed
$ brew reinstall awk
==> Reinstalling awk
==> Downloading https://homebrew.bintray.com/bottles/awk-20180827.catalina.bottl
######################################################################## 100.0%
==> Pouring awk-20180827.catalina.bottle.tar.gz
🍺 /usr/local/Cellar/awk/20180827: 7 files, 178.0KB
Tras lo que se ha procedido con:
$ brew reinstall gawk
==> Reinstalling gawk
==> Downloading https://homebrew.bintray.com/bottles/gawk-5.0.1.catalina.bottle.
Already downloaded: /Users/admin/Library/Caches/Homebrew/downloads/c3c9257aaa8460f64be8fcdda6b902852f7c65115961d129a42b04ee25bc7f0d--gawk-5.0.1.catalina.bottle.1.tar.gz
==> Pouring gawk-5.0.1.catalina.bottle.1.tar.gz
🍺 /usr/local/Cellar/gawk/5.0.1: 90 files, 4.7MB
Para finalmente así:
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2019 Free Software Foundation.
...
Desinstalación
Para desinstalar gawk, se procede con:
$ brew uninstall mpfr gmp gettext gawk readline
Ejemplos
«Hello, World!»
El típico ejemplo. El código debe colocarse en un archivo llamado helloWorld.awk. Este ejemplo incluye una shebang (lo que permite ejecutarlo sin invocar al intérprete dando permisos: chmod u+x helloWorld.awk).
#!/usr/bin/env awk -f
BEGIN {
print "Hello, World!"
}
La ejecución entonces puede hacerse con:
./helloWorld.awk -
o
./helloWorld.awk
o
awk -f ./helloWorld.awk
o alguna combinación de lo anterior (algunos shell pueden requerir una entrada explícita a ser procesada).
Uso
Algunos ejemplos interesantes de uso de AWK.
Emulando Python
🔘 Slicing
Cuando uno conoce y entiende lo que es es el slicing de Python es difícil olvidarlo y uno trata de replicarlo en lenguajes que no lo tienen. Por ejemplo:
- Obteniendo n campos de entrada
$ awk '{ $1=""; $2=""; $3=""; print}' filename
o
$ awk '{print substr($0, index($0,$3))}' filename
🔘 Otros
Algunos otros ejemplos de uso en posts del blog de este sitio:
- Visualizando la estructura arbórea de directorios.
- El complemento de una lista de caracteres (1), (2).
- Leyendo manifiestos de distribución de paquetes de macOS.
- Arreglando tiempos de archivos.
![]()

![]()
© Todos los derechos reservados.
Dr. Eduardo René Rodríguez Ávila
Creación: 2019.11.17
Última actualización: 2026.03.22
El contenido de este sitio puede ser copiado y reproducido libremente, siempre que no se altere y se cite su origen. Marcas y productos registrados se citan por referencia, sin fines de lucro ni de dolo. Todas las opiniones son a título personal del o de los autores de estas y, salvo que se exprese de otro modo, deben considerarse como registro y expresión de la experiencia de uso de aquello de lo que se trata. Para conocer más sobre la posición de privacidad y responsabilidad respecto de lo que se presenta en este sitio web y de cómo se ha obtenido, consulte la declaración correspondiente.

