LINUX

Útil AWK One-Liners para tener a mano

útiles frases cortas de awk

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.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar