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

AWK es un poderoso lenguaje de programación basado en datos que se remonta a los primeros días de Unix. Inicialmente se desarrolló para escribir programas de una sola línea, pero desde entonces se ha convertido en un . AWK recibe su nombre de las iniciales de sus autores: Aho, Weinberger y Kernighan. El comando awk en invoca al intérprete que ejecuta scripts AWK. Existen varias implementaciones de awk en sistemas recientes como gawk (GNU awk), mawk (Minimal awk) y nawk (New awk), entre otros. Consulte los ejemplos a continuación si desea dominar awk.

Comprensión de los programas AWK

Los programas escritos en awk constan de reglas, que son simplemente un par de patrones y acciones. Los patrones se agrupan dentro de una llave {}, y la parte de acción se activa cada vez que awk encuentra textos que coinciden con el patrón. Aunque awk se desarrolló para escribir frases breves, los usuarios experimentados pueden escribir fácilmente scripts complejos con él.

comando awk en Linux

Los programas AWK son muy útiles para el procesamiento de archivos a gran escala. Identifica campos de texto mediante caracteres especiales y separadores. También ofrece construcciones de programación de alto nivel como matrices y bucles. Por lo tanto, escribir programas robustos usando awk simple es muy factible.

Ejemplos prácticos del comando awk en Linux

Los administradores normalmente usan awk para la extracción de datos y la generación de informes junto con otros tipos de manipulaciones de archivos. A continuación, analizamos awk con más detalle. Siga los comandos cuidadosamente y pruébelos en su terminal para una comprensión completa.

1. Imprimir campos específicos desde la salida de texto

Los más muestran su salida utilizando varios campos. Normalmente, usamos el comando cut de Linux para extraer un campo específico de dichos datos. Sin embargo, el siguiente comando le muestra cómo hacer esto usando el comando awk.

$ who | awk '{print $1}'

Este comando mostrará solo el primer campo de la salida del comando who. Por lo tanto, simplemente obtendrá los nombres de usuario de todos los usuarios registrados actualmente. Aquí, $ 1 representa el primer campo. Debe usar $ N si desea extraer el campo N-ésimo.

2. Imprima varios campos desde la salida de texto

El intérprete de awk nos permite imprimir la cantidad de campos que queramos. Los siguientes ejemplos nos muestran cómo extraer los dos primeros campos de la salida del comando who.

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

También puede controlar el orden de los campos de salida. El siguiente ejemplo muestra primero la segunda columna producida por el comando who y luego la primera columna en el segundo campo.

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

Simplemente omita los parámetros de campo ( $ N ) para mostrar todos los datos.

3. Utilice declaraciones BEGIN

La instrucción BEGIN permite a los usuarios imprimir información conocida en la salida. Suele utilizarse para formatear los datos de salida generados por awk. La sintaxis de esta declaración se muestra a continuación.

BEGIN { Actions}
{ACTION}

Las acciones que forman la sección BEGIN siempre se activan. Luego awk lee las líneas restantes una por una y ve si es necesario hacer algo.

$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2}'

El comando anterior etiquetará los dos campos de salida extraídos de la salida del comando who.

4. Utilice declaraciones END

También puede usar la instrucción END para asegurarse de que ciertas acciones siempre se realicen al final de su operación. Simplemente coloque la sección FIN después del conjunto principal de acciones.

$ who | awk 'BEGIN {print "User\tFrom"} {print $1, $2} END {print "--COMPLETED--"}'

El comando anterior agregará la cadena dada al final de la salida.

5. Buscar usando patrones

Una gran parte del funcionamiento de awk implica . Como ya hemos comentado, awk busca patrones en cada línea de entrada y solo ejecuta la acción cuando se activa una coincidencia. Nuestras reglas anteriores consistían solo en acciones. A continuación, ilustramos los conceptos básicos de la coincidencia de patrones utilizando el comando awk en Linux.

$ who | awk '/mary/ {print}'

Este comando verá si el usuario mary está actualmente conectado o no. Producirá la línea completa si se encuentra alguna coincidencia.

