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