Uso de awk en Linux

awk es una herramienta potente y un lenguaje de programación diseñado para procesar y analizar archivos de texto.

Cada línea del archivo se procesa individualmente. Si la línea cumple con una condición específica, se ejecuta una acción definida; de lo contrario, la línea se omite.

Uso básico

Una instrucción típica de awk incluye una condición y una acción:

  • Condición: Se evalúa para determinar si se debe procesar la línea.
  • Acción: Define qué hacer con las líneas que cumplen la condición.

Procesar contenido de un archivo

awk 'condicion { accion }' nombre_archivo

Procesar salida de un comando

comando | awk 'condicion { accion }'

Parámetros comunes

F (delimitador de campos)

Por defecto, se usa el espacio como delimitadro de campos.


echo "aa bb  cc dd  ee ff" | awk '{print $1}'
# Salida: aa
echo "aa bb l cc dd l ee ff" | awk -F 'l' '{print $1}'
# Salida: aa bb 
echo "aa bb  cc : dd  ee ff" | awk -F ':' '{print $1}'
# Salida: aa bb  cc 

Variables

FS (delimitador de campos)

Por defecto, son espacio y tabulador.


echo "aa bb cc  dd" | awk '{ print $0 }'
# Salida: aa bb cc  dd
echo "aa bb cc  dd" | awk '{ print $1 }'
# Salida: aa
echo "aa bb cc  dd" | awk '{ print $2 }'
# Salida: bb

NF (número de campos en la línea actual)

$NF representa el último campo, $(NF-1) el penúltimo.


echo "aa bb cc  dd" | awk '{ print $NF }'
# Salida: dd
echo "aa bb cc  dd" | awk '{ print $(NF-1) }'
# Salida: cc

NR (número de la línea actual)

Imprime el número de línea junto con el contenido.


cat test.txt | awk '{print NR ") ", $0 }'
# Salida:
# 1 )  aa ss
# 2 )  dd ff
# 3 )  gg hh

FILENAME (nombre del archivo actual)


awk '{print FILENAME, NR ") ", $0}' test.txt
# Salida:
# test.txt 1 )  aa ss
# test.txt 2 )  dd ff
# test.txt 3 )  gg hh

Funciones

print y printf

print concatena los argumentos separados por espacios, mientras que printf permite formatear la salida.


awk '{ printf "%s ", $1 }'

Otras funciones

  • toupper() y tolower(): convertir a mayúsculas y minúsculas.
  • length(): obtener la lonigtud de una cadena.
  • substr(): extraer una subcadena.

Ejemplos


echo "aa bb  cc dd  ee ff" | awk '{print toupper($1)}'
# Salida: AA
echo "aa BB  cc dd  ee ff" | awk '{print tolower($2)}'
# Salida: bb
echo "aa BB  cc dd  ee ff" | awk '{print length($2)}'
# Salida: 2
echo "asdfghj" | awk '{print substr($1,2,3)}'
# Salida: sdf

Condiciones

Se pueden especificar condiciones para filtrar las líneas procesadas.

Expresiones regulares


cat exp.txt | awk '/stsvc/ {print $0}'
# Salida: todas las líneas que contienen "stsvc"
cat exp.txt | awk '/stsvc\/fms/ {print $0}'
# Salida: solo la línea que contiene "stsvc/fms"

Comparaciones booleanas


cat exp.txt | awk 'NR==2 {print $0}'
# Salida: la segunda línea
cat exp.txt | awk 'NR>4 {print $0}'
# Salida: líneas posteriores a la cuarta
cat exp.txt | awk 'NR%2==1 {print $0}'
# Salida: líneas impares

Instrucciones if


echo "aa ss dd" | awk '{ if($3 == "dd") print $0; else print "nothing"}'
# Salida: aa ss dd
echo "aa ss dds" | awk '{ if($3 == "dd") print $0; else print "nothing"}'
# Salida: nothing

Etiquetas: AWK linux text-processing bash-scripting

Publicado el 9-11 01:44