6. Extraer información de archivos

El comando awk funciona muy bien con archivos y se puede utilizar para tareas complejas de procesamiento de archivos. El siguiente comando ilustra cómo awk maneja los archivos.

$ awk '/hello/ {print}' /usr/share/dict/american-english

Este comando busca el patrón ‘hola’ en el archivo del diccionario inglés-americano. Está disponible en la mayoría de en . Por lo tanto, puede probar fácilmente programas awk en este archivo.

búsqueda de patrón awk

7. Leer la secuencia de comandos AWK desde el archivo de origen

Aunque escribir programas de una sola línea es útil, también puede escribir programas grandes utilizando awk por completo. Querrá guardarlos y ejecutar su programa usando el archivo fuente.

$ awk -f script-file
$ awk --file script-file

La opción -f o –file nos permite especificar el archivo del programa. Sin embargo, no necesita usar comillas (”) dentro del archivo de script ya que no interpretará el código del programa de esta manera.

8. Establecer el separador de campo de entrada

Un separador de campo es un delimitador que divide el registro de entrada. Podemos especificar fácilmente los separadores de campo para awk usando la opción -F o –field-separator . Consulte los siguientes comandos para ver cómo funciona.

$ echo "This-is-a-simple-example" | awk -F - ' {print $1} '
$ echo "This-is-a-simple-example" | awk --field-separator - ' {print $1} '

Funciona igual cuando se utilizan archivos de script en lugar del comando awk de una sola línea en Linux.

9. Imprimir información según la condición

Hemos hablado en una guía anterior. Ahora le mostraremos cómo extraer información usando awk solo cuando se cumplan ciertos criterios. Usaremos el mismo archivo de prueba que usamos en esa guía. Así que dirígete hacia allí y haz una copia del archivo test.txt .

$ awk '$4 > 50' test.txt

Este comando imprimirá todas las naciones del archivo test.txt, que tiene más de 50 millones de habitantes.

10. Imprimir información comparando expresiones regulares

El siguiente comando awk verifica si el tercer campo de cualquier línea contiene el patrón ‘Lira’ e imprime la línea completa si se encuentra una coincidencia. De nuevo estamos usando el archivo test.txt usado para ilustrar el . Así que asegúrese de tener este archivo antes de continuar.

$ awk '$3 ~ /Lira/' test.txt

Puede optar por imprimir solo una parte específica de cualquier coincidencia si lo desea.

11. Cuente el número total de líneas en la entrada

El comando awk tiene muchas variables de propósito especial que nos permiten hacer muchas cosas avanzadas fácilmente. Una de esas variables es NR, que contiene el número de línea actual.

$ awk 'END {print NR} ' test.txt

Este comando mostrará cuántas líneas hay en nuestro archivo test.txt. Primero itera sobre cada línea, y una vez que ha llegado a END, imprimirá el valor de NR, que contiene el número total de líneas en este caso.

12. Establecer el separador de campo de salida

Anteriormente, hemos mostrado cómo seleccionar separadores de campo de entrada usando la opción -F o –field-separator . El comando awk también nos permite especificar el separador de campo de salida. El siguiente ejemplo demuestra esto usando un ejemplo práctico.

$ date | awk 'OFS="-" {print$2,$3,$6}'

Este comando imprime la fecha actual usando el formato dd-mm-aa. Ejecute el programa de fecha sin awk para ver cómo se ve la salida predeterminada.

13. Uso de la construcción If

Al igual que otros , awk también proporciona a los usuarios las construcciones if-else. La instrucción if en awk tiene la siguiente sintaxis.

if (expression)
{
  first_action
  second_action
}

Las acciones correspondientes solo se realizan si la expresión condicional es verdadera. El siguiente ejemplo demuestra esto usando nuestro archivo de referencia test.txt .

$ awk '{ if ($4>100) print }' test.txt

No es necesario mantener la sangría estrictamente.

14. Uso de construcciones If-Else

