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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
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] } }' |