GNU/Linux >> Tutoriales Linux >  >> Linux

una guía práctica para aprender awk

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.


Linux
  1. Una guía para instalar aplicaciones en Linux

  2. Aprendiendo a amar systemd

  3. Una guía para principiantes de firewalld en Linux

  4. Una guía para principiantes de Gawk

  5. Mis 8 comandos prácticos favoritos de Linux

Guía completa de registro de Linux

16 ejemplos prácticos del comando Traceroute en Linux

20 ejemplos prácticos del comando Chown en Linux

12 ejemplos prácticos de In Command en Linux

40 Comando awk práctico y útil en Linux y BSD

Una guía práctica para el comando chroot en Linux