Cómo usar el comando awk en Linux

En Linux, awk es un dínamo de manejo de texto de línea de comandos, así como un poderoso lenguaje de scripting. Aquí hay una introducción a algunas de sus características más interesantes.

RELACIONADO: 10 comandos básicos de Linux para principiantes

¿Qué tan mal se puso su nombre?

Un awk la orden fue nombrada usando las iniciales de los tres que escribieron el original en 1977: Alfred Aho, Peter Weinberger, y Brian Kernighan. Estos tres hombres eran asombrosos AT&T Laboratorios Bell Panteón de Unix. Con muchas otras contribuciones desde entonces, awk continúan emergiendo.

Es un lenguaje de programación completo, así como un conjunto completo de herramientas de manipulación de texto de línea de comandos. Si este artículo le abre el apetito, puede revisa cada detalle sobre awk y su funcionalidad.

Reglas, modelos y acciones

awk trabaja en programas que contienen reglas que consisten en modelos y acciones. La acción se realiza sobre el texto que se ajusta a la plantilla. Los modelos están incluidos en tirantes ({}). Juntos, modelo y acción son la regla. El conjunto awk el programa se incluye en citas individuales (').

Echemos un vistazo al tipo más simple awk horario. No tiene patrón, por lo que se adapta a todas las líneas de texto insertadas en él. Esto significa que la acción se realiza en cada línea. Bien úsalo a la salida un who pedido.

Aquí está la salida estándar de who:

who

Es posible que no necesitemos toda esta información, pero en su lugar solo queremos ver los nombres en las cuentas. Podemos canalizar la salida desde who sa awky luego di awk imprime solo el primer campo.

Implícitamente, awk que considera que un campo es un cable rodeado por un espacio en blanco, el comienzo de una línea o el final de una línea. Los campos se identifican con un signo de dólar ($) y algo. SUDOESTE, $1 Representa el primer campo, que usaremos junto con print acción para imprimir el primer campo.

Introducimos lo siguiente:

who | awk '{print $1}'

awk imprime el primer campo y muestra el resto de la línea.

Podemos imprimir tantos campos como queramos. Si agregamos una coma como separador, awk imprime el espacio entre cada campo.

Ingrese lo siguiente para imprimir la hora de inicio de sesión (campo cuatro):

who | awk '{print $1,$4}'

Hay algunos identificadores de campo especiales. Estos muestran la línea completa de texto y el último campo en la línea de texto:

  • 0 USD: Representa la línea completa de texto.
  • $ 1: Representa el primer campo.
  • $ 2: Es igual al segundo campo.
  • $ 7: Es igual al séptimo campo.
  • 45 USD: Es igual al campo 45.
  • $ NF: es igual a «número de campos» y es igual al último campo.

Insertaremos lo siguiente para mostrar un pequeño archivo de texto con una breve cita asignada. Dennis Ritchie:

cat dennis_ritchie.txt

Nos gustaría awk imprima el primer, segundo y último campo de la cotización. Tenga en cuenta que, aunque está envuelto en la ventana de la terminal, solo hay una línea de texto.

Ingresamos el siguiente comando:

awk '{print $1,$2,$NF}' dennis_ritchie.txt

No conocemos esa «sencillez». el campo 18 en la línea de texto y no nos importa. Lo que sí sabemos es que es el último campo y podemos usarlo $NF para encontrar su valor. El período se considera un carácter más en el campo.

Agregar separadores de campo de salida

Puedes decir awk imprime un cierto carácter entre los campos en lugar del carácter de espacio predeterminado. Salir por defecto de date el orden es un poco extraño porque el momento adecuado está en el medio. Sin embargo, podemos ingresar y usar lo siguiente awk para eliminar las áreas que necesitamos:

date
date | awk '{print $2,$3,$6}'

Usaremos OFS (separador de campo de salida) variable para colocar el separador entre mes, día y año. Tenga en cuenta que incluimos el pedido a continuación en cotizaciones individuales ('), no las correas ({}):

date | awk 'OFS="https://www.howtogeek.com/" {print$2,$3,$6}'
date | awk 'OFS="-" {print$2,$3,$6}'

Las reglas BEGINNING y END

CHUN BEGIN la regla se ejecuta una vez antes de que comience el procesamiento de texto. De hecho, se ejecuta antes awk incluso lee cualquier texto. a END la regla se ejecuta después de que se completa cada procesamiento. Puedes tener mas BEGIN y END reglas y se ejecutarán en orden.

Para nuestro ejemplo de BEGIN Por lo general, imprimiremos la cotización completa de dennis_ritchie.txt un archivo que usé antes con un título encima.

Para hacer esto, ingrese este comando:

awk 'BEGIN {print "Dennis Ritchie"} {print $0}' dennis_ritchie.txt

tenga en cuenta que BEGIN la regla tiene su propio conjunto de acciones que se incluye en su propio conjunto de paréntesis ({}).

Podemos usar la misma técnica con el comando que usamos anteriormente para dirigir la salida who sa awk. Para hacer esto, presentamos lo siguiente:

who | awk 'BEGIN {print "Active Sessions"} {print $1,$4}'

Separadores de campo de entrada

Si quieres awk para trabajar con texto que no usa espacios en blanco para separar campos, debe indicarle qué carácter usa el texto como separador de campo. Por ejemplo, el /etc/passwd usa un archivo de dos puntos (:) separan los campos.

Usaremos ese archivo y -F (separador de alambre) opción principal awk usa el colon:) como separador. Introducimos lo siguiente para decir awk para imprimir el nombre de la cuenta de usuario y la carpeta principal:

awk -F: '{print $1,$6}' /etc/passwd

El nombre de la cuenta de usuario (o el nombre de la aplicación o el demonio) y la carpeta de inicio (o la ubicación de la aplicación) están en la salida.

Agregar plantillas

Si lo único que nos interesa son las cuentas de usuario habituales, podemos incluir una plantilla en nuestra acción de impresión para filtrar todas las demás entradas. por nombre de usuario los números son iguales a 1,000 o más, podemos basar el filtro en esa información.

Solo ingresamos lo siguiente para hacer nuestro trabajo de impresión cuando el tercer campo ($3) tiene un valor de 1000 o más:

awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd

El modelo debe preceder inmediatamente a la acción a la que se refiere.

Nosotros podemos usar BEGIN la regla para proporcionar un título para nuestro pequeño informe. Introducimos lo siguiente, usando (n) inserta un carácter de nueva línea en la cadena del título:

awk -F: 'BEGIN {print "User Accountsn-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd

Los modelos tienen pleno derecho expresiones ordinariasy son una de las glorias awk.

Supongamos que queremos ver los identificadores únicos únicos (UUID) de los sistemas de archivos montados. Si buscamos a través /etc/fstab en el caso de apariciones del cable «UUID», debe devolvernos esa información.

Usamos el modelo de búsqueda «/ UUID /» en nuestro comando:

awk '/UUID/ {print $0}' /etc/fstab

Encuentre todas las ocurrencias de UUID e imprima esas líneas. De hecho, hubiéramos logrado el mismo resultado sin print acción porque la acción predeterminada imprime toda la línea de texto. Sin embargo, en aras de la claridad, a menudo resulta útil ser explícito. Cuando revise un archivo de secuencia de comandos o historial, se alegrará de haber dejado pistas.

La primera línea que se encontró fue una línea de comentario y, aunque la cadena «UUID» está en el medio, awk todavía lo tiene. Podemos ajustar la expresión regular y podemos decir awk solo se procesan las líneas que comienzan con «UUID». Para ello, insertamos lo siguiente, que incluye el símbolo frontal de la línea (^):

awk '/^UUID/ {print $0}' /etc/fstab

¡Es mejor de esta forma! Ahora solo vemos las instrucciones de instalación auténtico. Para refinar aún más el resultado, ingrese lo siguiente y restrinja la visualización al primer campo:

awk '/^UUID/ {print $1}' /etc/fstab

Si tuviéramos varios sistemas de archivos montados en esta máquina, obtendríamos una tabla de comandos con sus UUID.

Funciones integradas

awk usted muchas funciones que puede llamar y usar en sus propios programas, desde la línea de comandos y en scripts. Si investiga un poco, encontrará que es muy fructífero.

Para ilustrar la técnica general de llamar a una función, veremos algunos números. Por ejemplo, lo siguiente imprime una impresión cuadrada de 625:

awk 'BEGIN { print sqrt(625)}'

Este comando imprime el arco tangente 0 (cero) y -1 (que resulta ser la constante matemática, pi):

awk 'BEGIN {print atan2(0, -1)}'

En el siguiente comando, cambiamos el resultado. atan2() función antes de imprimir:

awk 'BEGIN {print atan2(0, -1)*100}'

Las funciones pueden aceptar expresiones como parámetros. Por ejemplo, aquí hay una forma trivial de pedir la raíz cuadrada de 25:

awk 'BEGIN { print sqrt((2+3)*5)}'

Escrituras awk

Si su línea de comando es complicada o desarrolla una rutina que sabe que desea usar nuevamente, puede cambiar awk comando en secuencia de comandos.

En nuestro ejemplo de secuencia de comandos, haremos lo siguiente:

  • Dígale al shell qué ejecutable usar para ejecutar el script.
  • Preparar awk usar FS variable de separación de campo para leer el texto de entrada con campos separados por columnas (:).
  • usos OFS separador de campo de salida principal awk usar dos puntos:(b) separe los campos de la salida.
  • Ponga el contador a 0 (cero).
  • Establezca el segundo campo de cada línea de texto en un valor en blanco (siempre es una «x», por lo que no es necesario que lo veamos).
  • Imprime la línea con el segundo campo modificado.
  • Multiplica el metro.
  • Imprime el valor del contador.

Nuestro guión se presenta a continuación.

Script awk, por ejemplo, en editor.

Un BEGIN la regla lleva a cabo los pasos preparatorios, y el END la regla muestra el valor del medidor. La regla del medio (que no tiene nombre ni patrón, por lo que cada línea coincide) cambia el segundo campo, imprime la línea y agranda el contador.

La primera línea del script le dice al shell ejecutable que use (awk, en nuestro ejemplo) para ejecutar el script. Va tambien -f opción (nombre de archivo) para awk, que le informa que el texto que procesará vendrá de un archivo. Ejecutaremos el nombre del archivo de script cuando lo ejecutemos.

He incluido el siguiente script como texto para que pueda cortarlo y pegarlo:

#!/usr/bin/awk -f

BEGIN {
  # set the input and output field separators
  FS=":"
  OFS=":"
  # zero the accounts counter
  accounts=0
}
{
  # set field 2 to nothing
  $2=""
  # print the entire line
  print $0
  # count another account
  accounts++
}
END {
  # print the results
  print accounts " accounts.n"
}

Guarde esto en un archivo con nombre omit.awk. para que hace que el script sea ejecutabley, introducimos lo siguiente usando chmod:

chmod +x omit.awk

Ahora lo ejecutamos y pasamos /etc/passwd archivo de comandos. Aqui esta el archivo awk procesará por nosotros, usando las reglas del script:

./omit.awk /etc/passwd

El archivo se procesa y se muestra cada línea, como se muestra a continuación.

Las entradas «x» en el segundo campo se han eliminado, pero tenga en cuenta que los separadores de campo todavía están allí. Las líneas se cuentan y el total se da en la parte inferior de la salida.

incómodo no significa incómodo

awk no sufre vergüenza; Representa elegancia. Ha sido descrito como un filtro de procesamiento y redactor de informes. Específicamente, son una herramienta o más bien puede usar para ambas tareas. En solo unas pocas líneas, awk logra lo que requiere una codificación extensa en un lenguaje tradicional.

Este poder se ejerce a través del concepto simple de las reglas que contienen las plantillas, que selecciona el texto a procesar y las acciones que definen el procesamiento.