De todos los comandos de Linux que existen (y hay muchos), los tres más esenciales parecen ser sed
, awk
y grep
. Tal vez sea el sonido arcano de sus nombres, o la amplitud de su uso potencial, o simplemente su edad, pero cuando alguien da un ejemplo de un comando "Linuxy", generalmente es uno de esos tres. Y mientras sed
y grep
tienen varios estándares simples de una línea, el menos prestigioso awk
sigue siendo persistentemente prominente por ser particularmente desconcertante.
Es probable que uses sed
para un reemplazo rápido de cadena o grep
para filtrar un patrón diariamente. Es mucho menos probable que compongas un awk
dominio. A menudo me pregunto por qué es esto, y lo atribuyo a algunas cosas. En primer lugar, muchos de nosotros apenas usamos sed
y grep
para cualquier cosa menos alguna variación sobre estos dos comandos:
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Entonces, aunque te sientas más cómodo con sed
y grep
, es posible que no utilice todo su potencial. Por supuesto, no hay obligación de obtener más información sobre sed
o grep
, pero a veces me pregunto sobre la forma en que "aprendo" los comandos. En lugar de aprender cómo funciona un comando, a menudo aprendo un conjuro específico que incluye un comando. Como resultado, a menudo siento una falsa familiaridad con el comando. Creo que sé un comando porque puedo nombrar tres o cuatro opciones de la parte superior de mi cabeza, aunque no sé qué hacen las opciones y no puedo precisar la sintaxis.
Y ese es el problema, creo, que muchas personas enfrentan cuando se enfrentan al poder y la flexibilidad de awk
.
Aprender awk a usar awk
Los fundamentos de awk
son sorprendentemente simples. A menudo se observa que awk
es un lenguaje de programación, y aunque es relativamente básico, es cierto. Esto significa que puedes aprender awk
de la misma manera que aprende un nuevo lenguaje de codificación:aprenda su sintaxis usando algunos comandos básicos, aprenda su vocabulario para que pueda desarrollar acciones complejas y luego practique, practique, practique.
Cómo analiza awk la entrada
Awk
ve la entrada, esencialmente, como una matriz. Cuando awk
escanea un archivo de texto, trata cada línea, individualmente y en sucesión, como un registro . Cada registro se divide en campos . Por supuesto, awk
debe realizar un seguimiento de esta información, y puede ver esos datos usando el NR
(número de registros) y NF
(número de campos) variables integradas. Por ejemplo, esto le da el número de líneas de un archivo:
$ awk 'END { print NR;}' example.txt
36
Esto también revela algo sobre awk
sintaxis. Ya sea que estés escribiendo awk
como una sola línea o como un guión autónomo, la estructura de un awk
la instrucción es:
pattern or keyword { actions }
En este ejemplo, la palabra END
es una palabra clave reservada especial en lugar de un patrón. Una palabra clave similar es BEGIN
. Con estas dos palabras clave, awk
simplemente ejecuta la acción entre llaves al principio o al final del análisis de datos.
Puedes usar un patrón como filtro o calificador para que awk
solo ejecuta una acción determinada cuando puede hacer coincidir su patrón con el registro actual. Por ejemplo, suponga que quiere usar awk
, tanto como lo harías con grep
, para buscar la palabra Linux en un archivo de texto:
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)
Para awk
, cada línea del archivo es un registro y cada palabra de un registro es un campo. Por defecto, los campos están separados por un espacio. Puede cambiar eso con --field-separator
opción, que establece el FS
(separador de campo) variable a lo que quieras que sea:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
En este ejemplo, hay un espacio vacío antes de cada lista porque hay un espacio en blanco después de cada dos puntos (:
) en el texto fuente. Esto no es cut
, sin embargo, por lo que el separador de campos no necesita estar limitado a un carácter:
$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Funciones en awk
Puedes construir tus propias funciones en awk
usando esta sintaxis:
name(parameters) { actions }
Las funciones son importantes porque le permiten escribir código una vez y reutilizarlo a lo largo de su trabajo. Al construir frases ingeniosas, las funciones personalizadas son un poco menos útiles que en los scripts, pero awk
ya define muchas funciones para usted. Funcionan básicamente igual que cualquier función en cualquier otro idioma u hoja de cálculo:aprendes el orden en que la función necesita información de ti y puedes alimentarla con lo que quieras para obtener los resultados.
Hay funciones para realizar operaciones matemáticas y procesamiento de cadenas. Los de matemáticas suelen ser bastante sencillos. Proporcionas un número y lo procesa:
$ awk 'BEGIN { print sqrt(1764); }'
42
Las funciones de cadena pueden ser más complejas, pero están bien documentadas en el manual de GNU awk. Por ejemplo, la split
función toma una entidad que awk
ve como un solo campo y lo divide en diferentes partes. Requiere un campo, una variable para usar como una matriz que contiene cada parte de la división y el carácter que desea usar como delimitador.
Usando el resultado de los ejemplos anteriores, sé que hay una dirección IP al final de cada registro. En este caso, puedo enviar solo el último campo de un registro al split
función haciendo referencia a la variable NF
porque contiene el número de campos (y el campo final debe ser el número más alto):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2
Hay muchas más funciones y no hay razón para limitarse a una por bloque de awk
código. Puedes construir canalizaciones complejas con awk
en tu terminal, o puedes escribir awk
scripts para definir y utilizar sus propias funciones.
Descargar el libro electrónico
Aprendiendo awk
es principalmente una cuestión de usar awk
. Úselo incluso si eso significa duplicar la funcionalidad que ya tiene con sed
o grep
o cut
o tr
o cualquier otro comando perfectamente válido. Una vez que se sienta cómodo con él, puede escribir funciones Bash que invoquen su awk
personalizado Comandos para facilitar su uso. Y eventualmente, podrá escribir scripts para analizar conjuntos de datos complejos.
Descarga nuestro Libro electrónico para aprender todo lo que necesitas saber sobre awk
y comience a usarlo hoy mismo.