AWK – Lenguaje de programación entornos UNIX y LINUX.-

AWK es un lenguaje de programación cuya potencia estriba en la capacidad de obtener grandes resultados con programas de unas pocas lineas. Está especialmente diseñado para leer y procesar archivos de texto por lo que resulta muy útil su uso combinado con utras utilidades del sistema operativo.
Para ejecutar un programa escrito en AWK es necesario llamar al programa intérprete del lenguaje (awk) utilizando como parámetros un programa, escrito entre comillas simples, y uno o varios ficheros para procesar de acuerdo con ese programa.
AWKasume que va a tener que procesar un flujo de datos (entrada estandar, fichero de texto, tubería) y que este flujo está medianamente estructurado en registros (lineas) y campos (columnas).
Por tanto sabe que tiene que leer cada una de sus lineas como si fuese un registro, separar ese registro en campos, hacer lo que se le ordene con esos campos y finalmente producir un flujo de salida. Así que el programador apenas tiene que introducir ningún tipo de instrucción al respecto en el código.Algunos ejemplos que pueden ser de utilidad :

1.- Mostrar los nombres de login (correspondientes al primer campo o campo1) de TODOS los usuarios del archivo de contraseñas /etc/passwd. 
awk -F: '{ print $1}' /etc/passwd 

2.- Mostrar los nombres de login, directorios propios y shell de TODOS los usuarios del archivo de contraseñas /etc/passwd (correspondientes a los campos 1, 6 y 7). Mostrarlos separados por "--". 
awk -F: -v OFS=" -- " '{ print $1,$6,$7 }' /etc/passwd 
otra forma: 
awk -F: '{ print $1," -- ",$6," -- ",$7 }' /etc/passwd 

3.- Mostrar los nombres de login y directorios propios (correspondientes a los campos 1 y 6) del archivo de contraseñas /etc/passwd de aquellos usuarios cuyo nombre de login empieza con "a". 
awk -F: '/^a/ print $1,$6 }' /etc/passwd 
otra forma: 
awk -F: '{ if ($1~/^a/) print $1,$6 }' /etc/passwd
y otra más: 
awk -F: '$1~/^a/ { print $1,$6 }' /etc/passwd 

4.- Mostrar solo los registros de usuarios del archivo de contraseñas/etc/passwd que utilizan el shell csh. 
awk -F : '$7~"csh" { print $0 }' /etc/passwd 

5.- Mostrar solo los registros de usuarios sin privilegios (usuarios con UID >=500) del sistema. 
awk -F : '$3>=500 {print $0}' /etc/passwd 

6.- Mostrar los registros de usuarios del archivo de contraseñas /etc/passwd para aquellos usuarios cuyo nombre de login empieza con "a" y que utilizan el Shell Bash. 
awk -F : '$1~/^a/ && $7~"bash" {print $0}' /etc/passwd 
otra forma: 
awk -F : '$1~/^a/ && $7=="/bin/bash" {print $0}' /etc/passwd 
Para los siguientes ejercicios considere un archivo delimitado, llamadopersonas.txt, con el siguiente formato: 
nombre:apellido:número 
un registro en este archivo tendría, por ejemplo, la siguiente forma: 
Juan:Perez:25 

7.- Mostrar TODOS los registros cuyo nombre sea “Francisco” del archivo 
personas.txt. 
awk  –F: '/^Francisco/ { print $0 }' personas.txt 
otra forma: 
awk  –F: '{ if ($1=="Francisco") print $0}' personas.txt 
y otra más: 
awk –F: '{ $1=="Francisco" { print $0 }' personas.txt 

8.- Mostrar TODOS los registros cuyo apellido sea “Pérez” del archivo personas.txt. 
awk  –F: '/Perez/ { print $0 }' personas.txt 
otra forma: 
awk  –F: '{ if ($2=="Perez") print $0}' personas.txt 
y otra más: 
awk  –F: '{ $2=="Perez" { print $0 }' personas.txt 

