GNU/Linux >> Tutoriales Linux >  >> Linux

Comando Awk en Linux

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.


Linux
  1. comando linux mv

  2. Linux du comando

  3. Comando IP de Linux

  4. Comando cd de linux

  5. Ejemplos de comandos awk en Linux

Linux qué comando

Comando W en Linux

Al mando en Linux

Comando awk de Linux con 10 ejemplos

Comando Df en Linux

Comando AWK en Linux/Unix