Comando AWK en Unix/Linux con ejemplos

Awk es un lenguaje de secuencias de comandos utilizado para manipular datos y generar informes. El lenguaje de programación de comandos awk no requiere compilación y permite al usuario usar variables, funciones numéricas, funciones de string y operadores lógicos. 

Awk es una utilidad que permite a un programador escribir programas pequeños pero efectivos en forma de declaraciones que definen patrones de texto que se buscarán en cada línea de un documento y la acción que se tomará cuando se encuentre una coincidencia dentro de un línea. Awk se utiliza principalmente para escanear y procesar patrones. Busca uno o más archivos para ver si contienen líneas que coincidan con los patrones especificados y luego realiza las acciones asociadas. 

Awk se abrevia a partir de los nombres de los desarrolladores: Aho, Weinberger y Kernighan. 

¿QUÉ PODEMOS HACER CON AWK? 

1. Operaciones AWK: 
(a) Escanea un archivo línea por línea 
(b) Divide cada línea de entrada en campos 
(c) Compara la línea/campos de entrada con el patrón 
(d) Realiza acciones en líneas coincidentes 

2. Útil para: 
(a) Transformar archivos de datos 
(b) Producir informes formateados 

3. Construcciones de programación: 
(a) Formato de líneas de salida 
(b) Operaciones aritméticas y de strings 
(c) Condicionales y bucles 

Sintaxis:

awk options 'selection _criteria {action }' input-file > output-file

Opciones:  

-f program-file : Reads the AWK program source from the file 
                  program-file, instead of from the 
                  first command line argument.
-F fs            : Use fs for the input field separator

Comandos de muestra 

Ejemplo: 

Considere el siguiente archivo de texto como el archivo de entrada para todos los casos a continuación: 

$cat > employee.txt 
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 

1. Comportamiento predeterminado de Awk: por defecto, Awk imprime cada línea de datos del archivo especificado.  

$ awk '{print}' employee.txt

Producción:  

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 

En el ejemplo anterior, no se da ningún patrón. Entonces las acciones son aplicables a todas las líneas. La acción imprimir sin ningún argumento imprime la línea completa de forma predeterminada, por lo que imprime todas las líneas del archivo sin fallar. 

2. Imprime las líneas que coinciden con el patrón dado. 

$ awk '/manager/ {print}' employee.txt 

Producción:  

ajay manager account 45000
varun manager sales 50000
amit manager account 47000 

En el ejemplo anterior, el comando awk imprime toda la línea que coincide con el ‘administrador’. 

3. Dividir una línea en campos: para cada registro, es decir, línea, el comando awk divide el registro delimitado por un carácter de espacio en blanco de forma predeterminada y lo almacena en las variables $n. Si la línea tiene 4 palabras, se almacenará en $1, $2, $3 y $4 respectivamente. Además, $0 representa la línea completa.  

$ awk '{print $1,$4}' employee.txt 

Producción:  

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 

En el ejemplo anterior, $1 y $4 representan los campos Nombre y Salario respectivamente. 

Variables incorporadas en Awk

Las variables integradas de Awk incluyen las variables de campo: $1, $2, $3, etc. ($0 es la línea completa), que dividen una línea de texto en palabras individuales o partes llamadas campos. 

  • NR: el comando NR mantiene un recuento actual del número de registros de entrada. Recuerde que los registros suelen ser líneas. El comando Awk realiza las declaraciones de patrón/acción una vez para cada registro en un archivo. 
  • NF: el comando NF mantiene un recuento del número de campos dentro del registro de entrada actual. 
  • FS: El comando FS contiene el carácter separador de campo que se usa para dividir campos en la línea de entrada. El valor predeterminado es «espacio en blanco», es decir, espacios y tabuladores. FS se puede reasignar a otro carácter (típicamente en BEGIN) para cambiar el separador de campo. 
  • RS: El comando RS almacena el carácter separador de registro actual. Dado que, de forma predeterminada, una línea de entrada es el registro de entrada, el carácter separador de registro predeterminado es una nueva línea. 
  • OFS: el comando OFS almacena el separador de campo de salida, que separa los campos cuando Awk los imprime. El valor predeterminado es un espacio en blanco. Siempre que print tenga varios parámetros separados por comas, imprimirá el valor de OFS entre cada parámetro. 
  • ORS: el comando ORS almacena el separador de registros de salida, que separa las líneas de salida cuando Awk las imprime. El valor predeterminado es un carácter de nueva línea. print genera automáticamente el contenido de ORS al final de lo que se le da para imprimir. 

Ejemplos: 

Uso de variables integradas de NR (Número de línea de visualización)  

$ awk '{print NR,$0}' employee.txt 

Producción:  

1 ajay manager account 45000
2 sunil clerk account 25000
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000
7 sunil peon sales 13000
8 satvik director purchase 80000 

En el ejemplo anterior, el comando awk con NR imprime todas las líneas junto con el número de línea. 

Uso de variables integradas de NF (Mostrar último campo)  

$ awk '{print $1,$NF}' employee.txt 

Producción:  

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 

En el ejemplo anterior, $1 representa el Nombre y $NF representa el Salario. Podemos obtener el Salario usando $NF, donde $NF representa el último campo. 

Otro uso de las variables integradas de NR (Línea de visualización de 3 a 6)  

$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt 

Producción:  

3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000 

Más ejemplos

Para el archivo de texto dado:  

$cat > geeksforgeeks.txt

A    B    C
Tarun    A12    1
Man    B6    2
Praveen    M42    3

1) Para imprimir el primer elemento junto con el número de fila (NR) separado con «-» de cada línea en geeksforgeeks.txt:  

$ awk '{print NR "- " $1 }' geeksforgeeks.txt 
1 - A
2 - Tarun
3 – Manav    
4 - Praveen

2) Para devolver la segunda columna/elemento de geeksforgeeks.txt: 

La pregunta debería ser: – Para devolver la segunda columna/elemento de geeksforgeeks.txt:

$ awk '{print $2}' geeksforgeeks.txt 
B
A12
B6
M42

3) Para imprimir cualquier línea no vacía si está presente  

$ awk 'NF < 0' geeksforgeeks.txt

aquí NF debe ser 0 no menor que y el usuario también debe imprimir el número de línea:

respuesta correcta: awk ‘NF == 0 {print NR}’ geeksforgeeks.txt

awk ‘NF <= 0 {imprimir NR}’ geeksforgeeks.txt

0

4) Para encontrar la longitud de la línea más larga presente en el archivo:  

$ awk '{ if (length($0) > max) max = length($0) } END { print max }' geeksforgeeks.txt
13

5) Para contar las líneas en un archivo:  

$ awk 'END { print NR }' geeksforgeeks.txt 
3

6) Líneas de impresión con más de 10 caracteres:  

$ awk 'length($0) > 10' geeksforgeeks.txt 
Tarun    A12    1
Praveen    M42    3

7) Para buscar/verificar cualquier string en cualquier columna específica:  

$ awk '{ if($3 == "B6") print $0;}' geeksforgeeks.txt

8) Para imprimir los cuadrados de los primeros números del 1 al n, diga 6:  

$ awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }' 
square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36

Este artículo es una contribución de Anshika Goyal y Praveen Negi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *