AWK es uno de los comandos más poderosos de Linux. Puede administrar datos y generar informes usando el comando awk. También nos permite utilizar operaciones lógicas, variables, funciones de impresión y muchas más. AWK significa “Aho, Weinberger y Kernighan” y se utiliza principalmente para escanear y procesar patrones. Busca uno o más archivos para ver si contienen líneas que coinciden con el patrón especificado y luego realiza las acciones asociadas. Lee de un archivo o de 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
• Visualiza 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, veremos el comando AWK Linux con ejemplos y veremos qué 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 utiliza para especificar un archivo que contiene un script awk.
• -v var = valor: se utiliza 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 lo de arriba example, 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 contienen 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: se utiliza para el primer campo.
• $ 2: se utiliza para el segundo campo.
• $ n: se utiliza para el enésimo campo.
• 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 usa para dividir campos en la línea de entrada.
• RS: Almacena el carácter separador de registro actual.
• OFS: Almacena el separador de campo de salida y se usa para separar los campos cuando Awk los imprime.
• ORS: Almacena el separador de registros de salida y se utiliza para separar las líneas de salida cuando Awk las imprime.
Ahora, imprima los campos no 1 y 3 del archivo contents.txt use la siguiente sintaxis:
awk '{print $1,$3}' contents.txt
Debería ver solo el primer y tercer campo del archivo contents.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
Producción:
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 archivo contents.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, utilice la variable NR como se muestra a continuación:
awk 'NR==2, NR==5 {print NR,$0}' contents.txt
Producción:
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 archivo contents.txt usando el NR:
awk 'END { print NR } ' contents.txt
Debería ver el siguiente resultado:
8
Bloques BEGIN y END
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.
La siguiente example imprimirá el mensaje antes y después de procesar el segundo campo de cada registro en el archivo contents.txt:
awk 'BEGIN { print "Start Process." }; { print $2 }; END { print "End Process." }' contents.txt
Producción:
Start Process.
engineer
director
manager
engineer
directory
clerk
peon
clerk
End Process.
También puede utilizar los bloques BEGIN y END para transformar los datos del archivo y convertirlos en una tabla. La siguiente example convertirá el archivo / etc / passwd en la tabla:
awk 'BEGIN { FS=":"; print "UserttUIDttGIDttHomettShelln--------------"; } {print $1,"tt",$3,"tt",$4,"tt",$6,"tt",$7;} END { print "---------nFile Complete" }' /etc/passwd
Producción:
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 le ayudará a buscar líneas que coincidan con una condición específica.
La siguiente example 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
Producción:
hitesh engineer sales 30000
bhavesh engineer sales 30000
rajesh directory sales 40000
deep clerk sales 20000
La siguiente example utilizará el ciclo “for” para imprimir los primeros tres campos de cada registro, uno por línea.
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
Producción:
hitesh
engineer
sales
jayesh
director
account
vyom
manager
purchase
bhavesh
engineer
sales
rajesh
directory
sales
niraj
clerk
account
jay
peon
purchase
deep
clerk
sales
La siguiente example utilizará el ciclo “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
Producción:
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
Producción:
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 AWK Command Advance
Ejemplo 1: El comando AWK le permite imprimir las líneas con un recuento específico de caracteres. Para example, imprima líneas con más de 27 caracteres, use el siguiente comando:
awk 'length($0) > 27' contents.txt
Producción:
jayesh director account 25000
bhavesh engineer sales 30000
rajesh directory sales 40000
Ejemplo 2: Verifica el cubo del número dado
Para imprimir el cubo del número dado hasta el 5, ejecute el siguiente comando:
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
Producción:
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
Producción:
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
Producción
29
Ejemplo 5: Ordenar la primera columna de un archivo dado
Para ordenar e imprimir la primera columna del archivo contents.txt, ejecute el siguiente comando:
awk -F: '{ print $1 }' contents.txt | sort
Producción:
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 archivo contents.txt, ejecute el siguiente comando:
awk 'NR % 2 == 0' contents.txt
Producción:
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 archivado de espacio a | e imprimirlo con el siguiente comando:
awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4}' contents.txt
Producció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
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 selectivamente archivos de texto.