Útil AWK One-Liners para tener a mano
Awk es una herramienta muy poderosa y útil diseñada para el procesamiento de texto avanzado. Busca y escanea un archivo línea por línea, divide cada línea de entrada en campos, compara la línea o los campos de entrada con el patrón y realiza una acción en las líneas coincidentes. Generalmente, se utiliza para transformar archivos de datos y producir informes formateados.
En este tutorial, mostraremos algunos ejemplos de una línea de awk avanzados y útiles que serán útiles para realizar las operaciones del día a día.
Conversión de texto
En esta sección, aprenderemos cómo usar las funciones sub y gsub con el comando awk para eliminar pestañas y espacios en el archivo.
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
Eliminar todas las líneas en blanco de un archivo
Puede usar el comando awk con una variable NF especial para eliminar todas las líneas en blanco del archivo.
Por ejemplo, elimine todas las líneas en blanco del archivo contents.txt y ejecute el siguiente comando:
awk NF contents.txt
Debería ver el siguiente resultado:
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
También puede realizar lo mismo con el siguiente comando:
awk '/./' /contents.txt
Elimine los espacios en blanco iniciales y las pestañas del principio de cada línea
Puede usar el comando awk para buscar uno o más espacios o pestañas al principio del archivo y eliminarlos.
Ejecute el siguiente comando para eliminar los espacios en blanco iniciales del archivo denominado contents.txt
awk '{ sub(/^[ t]+/, ""); print }' contents.txt
Debería ver el siguiente resultado:
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
Elimina los espacios en blanco finales y las pestañas del final de cada línea
Puede encontrar uno o más espacios o pestañas al final de cada línea en el archivo y eliminarlos.
Ejecute el siguiente comando para eliminar el espacio y la pestaña al final de cada línea en el archivo contents.txt
awk '{ sub(/[ t]+$/, ""); print }' contents.txt
Debería obtener el siguiente resultado:
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
Eliminar los espacios en blanco iniciales y finales de cada línea
También puede eliminar los espacios en blanco iniciales y finales de cada línea usando el comando único como se muestra a continuación:
awk '{ gsub(/^[ t]+|[ t]+$/, ""); print }' contents.txt
Debería obtener el siguiente resultado:
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
Orden inverso de líneas
Esta es una línea de awk muy popular y muy útil que registra todas las líneas en una matriz y las organiza en orden inverso.
Ejecute este awk de una sola línea para organizar todas las líneas en orden inverso en el archivo contents.txt:
awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' contents.txt
Debería obtener el siguiente resultado:
deep clerk sales 20000 jay peon purchase 23000 niraj clerk account 20000 rajesh directory sales 40000 bhavesh engineer sales 30000 vyom manager purchase 20000 jayesh director account 25000 hitesh engineer sales 30000
Orden inverso de campos en cada línea
Puede usar el comando awk con la variable NF para organizar cada campo en cada línea en orden inverso.
awk '{ for (i=NF; i>0; i--) printf("%s ", $i); printf ("n") }' contents.txt
Debería obtener el siguiente resultado:
30000 sales engineer hitesh 25000 account director jayesh 20000 purchase manager vyom 30000 sales engineer bhavesh 40000 sales directory rajesh 20000 account clerk niraj 23000 purchase peon jay 20000 sales clerk deep
Eliminar líneas duplicadas consecutivas
Para eliminar líneas duplicadas consecutivas del archivo, ejecute el siguiente comando:
awk 'a != $0; { a = $0 }' contents.txt
Eliminar líneas duplicadas no consecutivas
Para eliminar líneas duplicadas no consecutivas del archivo, ejecute el siguiente comando:
awk '!a[$0]++' contents.txt
Numeración y cálculos
En esta sección, aprenderemos cómo usar las variables FN y NR con el comando awk. Se utiliza para procesamiento e informes como Número de registros, número de campos.
Numere todas las líneas de un archivo
Puede numerar todas las líneas de un archivo específico con el siguiente comando:
awk '{ print NR "t" $0 }' contents.txt
Debería obtener el siguiente resultado:
1 hitesh engineer sales 30000 2 jayesh director account 25000 3 vyom manager purchase 20000 4 5 bhavesh engineer sales 30000 6 rajesh directory sales 40000 7 niraj clerk account 20000 8 jay peon purchase 23000 9 deep clerk sales 20000
Líneas numéricas de una manera elegante
Para numerar todas las líneas de un archivo específico en un formato elegante, ejecute el siguiente comando:
awk '{ printf("%5d : %sn", NR, $0) }' contents.txt
Debería obtener el siguiente resultado:
1 : hitesh engineer sales 30000 2 : jayesh director account 25000 3 : vyom manager purchase 20000 4 : 5 : bhavesh engineer sales 30000 6 : rajesh directory sales 40000 7 : niraj clerk account 20000 8 : jay peon purchase 23000 9 : deep clerk sales 20000
Numere solo las líneas que no están en blanco en los archivos
Puede numerar solo las líneas no vacías con el siguiente comando:
awk 'NF { $0=++a " :" $0 }; { print }' contents.txt
Debería obtener el siguiente resultado:
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
Imprime el número de líneas que contienen una cadena específica
Puede imprimir el número total de líneas que tiene la palabra ingeniero con el siguiente comando:
awk '/engineer/{n++}; END {print n+0}' contents.txt
Debería obtener el siguiente resultado:
2
Expresiones regulares
En esta sección, le mostraremos cómo usar expresiones regulares con el comando awk para filtrar texto o cadenas en archivos.
Imprimir líneas que coincidan con la cadena especificada
Para imprimir todas las líneas que coincidan con el ingeniero de cadenas en el archivo contents.txt, ejecute el siguiente comando:
awk '/engineer/' contents.txt
Debería obtener el siguiente resultado:
hitesh engineer sales 30000 bhavesh engineer sales 30000
Imprimir líneas que no coinciden con la cadena especificada
Para imprimir todas las líneas que no coinciden con la cadena ‘jayesh’ en el archivo contents.txt, ejecute el siguiente comando:
awk '!/jayesh/' contents.txt
Debería obtener el siguiente resultado:
hitesh engineer sales 30000 vyom manager purchase 20000 bhavesh engineer sales 30000 rajesh directory sales 40000 niraj clerk account 20000 jay peon purchase 23000 deep clerk sales 20000
Imprimir línea antes de la cadena correspondiente
Para imprimir la línea antes de la cadena correspondiente ‘rajesh’, ejecute el siguiente comando:
awk '/rajesh/{print x};{x=$0}' contents.txt
Debería obtener el siguiente resultado:
bhavesh engineer sales 30000
Imprimir línea después de la cadena correspondiente
Para imprimir la línea después de la cadena correspondiente ‘rajesh’, ejecute el siguiente comando:
awk '/account/{getline; print}' contents.txt
Debería obtener el siguiente resultado:
vyom manager purchase 20000 jay peon purchase 23000
Sustitución
En esta sección, le mostraremos cómo usar el comando awk para buscar una cadena específica en un archivo y reemplazarla con la cadena deseada.
Sustituir cadena por otra
Para sustituir una cadena ‘ingeniero’ por ‘doctor’ en el archivo contents.txt, ejecute el siguiente comando:
awk '{gsub(/engineer/, "doctor")};{print}' contents.txt
Debería obtener el siguiente resultado:
hitesh doctor sales 30000 jayesh director account 25000 vyom manager purchase 20000 bhavesh doctor sales 30000 rajesh directory sales 40000 niraj clerk account 20000 jay peon purchase 23000 deep clerk sales 20000
Busque la cadena ‘jayesh’, ‘hitesh’ o ‘bhavesh’ y reemplácelas con la cadena ‘mahesh’, ejecute el siguiente comando:
awk '{gsub(/jayesh|hitesh|bhavesh/,"mahesh");print}' contents.txt
Debería obtener el siguiente resultado:
mahesh engineer sales 30000 mahesh director account 25000 vyom manager purchase 20000 mahesh engineer sales 30000 rajesh directory sales 40000 niraj clerk account 20000 jay peon purchase 23000 deep clerk sales 20000
Encuentre espacio libre en disco con el nombre del dispositivo
Puede usar el comando awk con df para buscar y mostrar solo el nombre del dispositivo y el espacio utilizado por cada dispositivo.
Para hacerlo, ejecute el siguiente comando:
df -h | awk '{print $1, $4}'
Debería obtener el siguiente resultado:
Filesystem Avail /dev/sda1 235G none 4.0K udev 1.9G tmpfs 377M none 5.0M none 1.5G none 100M /dev/sda5 135G /dev/loop0 0 /dev/loop1 0 /dev/loop2 0 /dev/loop4 0
Encuentra el número de conexiones abiertas por ip
Esta frase de awk es muy útil si cree que su servidor está siendo atacado. Imprime una lista de conexiones abiertas a su servidor y las ordena por cantidad.
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
Debería obtener la lista de todas las conexiones abiertas a su servidor por cantidad:
18 103.132.192.30 12 104.18.12.5 11 104.18.5.23 9 104.244.42.3 1 104.244.42.5 1 127.0.0.1
Conclusión
Como puede ver, aprendimos sobre el comando awk de una sola línea con ejemplos prácticos. Espero que esto te ayude a realizar tus tareas diarias.