Comando Awk en Linux
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 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 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 utiliza 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, use 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.
El siguiente ejemplo 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. El siguiente ejemplo convertirá el archivo / etc / passwd en una 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.
El siguiente ejemplo utilizará la condición «si» para imprimir todas las líneas que contienen «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
El siguiente ejemplo 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
El siguiente ejemplo 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 utilizar 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. Por ejemplo, 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.