AWK es uno de los comandos más poderosos de Linux. Puede administrar datos y generar informes con el comando awk. También nos permite utilizar operaciones lógicas, variables, funciones de impresión y muchas más. AWK significa "Aho, Weinberger and Kernighan" y se utiliza principalmente para escanear y procesar patrones. Busca uno o más archivos para ver si contienen líneas que coincidan con el patrón especificado y luego realiza las acciones asociadas. Lee desde un archivo o desde su entrada y salida estándar a su salida estándar. Para cada línea, coincide con el patrón dado en el orden dado, si las coincidencias realizan la acción correspondiente.
Características
• Ve un archivo de texto como registros y campos
• Tiene variables, condicionales y bucles
• Tiene operadores aritméticos y de cadena
• Puede generar informes formateados
• Leer y editar texto de una cadena o archivo
En este tutorial, echaremos un vistazo al comando AWK Linux con ejemplos y veremos lo que puede hacer.
Sintaxis Basix de AWK
La sintaxis básica del comando AWK se muestra a continuación:
awk options program input-file
A continuación se muestra una breve explicación de cada opción:
• -F fs :se utiliza para especificar un separador de archivos.
• -f archivo:se usa para especificar un archivo que contiene un script awk.
• -v var=valor :se usa para declarar una variable.
Usaremos el siguiente archivo de texto como archivo de entrada para todos los ejemplos de este artículo:
cat > contents.txt
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
Ahora, verifiquemos el contenido del archivo llamado 'contents.txt' con el comando AWK:
awk '{print}' contents.txt
Esto imprimirá el contenido del archivo como se muestra a continuación:
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
En el ejemplo anterior, no se proporciona ningún patrón, por lo que imprimirá todo el archivo.
Ahora, imprima todas las líneas que coincidan con el patrón "ventas":
awk '/sales/ {print}' contents.txt
Esto imprimirá todas las líneas que contengan la palabra "ventas" como se muestra a continuación:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
Variables en AWK
AWK viene con algunas variables integradas que se utilizan para dividir una línea de texto en palabras individuales o partes llamadas campos. Algunos de ellos se muestran a continuación:
• $0 :Se utiliza para toda la línea.
• $1 :Usado para el primer campo.
• $2 :Usado para el segundo campo.
• $n :Se utiliza para el campo n.
• NR:se utiliza para especificar el número total de registros actuales.
• NF :Se utiliza para especificar el número total de campos en el registro.
• FS :Contiene el carácter separador de campo y se utiliza para dividir campos en la línea de entrada.
• RS :Almacena el carácter separador del registro actual.
• OFS:Almacena el separador de campos de salida y se usa para separar los campos cuando Awk los imprime.
• ORS:Almacena el separador de registros de salida y se usa para separar las líneas de salida cuando Awk las imprime.
Ahora, imprima los campos 1 y 3 del archivo contenidos.txt use la siguiente sintaxis:
awk '{print $1,$3}' contents.txt
Debería ver solo el primer y tercer campo del contenido del archivo.txt:
hitesh sales
jayesh account
vyom purchase
bhavesh sales
rajesh sales
niraj account
jay purchase
deep sales
Puede usar NR con el comando AWK para imprimir todas las líneas junto con el número de línea:
awk '{print NR,$0}' contents.txt
Salida:
1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
6 niraj clerk account 20000
7 jay peon purchase 23000
8 deep clerk sales 20000
Puede usar NF para mostrar el último campo y $1 para mostrar el primer campo:
awk '{print $1,$NF}' contents.txt
Esto imprimirá el primer y último campo del contenido del archivo.txt:
hitesh 30000
jayesh 25000
vyom 20000
bhavesh 30000
rajesh 40000
niraj 20000
jay 23000
deep 20000
Para imprimir el número de línea del 2 al 5, use la variable NR como se muestra a continuación:
awk 'NR==2, NR==5 {print NR,$0}' contents.txt
Salida:
2 jayesh director account 25000
3 vyom manager purchase 20000
4 bhavesh engineer sales 30000
5 rajesh directory sales 40000
Para contar el número de líneas en el contenido del archivo.txt usando el NR:
awk 'END { print NR } ' contents.txt
Debería ver el siguiente resultado:
8
BEGIN y END Blocks
También hay bloques BEGIN y END opcionales que pueden contener comandos para ejecutar antes y después del procesamiento del archivo, respectivamente. El bloque BEGIN se usa para realizar acciones antes de que se procesen los registros, mientras que el bloque END se usa para realizar acciones después de que se procesan los registros.
La sintaxis básica para usar los bloques BEGIN y END con el comando AWK se muestra a continuación:
awk 'BEGIN { action; } /search/ { action; } END { action; }' input_file
Puede imprimir información sobre los campos que está imprimiendo con los bloques BEGIN y END.
El siguiente ejemplo imprimirá el mensaje antes y después de procesar el segundo campo de cada registro en el contenido del archivo.txt:
awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt
Salida:
Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.
También puede usar los bloques BEGIN y END para transformar los datos del archivo y convertirlos en una tabla. El siguiente ejemplo convertirá el archivo /etc/passwd en una tabla:
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; } {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;} END { print "---------\nFile Complete" }' /etc/passwd
Salida:
User UID GID Home Shell
--------------
root 0 0 /root /bin/bash
daemon 1 1 /usr/sbin /usr/sbin/nologin
bin 2 2 /bin /usr/sbin/nologin
sys 3 3 /dev /usr/sbin/nologin
sync 4 65534 /bin /bin/sync
games 5 60 /usr/games /usr/sbin/nologin
man 6 12 /var/cache/man /usr/sbin/nologin
lp 7 7 /var/spool/lpd /usr/sbin/nologin
mail 8 8 /var/mail /usr/sbin/nologin
news 9 9 /var/spool/news /usr/sbin/nologin
uucp 10 10 /var/spool/uucp /usr/sbin/nologin
proxy 13 13 /bin /usr/sbin/nologin
www-data 33 33 /var/www /usr/sbin/nologin
---------
File Complete
Búsqueda condicional
El comando AWK también admite varias declaraciones condicionales, incluidas if, while loop, for loop y muchas más. Esto lo ayudará a buscar líneas que coincidan con una condición específica.
El siguiente ejemplo utilizará la condición "si" para imprimir todas las líneas que contengan "ventas" en el tercer campo:
awk '{ if ($3 ~ /sales/) print}' contents.txt
Salida:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
El siguiente ejemplo usará el bucle "for" para imprimir los tres primeros campos de cada registro, uno por línea.
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
Salida:
hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales
El siguiente ejemplo utilizará el bucle "while" para imprimir los dos primeros campos de cada registro, uno por línea.
awk '{ i = 1; while ( i <= 2 ) { print $i i++ } }' contents.txt
Salida:
hitesh1
engineer2
jayesh1
director2
vyom1
manager2
bhavesh1
engineer2
rajesh1
directory2
niraj1
clerk2
jay1
peon2
deep1
clerk2
Procesamiento de resultados de otros comandos
También puede usar el comando AWK para analizar la salida del otro comando en lugar de especificar un nombre de archivo. El comando "ip a" imprime la información sobre la IP del sistema, la dirección Mac y otra información relacionada con la red como se muestra a continuación:
ip a s wlan0
Salida:
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:bb:58:9c:f5:55 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.3/28 brd 172.20.10.15 scope global wlan0
valid_lft forever preferred_lft forever
inet6 2401:4900:1d71:ef26:8846:95b2:4ca8:aa7d/64 scope global temporary dynamic
valid_lft 600574sec preferred_lft 81574sec
inet6 2401:4900:1d71:ef26:4ebb:58ff:fe9c:f555/64 scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::4ebb:58ff:fe9c:f555/64 scope link
valid_lft forever preferred_lft forever
Ahora, puede usar el comando AWK para imprimir solo la dirección IP del sistema como se muestra a continuación:
ip a s wlan0 | awk -F '[\/ ]+' '/inet / {print $3}
Debería ver el siguiente resultado:
172.20.10.3
Ejemplos de avance de comandos AWK
Ejemplo 1: El comando AWK le permite imprimir las líneas con un número específico de caracteres. Por ejemplo, imprima líneas con más de 27 caracteres, use el siguiente comando:
awk 'length($0) > 27' contents.txt
Salida:
jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000
Ejemplo 2: Revisa el cubo del número dado
Para imprimir el cubo del número dado hasta 5, ejecuta el siguiente comando:
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
Salida:
Cube of 1 is 1
Cube of 2 is 8
Cube of 3 is 27
Cube of 4 is 64
Cube of 5 is 125
Ejemplo 3: Cuente el número de líneas en el archivo especificado
Puede verificar el número de líneas en el archivo especificado e imprimirlo usando el siguiente comando:
awk 'END { print NR }' contents.txt
Salida:
8
Ejemplo 4: Encuentre la línea más larga en el archivo dado e imprima el carácter
Puede encontrar la línea más larga en el archivo dado e imprimir el carácter de esa línea usando el siguiente comando:
awk '{ if (length($0) > max) max = length($0) } END { print max }' contents.txt
Salida
29
Ejemplo 5: Ordenar la primera columna de un archivo dado
Para ordenar e imprimir la primera columna del contenido del archivo.txt, ejecute el siguiente comando:
awk -F: '{ print $1 }' contents.txt | sort
Salida:
bhavesh engineer sales 30000
deep clerk sales 20000
hitesh engineer sales 30000
jayesh director account 25000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
vyom manager purchase 20000
Ejemplo 6: Imprime las líneas pares
Para imprimir solo líneas pares en el contenido del archivo.txt, ejecute el siguiente comando:
awk 'NR % 2 == 0' contents.txt
Salida:
jayesh director account 25000
bhavesh engineer sales 30000
niraj clerk account 20000
deep clerk sales 20000
Ejemplo 7: Cambiar el separador de campo
Puede cambiar el separador de campo de espacio a | e imprímelo con el siguiente comando:
awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt
Salida:
hitesh|engineer|sales|30000
jayesh|director|account|25000
vyom|manager|purchase|20000
bhavesh|engineer|sales|30000
rajesh|directory|sales|40000
niraj|clerk|account|20000
jay|peon|purchase|23000
deep|clerk|sales|20000
Conclusión
En este tutorial, aprendió a usar el comando AWK para hacer coincidir los patrones especificados y luego realizar las acciones asociadas. Espero que tenga una idea clara de cómo usar el comando AWK para manipular, formatear e imprimir archivos de texto de forma selectiva.