Puede construir escaleras if-else útiles utilizando la siguiente sintaxis. Son útiles cuando se diseñan scripts awk complejos que tratan con datos dinámicos.

if (expression)
  first_action
else
  second_action
$ awk '{ if ($4>100) print; else print }' test.txt

El comando anterior imprimirá el archivo de referencia completo ya que el cuarto campo no es mayor que 100 para cada línea.

15. Establecer el ancho del campo

A veces, los datos de entrada son bastante desordenados y los usuarios pueden tener dificultades para visualizarlos en sus informes. Afortunadamente, awk proporciona una poderosa variable incorporada llamada FIELDWIDTHS que nos permite definir una lista de anchos separados por espacios en blanco.

$ echo 5675784464657 | awk 'BEGIN {FIELDWIDTHS= "3 4 5"} {print $1, $2, $3}'

Es muy útil cuando se analizan datos dispersos, ya que podemos controlar el ancho del campo de salida exactamente como queramos.

ancho de campo en awk

16. Establecer el separador de registros

El RS o Record Separator es otra variable incorporada que nos permite especificar cómo se separan los registros. Primero creemos un archivo que demostrará el funcionamiento de esta variable awk.

$ cat new.txt
Melinda James

23 New Hampshire

(222) 466-1234

Daniel James

99 Phonenix Road

(322) 677-3412
$ awk 'BEGIN{FS="\n"; RS="} {print $1,$3}' new.txt

Este comando analizará el documento y escupirá el nombre y la dirección de las dos personas.

17. Variables de entorno de impresión

El comando awk en Linux nos permite imprimir variables de entorno fácilmente usando la variable ENVIRON. El siguiente comando demuestra cómo usar esto para imprimir el contenido de la variable PATH.

$ awk 'BEGIN{ print ENVIRON["PATH"] }'

Puede imprimir el contenido de cualquier variable de entorno sustituyendo el argumento de la variable ENVIRON. El siguiente comando imprime el valor de la variable de entorno HOME.

$ awk 'BEGIN{ print ENVIRON["HOME"] }'

18. Omitir algunos campos de la salida

El comando awk nos permite omitir líneas específicas de nuestra salida. El siguiente comando demostrará esto usando nuestro archivo de referencia test.txt .

$ awk -F":" '{$2="; print}' test.txt

Este comando omitirá la segunda columna de nuestro archivo, que contiene el nombre de la capital de cada país. También puede omitir más de un campo, como se muestra en el siguiente comando.

$ awk -F":" '{$2=";$3=";print}' test.txt

19. Eliminar líneas vacías

A veces, los datos pueden contener demasiadas líneas en blanco. Puede usar el comando awk para eliminar líneas vacías con bastante facilidad. Consulte el siguiente comando para ver cómo funciona esto en la práctica.

$ awk '/^[ \t]*$/{next}{print}' new.txt

Hemos eliminado todas las líneas vacías del archivo new.txt usando una expresión regular simple y un awk incorporado llamado next.

20. Eliminar espacios en blanco finales

La salida de muchos comandos de Linux contiene espacios en blanco finales. Podemos usar el comando awk en Linux para eliminar espacios en blanco como espacios y tabulaciones. Consulte el siguiente comando para ver cómo abordar estos problemas con awk.

$ awk '{sub(/[ \t]*$/, ");print}' new.txt test.txt

Agregue algunos espacios en blanco finales a nuestros archivos de referencia y verifique si awk los eliminó con éxito o no. Hizo esto con éxito en mi máquina.

21. Verifique la cantidad de campos en cada línea

Podemos comprobar fácilmente cuántos campos hay en una línea usando un simple awk de una línea. Hay muchas formas de hacer esto, pero usaremos algunas de las variables integradas de awk para esta tarea. La variable NR nos da el número de línea y la variable NF proporciona el número de campos.

$ awk '{print NR,"-->",NF}' test.txt

Ahora podemos confirmar cuántos campos hay por línea en nuestro documento test.txt . Dado que cada línea de este archivo contiene 5 campos, estamos seguros de que el comando está funcionando como se esperaba.

22. Verificar el nombre de archivo actual

La variable awk FILENAME se usa para verificar el nombre del archivo de entrada actual. Estamos demostrando cómo funciona esto con un ejemplo simple. Sin embargo, puede ser útil en situaciones en las que el nombre del archivo no se conoce explícitamente o hay más de un archivo de entrada.

$ awk '{print FILENAME}' test.txt
$ awk '{print FILENAME}' test.txt new.txt

Los comandos anteriores imprimen el nombre de archivo en el que trabaja awk cada vez que procesa una nueva línea de los archivos de entrada.

23. Verificar el número de registros procesados

El siguiente ejemplo mostrará cómo podemos verificar la cantidad de registros procesados ​​por el comando awk. Dado que una gran cantidad de administradores de sistemas Linux utilizan awk para generar informes, es muy útil para ellos.

$ awk '{print "Processing Record - ",NR;} END {print "\nTotal Records Processed:", NR;}' test.txt

A menudo utilizo este fragmento de awk para tener una descripción clara de mis acciones. Puede modificarlo fácilmente para adaptarlo a nuevas ideas o acciones.

número de líneas procesadas en awk

24. Imprima el número total de caracteres en un registro

El lenguaje awk proporciona una función útil llamada length () que nos dice cuántos caracteres hay en un registro. Es muy útil en varios escenarios. Eche un vistazo rápido al siguiente ejemplo para ver cómo funciona.

$ echo "A random text string..." | awk '{ print length($0); }'
$ awk '{ print length($0); }' /etc/passwd

El comando anterior imprimirá el número total de caracteres presentes en cada línea de la cadena de entrada o archivo.

25. Imprima todas las líneas más largas que una longitud especificada

Podemos agregar algunos condicionales al comando anterior y hacer que solo imprima aquellas líneas que son mayores que una longitud predefinida. Es útil cuando ya tiene una idea sobre la longitud de un registro específico.

$ echo "A random text string..." | awk 'length($0) > 10'
$ awk '{ length($0) > 5; }' /etc/passwd

Puede incluir más opciones y / o argumentos para modificar el comando según sus requisitos.

26. Imprima el número de líneas, caracteres y palabras

El siguiente comando awk en Linux imprime el número de líneas, caracteres y palabras en una entrada determinada. Utiliza la variable NR así como algunos conceptos básicos de aritmética para realizar esta operación.

$ echo "This is a input line..." | awk '{ w += NF; c += length + 1 } END { print NR, w, c }'

Muestra que hay 1 línea, 5 palabras y exactamente 24 caracteres presentes en la cadena de entrada.

27. Calcule la frecuencia de las palabras

Podemos combinar matrices asociativas y el bucle for en awk para calcular la frecuencia de palabras de un documento. El siguiente comando puede parecer un poco complejo, pero es bastante simple una vez que comprende claramente las construcciones básicas.

$ awk 'BEGIN {FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) words[tolower($i)]++ } END { for (i in words) print i, words[i] }' test.txt

Si tiene problemas con el fragmento de una sola línea, copie el siguiente código en un archivo nuevo y ejecútelo utilizando la fuente.

$ cat > frequency.awk
BEGIN {
FS="[^a-zA-Z]+"
}
{
for (i=1; i<=NF; i++)
words[tolower($i)]++
}
END {
for (i in words)
print i, words[i]
}

Luego ejecútelo usando la opción -f .

$ awk -f frequency.awk test.txt

28. Cambiar el nombre de los archivos usando AWK

El comando awk se puede utilizar para cambiar el nombre de todos los archivos que coincidan con ciertos criterios. El siguiente comando ilustra cómo usar awk para cambiar el nombre de todos los archivos .MP3 en un directorio a archivos .mp3.

$ touch {a,b,c,d,e}.MP3
$ ls *.MP3 | awk '{ printf("mv \"%s\"" \""%s\""\n"", $0, tolower($0)) }'

Leave a Comment

Your email address will not be published.