9.- Imprimir la cantidad de registros del archivo personas.txt cuyo nombre sea “Juan”. 
awk  –F: '{ if ($1=="Juan") x++} END { print x}' personas.txt 
otra forma: 
awk  –F: '$1=="Juan" { x++ } END { print x }' personas.txt 
y otra más: 
awk  –F: 'BEGIN {x=0} { if ($1=="Juan") x++ }; END { print x }'personas.txt 

10.- Imprimir TODOS los registros del archivo personas.txt con su correspondiente número de registro. 
awk  –F: '{ print NR,$0 }' personas.txt 
AWK es extremadamente útil a la hora de procesar búsquedas en archivos y flujos de datos, dentro de estos últimos podemos considerar la salida (o el output) de comandos como el ls, who, date, ps, entre muchísimos más. Es importante recordar aquí, que el delimitador por defecto de AWK es el “espacio en blanco”.

11.- Mostrar los usuarios actualmente conectados al sistema y su hora de conexión. 
who | awk '{ print $1,$4 }' 

12.- Mostrar la fecha en formato día mes año. 
date | awk '{ print $3,$2,$6 }' 

13.- Mostrar la hora del sistema. 
date | awk '{ print $4 }' 

14.- Mostrar TODOS los archivos del directorio actual cuyo nombre empieza con"a". 
ls | awk '/^a/' 
otra forma: 
ls | awk '$1~/^k/ { print $1 }' 

15.- Mostrar los permisos ($1) y nombre de los archivos ($9) del directorio actual. 
ls -l | awk '{ print $1,$9 }' 

16.- Mostrar los campos del 1 al 5 del listado que proporciona ls –l. 
ls -l | awk '{ for (x=1; x<=5; x++) { printf "%s ", $x } printf "\n" }' 

17.- Mostrar el listado de todos los archivos vacíos del directorio actual. 
ls -l | awk '$5==0' 
otra forma: 
ls | awk '$5==0 { print $9 }'

18.- Mostrar el listado de todos los archivos NO vacíos del directorio actual. 
ls -l | awk '$5>0' 

19.- Listar el contenido de los archivos del directorio actual cuyo nombre empieza con "a". 
ls | awk '{ /^a/ { print $1 }' | awk '{ print "cat "$1 }' | bash 
otra forma: 
ls | awk '{ if ($1~/^a/) print $1 }' | awk '{ print "cat "$1 }' | bash 

20.- Sumar los tamaños de todos los archivos del directorio actual 
ls -l | awk '{ sum+=$5} END {print sum}' 

21.- Sumar los tamaños de todos los archivos del directorio actual pertenecientes al usuario alumno 
ls -l | awk '{ if ($3~"alumno") sum+=$5} END {print sum}' 
otra forma: 
ls -l | awk '$3=="alumno" { sum+=$5} END {print sum}' 

22.- Mostrar un listado de TODAS las carpetas o sub-directorios del directorio actual 
ls -l ¦ awk '/^d/ { print $1," ",$9 }' 
otra forma: 
ls -l ¦ awk '$1~/^d/ { print $1," ",$9 }' 

23.- Borrar solo los archivos del directorio actual 
ls -l ¦ grep -v drwx ¦ awk '{ print "rm "$9 }' ¦ bash 
otra forma: 
ls -l ¦ awk '$1!~/^drwx/ { print $9 }' ¦ xargs rm

24.- Mostrar el listado de archivos del directorio actual en mayúsculas 
ls ¦ awk '{ print toupper($1) }' 
Los archivos de log de RHEL, y de prácticamente TODOS los Linux, se encuentran en el directorio /var/log. Algunos de estos archivos son archivos de texto y por lo tanto pueden ser consultados directamente con AWK (o grep/sed),otros, en cambio, son archivos binarios y se consultan a través de un comando Linux, para luego procesar la salida de dicho comando con AWK.25.- Mostrar las características de la CPU de la máquina 
dmesg | awk '/CPU/ {print $0}' 

26.- Listar el nombre de los usuarios que NUNCA se han conectado al sistema 
lastlog | awk '/**Nunca ha entrado**/ { print $1}' 

27.- Mostrar las líneas con Invalid user y el total de ellas del archivo de log/var/log/secure 
awk '/Invalid user/ { count++; print $0 } END { print count }'/var/log/secure 

