Aprende leyendo en orden

awk — Extracción de campos

Practica awk: '{print $1}' extrae una columna, $NF toma la última columna, -F',' cambia el separador a coma, NR y NF, y /error/{print $2} procesa solo las líneas que coinciden — ilustrado y en una terminal del navegador.

Extraer columnas — $1 / $NF / -F

awk es un comando que divide cada línea en columnas (campos) por espacios y te permite procesarlas campo a campo. Escribir awk '{print $1}' extrae e imprime solo la primera columna de cada línea. Dentro de {} escribes la acción que se ejecuta en cada línea (aquí, print). $1 es la primera columna, $2 es la segunda y $0 se refiere a la línea completa.

$NF es una forma especial de referirse a la última columna. NF es una variable que contiene el número de campos de una línea, por lo que $NF te da la columna final de esa línea. Aunque el número de columnas varíe de línea en línea, siempre obtienes la última. Cuando el separador no es un espacio, especifícalo con -F, como en -F','. Lo más seguro es poner el separador entre comillas (-F',').

printf 'alice 30 tokyo\nbob 25 osaka\n' > users.txt   # crear el material
awk '{print $1}' users.txt                              # columna 1: alice y bob
awk '{print $2}' users.txt                              # columna 2: 30 y 25
awk '{print $NF}' users.txt                             # última columna: tokyo y osaka
printf 'alice,30\nbob,25\n' > csv.txt                  # material separado por comas
awk -F',' '{print $1}' csv.txt                          # separador coma, columna 1
Cómo cuenta columnas awk
alice30tokyo$1 = alice$2 = 30$NF = tokyo (último)
$1 es la primera columna y $NF apunta a la última columna de esa línea.
FormaSignificadoEjemplo
$1Extraer la columna 1awk '{print $1}' users.txt
$2Extraer la columna 2awk '{print $2}' users.txt
$NFExtraer la última columnaawk '{print $NF}' users.txt
$0Extraer la línea completaawk '{print $0}' users.txt
-F','Cambiar el separador a comaawk -F',' '{print $1}' csv.txt
NRNúmero de línea actualawk '{print NR, $0}' nf.txt
NFNúmero de campos de la líneaawk '{print NF}' nf.txt
/pat/{print $1}Imprimir columna 1 de líneas que coinciden con patawk '/error/{print $1}' log.txt

① Crea el material separado por espacios con printf 'alice 30 tokyo\nbob 25 osaka\n' > users.txt.

② Comprueba el contenido con cat users.txt.

③ Usa awk para imprimir solo la primera columna de cada línea.

④ Luego usa awk '{print $2}' users.txt para imprimir la segunda columna de cada línea.

⑤ A continuación usa la forma que se refiere a la última columna para imprimir la columna final de cada línea.

⑥ Crea el material separado por comas con printf 'alice,30\nbob,25\n' > csv.txt y luego imprime la columna 1 usando la opción que especifica el separador. (Si lo ejecutas correctamente, aparecerá una explicación.)

Linux console
0 / 7 completado(s)
Loading Linux Terminal...

Número de línea y conteo de campos — NR / NF

NR es una variable integrada que contiene el número de la línea que se está procesando y NF contiene el número de campos de esa línea. Escribir awk '{print NR, $0}' imprime cada línea completa con su número de línea delante. Con awk '{print NF}' puedes ver en cuántas columnas se dividió cada línea.

printf 'red\ngreen blue\n' > nf.txt   # crear el material
awk '{print NR, $0}' nf.txt             # 1 red / 2 green blue
awk '{print NF}' nf.txt                 # línea 1 tiene 1 columna, línea 2 tiene 2

① Crea dos líneas con diferente número de campos con printf 'red\ngreen blue\n' > nf.txt.

② Con awk, combina la variable del número de línea con la línea completa para imprimir cada línea con su número delante.

③ Luego imprime la variable del número de campos y comprueba que la línea 1 y la línea 2 tienen recuentos distintos.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

Procesar solo las líneas que coinciden — /pat/{print ...}

Cuando escribes un patrón antes del programa, awk aplica ese programa solo a las líneas que coinciden. awk '/error/{print $1}' imprime la columna 1 solo en las líneas que contienen error. Donde grep muestra la línea completa, awk puede extraer solo las columnas que necesitas de las líneas que coinciden.

Procesar solo las líneas que coinciden con un patrón
awk '{print $1}' fcolumna 1 de cada líneaawk '/error/{print $1}' fcolumna 1 solode líneas error
Un patrón antes del programa limita las líneas que se procesan.
printf 'error disk\ninfo start\nerror cpu\n' > log.txt   # crear el material
awk '/error/{print $2}' log.txt                            # columna 2 de líneas error: disk y cpu

① Crea un archivo de material con printf 'error disk\ninfo start\nerror cpu\n' > log.txt.

② Con awk, escribe un patrón antes del programa e imprime la columna 2 solo en las líneas que contienen error.

③ Comprueba que las palabras impresas son solo las columnas extraídas de las líneas con error.

④ Ejecuta también grep error log.txt y compara: grep imprime la línea completa mientras que awk imprime solo la columna 2.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Qué produce awk '{print $1}' f?

Pregunta 2¿Qué opción añades para que awk use una coma como separador?

Pregunta 3¿Qué líneas procesa awk '/error/{print $1}' f?