UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO: 01/2015 GUIA DE LABORATORIO #6 Nombre de la Practica: Programación con awk Lugar de Ejecución: Laboratorio de Redes, Edificio 3 del CITT Tiempo Estimado: 2:30 horas. MATERIA: Aplicaciones para redes. DOCENTE: Denis Altuve, Marvin Martínez I. OBJETIVOS Que el estudiante: Comprenda el uso de awk Pueda extraer registro y campos Manipule las variables especiales de awk. II. INTRODUCCION TEORICA El nombre awk proviene de las iniciales de sus desarrolladores : Alfred V. Aho, Brian W. Kerningan y Peter J. Weinberger, de los Laboratorios Bell de AT&T. Inicialmente se desarrolló para escribir programas muy cortos, pero las características de este atrajo a los usuarios de tal modo, que lo impulsó más allá de la idea original de los autores. awk es un lenguaje de búsqueda y procesamiento de patrones. Esto quiere decir que awk es capaz de buscar un patrón dentro de un archivo (al igual que grep) y tratarlo según unas operaciones determinadas. Con awk se pueden desarrollar auténticos programas. Según esto awk es capaz de procesar un archivo con datos organizados por columnas y generar nuevas columnas con los valores resultantes de realizar ciertos cálculos u operaciones. A diferencia de comandos Unix como grep y sed, que filtran y procesan texto, awk incorpora su propio lenguaje de programación, siendo capaz de ofrecer operaciones aritméticas, relaciones lógicas y variables. Se pueden desarrollar programas con awk que procesen la entrada estándar o un archivo, realizando tareas como tratar archivos de texto como bases de datos. El lenguaje de programación awk incluye estamentos como for, while e if-else, así como un conjunto de funciones y variables incorporadas. Sintaxis La sintaxis de awk es: awk [-f archivo_programa] [-F] ['programa'] [variable=valor ...] [archivo] donde: archivo_programa: especifica el archivo fuente del programa a aplicar a archivo. -F: especifica el carácter delimitador de campos. Por defecto se considera el espacio en blanco. programa : especifica el conjunto de patrones e instrucciones a ejecutar con archivo. La diferencia con archivo_programa, es que en este caso hay que especificar los patrones e instrucciones en la línea de comandos. Para evitar interferencias con la shell deben ir encerradas entre comillas A 1 Guía # 6: Programación con awk simples('). variable=valor:se utiliza para establecer los valores que tomarán las variables que utilice el programa. archivo: archivo que será procesado por awk. Si se especifica . Formato de los estamentos La estructura general de los estamentos o conjuntos patrón-acción es: Patrón { acción } Interpretación: Para cada línea que verifique lo especificado en el patrón, se ejecutará la acción indicada. La acción siempre va encerrada entre llaves. Se pueden especificar varias acciones, separándolas por ";" o por el carácter nueva línea. En una regla awk, el patrón o la acción puede ser omitida, pero no ambos. Si no se especifica la acción, se mostrarán por pantalla aquellas líneas que contengan el patrón. La acción está formada por estamentos (if, for, print, sprintf, next), los cuales deben finalizar en ";", Nueva Línea o llaves. Dentro de las acciones se pueden realizar operaciones matemáticas, de concatenación, etc. Las variables utilizadas pueden ser escalares, campos o tablas, y son inicializadas a la cadena nula. Si la evaluación del patrón resulta positiva, se realiza la acción asociada. El resultado de una de un patrón vacío se considera siempre positivo. Si la acción se omite, se asume que lo que se desea es mostrar el registro en la salida estándar. Este proceso se reitera con cada línea, hasta llegar al final del archivo. Campos de entrada Para utilizar una expresión que no sea trivial se debe introducir el concepto de “campo”. Se considerará cada registro del archivo de entrada como una sucesión de campos delimitados por un carácter dado. Este carácter es, por omisión, el espacio. Como se ha visto anteriormente, se puede indicar a awk que considere otro carácter como separador de campos mediante la opción –F (mayúscula) en la línea de mandatos. Se hace referencia al contenido de cada campo usando el carácter “$” (dólar) seguido del ordinal del campo: $1, $2, $3,etc. Con la notación $0 se hace referencia a la línea entera. Variables También es necesario en este punto citar la existencia de variables predefinidas en el lenguaje. El concepto tradicional de “variable” (almacén de datos en memoria, caracterizado por un nombre no repetido en el mismo contexto y capaz de contener un dato que puede ser modificado por el programa) se aplica perfectamente en este caso. A 2 Guía # 6: Programación con awk Las siguientes variables predefinidas están relacionadas con la información entrante: F Field separator): contiene el carácter que indica a awk en qué punto del registro acaba un campo y empieza el siguiente. Por omisión es un espacio. Se puede indicar un carácter alternativo mediante una instrucción de asignación como F,. NF (Number of fields): contiene el número total de campos que contiene el registro que se está leyendo en cada momento. NR (Number of record): contiene el número de orden del registro que se está procesando en cada momento. RS (Record separator): contiene el carácter que indica a awk en qué punto del archivo acaba un registro y empieza el siguiente. Es “\n” por omisión. OFS (Output FS): contiene el separador de campos para la salida generada por awk. La instrucción print inserta en la salida un carácter de separación cada vez que aparece una coma en el código. ORS (Output RS): Contiene el carácter que awk escribirá al final de cada registro. Es “\n” por omisión. Obsérvese que en esta modificación del ejemplo anterior la entrada contiene DOS registros, dada la aparición del salto de línea en el centro de la cadena de caracteres entre comillas. Awk también tiene entre sus bondades poder utilizar operadores como por ejemplo: <= Menor ó igual >= Mayor ó igual < Menor que > Mayor que == Igual a && Extraer desde la final n1 hasta n2 || Extraer la fila n1 y n2 A 3 Guía # 6: Programación con awk III. MATERIALES Y EQUIPO Para la No. 1 2 realización de la guía de práctica se requerirá lo siguiente: Requerimiento PC de escritorio con Linux Guía de laboratorio Cantidad 1 1 IV. PROCEDIMIENTO 1. El siguiente script me permite extraer , la columna deseada para efectos de ejemplo se extrae la columna 1. echo "Bienvenidos a la programación con awk" | awk '{print $1}' 2. Con awk se puede utilizar la acción de dos maneras diferentes, la primera creando de la acción en un archivo externo y sera llama do por medio del parámetro -f y el nombre del archivo que contiene la acción , la segunda forma es la mas utilizada y es la vista en el primer ejemplo en la cual la acción se escribe en entre medio de comillas simples, el siguiente ejemplo dará el mismo resultado que el ejemplo1. -primero debemos crear el archivo con al acción. echo '{print $1}' > accion .awk - ahora podemos ejecutar la sentencia con awk echo "Bienvenidos a la programacion con awk" | awk -f accion.awk 3. Ahora veremos como crear variables que pueden ser utilizadas en la acción. ejemplo1 echo "programacion con awk" | awk -v fecha="14/Marzo/2008" '{print $1, fecha}' ejemplo 2 En este ejemplo se puede ver como extraer agregar texto. varias columnas ademas utilizar una variable y echo "El se cumple un mes" | awk -v fecha="14/Abril/2008" '{print $1, fecha, $2,$3,$4,$5, "y soy feliz"}' 4. El siguiente script me permite extraer la fila deseada. echo -e "Primera fila \nSegunda fila \nTercera fila" | awk ' NR==2 {print $0}' Este escript me permite extraer la fila numero dos y de ella quiero todos los campos, en otras palabras toda la linea. 5. Ahora bien para poder ejemplificar de mejor manera se necesita crear el siguiente archivo y que sera llamado “países.txt”. A 4 Guía # 6: Programación con awk España 505 39 Europa Francia 544 53 Europa Reino_unido 244 56 Europa Estados_unidos 9519 237 America China 9560 1032 Asia Brasil 8500 134 America India 3183 810 Asia Japón 372 120 Asia Mexico 1970 80 America 6. Ahora apoyados del archivo paises.txt extraeremos un valor en especifico, se presentaran diferentes ejemplos. Ejemplo1 Extraer columna tres y fila cinco, el valor a obtener sera 1032. cat paises | awk 'NR==5 {print $3}' Ejemplo2 Extraer columna uno y fila dos, el valor a obtener sera Francia. cat paises | awk 'NR==2 {print $1}' Ejemplo3 Extraer columna uno y fila ocho, el valor a obtener sera Japón. cat paises | awk 'NR==8 {print $1}' Ejemplo4 Extraer columna tres y fila dos, el valor a obtener sera 53. cat paises | awk 'NR==2 {print $3}' 7. Ahora se utilizaran los operadores para poder extraer un rango de filas. Ejemplo1 Se extraen de la fila numero tres hasta la fila numero cinco y ademas se extraen todos los campos. cat paises | awk 'NR>=3 && NR<=5 {print $0}' Ejemplo2 Extraer la solamente la fila tres y la fila cinco cat paises | awk 'NR==3 || NR==5 {print $0}' 8. Si se desea extraer la ultima fila pero si no sabes que numero es, entonces podemos utilizar la palabra reservada END. cat paises | awk 'END {print $0}' 9. Ver el numero de registro de cada fila cat paises | awk '{print NR}' 10. También se pueden combinar las palabras reservadas para obtener un resultado deseado por ejemplo si se desean saber cuantas registros existen en total. A 5 Guía # 6: Programación con awk cat paises | awk 'END {print NR}' 11. Ver el contenido de aquellas filas que sean diferente de la elegida. cat paises | awk 'NR!=5 {print $0}' 12. Digitar el siguiente script luego probarlo: #!/bin/bash # usuarios: lista datos de usuarios echo "Nombres de usuarios, Directorio propio, intérprete de comandos" cat /etc/passwd | awk -F: '{print $1,$6,$7}' | sort | more -5 13. Digite las siguientes sentencias en consola y luego interpretes las salidas. echo -e "Primera fila\nSegunda fila\nTercera fila" | awk 'BEGIN{RS="e" } {print $0}' y echo -e "Primera fila\nSegunda fila\nTercera fila" | awk 'BEGIN{ORS="e" } {print $0}' V. DISCUSION DE RESULTADOS 1-Implementar el comando necesario par poder obtener, el numero de registros y el valor de cada fila el siguiente resultado: 1 España 505 39 Europa 2 Francia 544 53 Europa 3 Reino_unido 244 56 Europa 4 Estados_unidos 9519 237 America 5 China 9560 1032 Asia 6 Brasil 8500 134 America 7 India 3183 810 Asia 8 Japón 372 120 Asia 9 Mexico 1970 80 America 2-Crear un menú en el cual pueda tener la facilidad de extraer valores >, <,==, registros en especifico, campos especifico, ver el total de registros de un archivo en especifico, el archivo a utilizar deber ser pasado como parámetro . 3-)Crear un script que me permita extraer del archivo /etc/passwd, el nombre del usuario, y su uid. 4-)Crear un script que me pida el nombre de un usuario, luego verificara si existe en el archivo /etc/passwd, si existe imprimirá su nombre, uid y su shell por defecto, si este usuario no existe, imprimirá un mensaje que diga “Este Usuario no existe”. 5)el comando nmap localhost me devuelve una salida similar a la siguientes Starting Nmap 5.21 ( http://nmap.org ) at 2010-02-28 13:40 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.000022s latency). Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1 Not shown: 995 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 111/tcp open rpcbind 631/tcp open ipp 3306/tcp open mysql Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds crear un programa con awk que me permita obtener el siguiente resultado y que sea guardado en un archivo que se llame puertosabiertos.txt: A 6 Guía # 6: Programación con awk 22/tcp ssh 25/tcp smtp 111/tcp rpcbind 631/tcp ipp 3306/tcp mysql Nota: los ejercicios 3 y 4 serán llamados por medio de un menú. VII. BIBLIOGRAFIA Linux. Manual de Administración, Steve Shah, McGraw-Hill 2001 Linux. Guía de instalación y administración, Vicente López Camacho, McGraw-Hill, 2001 A 7