28.- Mostrar los ingresos al sistema entre el 1 y 5 de Junio 
last | awk '$5 == "Jun" && ($6 >= 1 && $6 <= 5)' 

29.- Mostrar las ejecuciones del comando su 
awk '/su:/ print}' /var/log/auth.log

30.- Mostrar todos los intentos de conexión al sistema fallidos 
awk '/FAILED LOGIN/ {print $0}' /var/log/secure 

31.- Matar TODOS los procesos de un determinado tipo (en este ejemplo vamos a “matar” el proceso asociado a la ejecución del editor vi) 
ps ax | grep vi | grep –v grep | awk '{ print "kill -9 "$1}' | bash 

32.- Mostrar la cantidad de usuarios en el sistema en este instante 
w | awk 'BEGIN { cont=0 } NR>2 { cont++ } END { print cont} 
otra forma: 
w | awk 'NR>2 { cont++ } END { print cont}

33.-Visualiza los campos primero (dia) segundo (mes) y sexto (año). Lo ejecutamosde la siguiente manera.
date | awk '{print ($3"-"$2"-"$6)}'

34. Visualizar las lineas del archivo /etc/passwd que comienzan con el caracter 'd'awk '/^d/' /etc/passwd3. Visualizar los directorios cuyo nombre empieza con letra mayuscula. Selecionaremos las lineasque visualiza el ls -l que empiezan con la letra d y cuyooctavo campo comienza con letra mayuscula.
ls -l /etc/ | awk '$1 ~ /^d/ && $8 ~ /[A-Z]/'

35. Imprimir y ordenar los nombres de ingreso de todos los usuarios:
who | awk '{ FS = ":" }; { print $1 | "sort" }'
cat /etc/passwd | awk '{ nlines++ } { print nlines }'Sed

36. Creemos un archivo llamado 'ensayo' con el siguiente contenido:Las ciencias facticas abordanla realidad de manera particularcada una se ocupa de investigarun campo de la realidad y juntasestudian la realidad en su totalidad

37. Imprimir la linea numero 4 del archivo especificado:
sed 4p ensayo
38.Ahora se visualizara la linea 4, pero sin ser duplicada:
sed -n 4p ensayo

39. Selecciona un rango de direcciones e imprimir las lineas implicadas:
sed -n 2,3 ensayo

40. Realiza una sustitucion de una(s) palabra(s) en todo el archivo
sed 's/abordan/abarcan/g' ensayo

41. Sustituir las vocales minusculas por las mayusculas
sed 'y/[aeiou]/[AEIOU]/' ensayoGrep

42. Veamos las lineas que concuerden con el patron dado (ignorando mayusculasy minusculas) 
del archivo xorg.confgrep -i 'xorg' /etc/X11/xorg.conf

43. Imprima las lineas del archivo que empiecen por 'daemon':
grep '^daemon' /etc/passwd

44. Veamos los archivos que empiecen por 'root' del directorio /etc/
grep -l root /etc/*

45. En el siguiente ejemplo buscaremos las lineas que contengan cuatro caracteres
grep "^....$" /etc/fstab

46. Visualicemos las lineas que no concuerden con el patron dado
grep -v 'bash' /etc/passwd | lessFind

47. Encuentre en su directorio personal los directorios que contengan lospermisos en 755
find ~ -perm 755 -print

48. Encuentre en directorio /dev los archivos tipo caracter
find /dev/ -type c -print

49. Encuentre en la ruta especificada los archivos que terminen en .o y en .ko
find /lib/modules/ -iname '*.o' -or -iname '*.ko'

50. Encuentre en el directorio /usr los archivos tipo link simbolico
find /usr/ -type l -print | less

51. Buscar los archivos que no sean accesados los ultimos 30 dias
find /home/ -atime +30 | less
Los arrays son mágicos. Simplemente empieza usando una variable como un array, y se convertirá en array.
#awk '{ a[$1]++ } END { for (i in a) { print i, a[i] } }'
awk '{a[$1]++} END { for (i in a) { print i, a[i] } }'
Esta entrada fue publicada en Unix - Linux. Guarda el enlace permanente.