Sistemas Operativos. Unix

   EMBED

Share

Preview only show first 6 pages with water mark for full document please download

Transcript

Facultad de Ingenier´ıa Universidad de Buenos Aires 75.08—Sistemas Operativos UNIX [email protected] http://fiuba-7508.50megs.com Apunte por: Ignacio Errico [email protected] Version Preliminar Marzo de 2003 ´Indice 1 Introducci´ on. 1.1 1.2 1.3 4 ¿Qu´e es UNIX? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.1 ¿Qu´e es UNIX entonces? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Tareas b´asicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.1 Iniciando el sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.2 Iniciar una sesi´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.3 Terminar una sesi´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.4 Cuentas de usuario y claves de usuario. . . . . . . . . . . . . . . . . . . . 6 1.2.5 Terminales virtuales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.6 El comando su. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.7 Apagando el sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Conceptos b´asicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.1 Caracteres de control en la l´ınea de comandos. . . . . . . . . . . . . . . . 8 1.3.2 Directorios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.3 Permisos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2 El Shell. 2.1 2.2 2.3 2.4 13 Uso de abreviaturas: Metacaracteres. . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.1.1 Nombres de archivos con metacaracteres. . . . . . . . . . . . . . . . . . . 14 Variables de Ambiente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2.1 Obteniendo el valor de variables. . . . . . . . . . . . . . . . . . . . . . . . 15 Variable de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.1 Sustituci´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Entrecomillado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 3 2.4.1 2.5 2.6 Tipos de entrecomillado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Redireccionamiento de la Entrada y Salida. . . . . . . . . . . . . . . . . . . . . . 18 2.5.1 Ejemplos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Interconexi´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3 Programaci´ on con el Shell: Shell-Scripting. 21 3.1 Comentarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2 Argumentos y Par´ametros. El comando shift. . . . . . . . . . . . . . . . . . . . 21 3.2.1 Par´ametros especiales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2.2 Estado de salida. El comando exit. . . . . . . . . . . . . . . . . . . . . . 23 Pruebas. El comando test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.1 Operadores del comando test. . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.2 Pruebas sobre archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.3 Prueba de valores para operaciones algebraicas. . . . . . . . . . . . . . . . 24 3.3.4 Prueba de valores para cadena de caracteres. . . . . . . . . . . . . . . . . 24 Aritm´etica entera. El comando expr. . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.4.1 Operador de longitud. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Comandos de control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.5.1 Sentencias de Decisi´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.5.2 Sentencias de Iteraci´on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3 3.4 3.5 4 Comandos de Entrada y Salida. 4.1 4.2 4.3 Traducci´on de caracteres: el comando tr. . . . . . . . . . . . . . . . . . . . . . . 30 4.1.1 Ejemplos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 El comando cut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.2.1 Ejemplos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 El comando paste. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.3.1 33 Ejemplos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Expresiones Regulares. 5.1 5.2 30 34 Expresiones regulares simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.1.1 Algunos ejemplos de expresiones regulares simples. . . . . . . . . . . . . . 35 Expresiones regulares extendidas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.2.1 36 Ejemplos de REs Extendidas. . . . . . . . . . . . . . . . . . . . . . . . . . Cap´ıtulo 1 Introducci´ on. 1.1 ¿Qu´ e es UNIX? El sistema operativo UNIX naci´o como un sistema de tiempo compartido, orientado a usos generales. En 1973, Ritchie y Thompson reescribieron el n´ ucleo del sistema (el kernel ) en C, rompiendo de esta manera la tradici´on de software de base escrito en assembler. En 1974 se introduce en las universidades con fines educacionales y poco tiempo despu´es estuvo disponible con fines comerciales. UNIX no es en s´ı un sistema operativo, sino un tipo de sistema operativo. Los sistemas operativos tipo UNIX m´ as conocidos son AIX, SCO, SVR4, SOLARIS. El ´exito de UNIX se debe principalmente a tres causas: 1. Ventaja comercial. Por estar escrito en C es portable, y se puede ejecutar en una gran variedad de m´aquinas. 2. Abierto. El c´odigo fuente est´a disponible y escrito en un lenguaje de alto nivel. Esto lo hace f´acil de adaptar a exigencias particulares. 3. De utilidad particular para programadores. Es un sistema operativo rico y productivo para programadores. Su eficacia se debe al enfoque de la programaci´on, y no a la programaci´on misma: la combinaci´on de distintos comandos simples permiten lograr grandes tareas generales. De esta manera, monta su potencia en la relaci´on entre los programas, m´as que en la potencia de los programas propiamente dichos. 1.1.1 ¿Qu´ e es UNIX entonces? En sentido estricto. Es el n´ ucleo de un sistema operativo de tiempo compartido. Un programa que controla los recursos de una computadora y los asigna entre los usuarios. Permite a los 4 Secci´on 1.2. Tareas b´asicas. 5 usuarios ejecutar sus programas, controla los dispositivos perif´ericos conectados, y proporciona un sistema de archivos que permite el almacenamiento a largo plazo de todo tipo de informaci´ on. En sentido m´ as amplio. Abarca, adem´as del n´ ucleo, programas esenciales como compiladores, editores, lenguajes de comandos, programas para copiar e imprimir archivos, y muchas otras aplicaciones. 1.2 1.2.1 Tareas b´ asicas. Iniciando el sistema. Este proceso puede variar levemente respecto de lo que uno est´a acostumbrado con otros sistemas operativos. En el caso de no haber instalado otro sistema operativo, el proceso es simplemente encender la computadora y esperar. Por otro lado, si se est´a compartiendo el sistema con otro sistema operativo, es probable que uno tenga que realizar alguna de las siguientes opraciones: • Seleccionar Linux en el prompt de LILO. Si al instalar el sistema se decidi´o instalar LILO (LInux LOader ) la computadora est´a preparada para iniciar el sistema operativo que se le especifique ingresando la etiqueta para la partici´on definida en la instalaci´ on. Presionando la tecla , se muestran las etiquetas posibles. Simplemente ingrese la correspondiente a Linux, o presione si es la partici´on que LILO debe iniciar por defecto. • Iniciar desde un diskette. Si se cre´o un diskette de booteo al instalar Linux, tambi´en se lo puede usar para iniciar el sistema. 1.2.2 Iniciar una sesi´ on. Al iniciar el sistema, o al conectarse a una terminal, se visiualiza el siguiente mensaje: Login: La primera vez que uno entra al sistema, se debe ingresar el usuario root. Este es el nombre del usuario que tiene permiso para todo en el sistema. Por lo general se usa para realizar tareas de administraci´on, como por ejemplo, para crear nuevos usuarios, apagar el sistema, etc. Dado que este usuario tiene permiso para hacer cualquier cosa, hay que saber que comandos se ejecutan al entrar como root. M´as adelante hablaremos acerca de permisos. Para ingresar, se debe tipear root y presionar la tecla , y a continuaci´on aparecer´a: Password: donde se debe tipear la clave del usuario. Tener presente, que si bien no se visualizan los caracteres cuando uno tipea la clave, se puede corregir con la tecla . Secci´on 1.2. Tareas b´asicas. 6 Recuerde que UNIX es un sistema operativo que distingue may´ usculas de min´ usculas —es “case sensitive”. Si la clave ingresada es correcta, el sistema mostrar´a un prompt o s´ımbolo de espera, que a lo largo de este apunte se representar´a con el s´ımbolo # (para el caso del root), que es normalmente el caracter generado por un programa shell o int´erprete de comandos, que es la interfaz entre el sistema operativo y el usuario. 1.2.3 Terminar una sesi´ on. Si bien existen los comandos logout y exit, es com´ un usar CTRL-D. Esto lleva a la pantalla de Login: que se describi´o antes. 1.2.4 Cuentas de usuario y claves de usuario. Como sugerimos antes, no es una buena idea usar la cuenta de root todo el tiempo. Tarde o temprano uno comete un error, y con este usuario no hay restricciones que salven. Vamos a describir la forma m´as b´asica de crear un usuario. En el prompt tipeamos: # useradd igna # passwd igna New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully El comando passwd en general se puede usar para: • Definir claves para nuevos usuarios. • Cambiar claves de usuarios existentes. • Cambiar la clave del usuario loggeado. El comando requiere que la clave se ingrese dos veces para verificar que no hubieron errores de tipeo. 1.2.5 Terminales virtuales. Una herramienta muy u ´til son las terminales virtuales: se pueden iniciar distintas sesiones simult´aneamente, presionando ALT-Fn. Habiendo creado el nuevo usuario igna, uno puede presionar ALT-F2 y loggearse con este nuevo usuario. Para volver a la terminal del root, se presiona ALT-F1. Secci´on 1.3. Conceptos b´asicos. 1.2.6 7 El comando su. Hay ocasiones en las cuales uno quiere ejecutar algunos comandos como un usuario distinto del que uno est´loggeado. Esto es muy u ´til particularmente para administradores del sistema, que usan sus cuentas sin privilegios por lo general. Para evitar todo el proceso de loggeo se usa el comando su, que hace que la sesi´on de un usuario ordinario se transforme en una sesi´on de root. Al ejecutar el comando, pide que se ingrese la clave del root. Este comando resulta muy u ´til particularmente si uno es su propio administrador de sistema, como sucede con muchos usuarios Linux. 1.2.7 Apagando el sistema. Apagar el sistema no se trata simplemente de apagar la computadora. Aunque uno no est´e ejecutando ning´ un programa, esto no significa que no hay nada corriendo. Lo que hay que hacer es ejecutar el comando shutdown, el cual solo puede ser ejecutado por el root. Esta es una buena oportunidad para usar el comando su. El formato general de shutdown es: shutdown El par´ametro puede ser: • -h: detener el sistema cuando se termin´o de cerrar. • -r: reiniciar el sistema. El segundo par´ametro, , normalmente es now, aunque tambi´en puede ser el valor de minutos a esperar antes de que se inicie el proceso de cerrado del sistema. Ejemplos: shutdown -r +15 Empezar a apagar el sistema dentro de 15 minutos y una vez terminado, reiniciar. shutdown -h now Apagar el sistema inmediatamente, y detenerse cuando se termine el proceso. 1.3 Conceptos b´ asicos. En primer lugar, y como mencionamos antes, UNIX es case sensitive: se distinguen may´ usculas de min´ usculas. Por otro lado, UNIX es full duplex : los caracteres que se tipean, se env´ıan al sistema, el cual los pasa a la terminal. Este proceso, conocido como eco, los copia directamente a la pantalla, aunque en ciertas ocasiones se desactiva (por ejemplo, para tipeo de claves). Los caracteres pueden clasificarse en dos grupos: Secci´on 1.3. Conceptos b´asicos. 8 • Caracteres comunes. • Caracteres de control. Los caracteres tipeados son examinados e interpretados antes de llegar a su destino. Todos los caracteres se transmiten a la terminal, excepto que el echo est´e apagado. Los caracteres se almacenan en el n´ ucleo hasta que se presiona . Cuando un caracter es precedido por el caracter \ (barra invertida), descarta este caracter y almacena el siguiente caracter como uno com´ un sin otra interpretaci´on. Al presionar , los datos almacenados se enviar´an al programa que est´e leyendo datos de la terminal. Los caracteres ser´an le´ıdos aunque el n´ ucleo est´e ocupado con otras tareas. Para obtener ayuda acerca de alg´ un comando, usar el comando: man que despliega la manual page para ese comando. Lo primero que se recomienda hacer es ejecutar man man es decir, ver la manual page del mismo man. Para volver al prompt mientras se visualiza una manual page presionar . Finalmente, en la filosof´ıa UNIX, solo existen archivos (una secuencia de bytes) y procesos (programas en ejecuci´on). Ambos se organizan en estructuras jer´arquicas. De esta manera, para el sistema, el teclado, la diskettera, etc. son archivos. 1.3.1 Caracteres de control en la l´ınea de comandos. Vamos a comentar algunos caracteres de control u ´tiles al tipear en la l´ınea de comandos. Solo mencionamos los m´as u ´tiles, aunque la lista completa se puede ver de [3]. Va al comienzo del texto. Va al final del texto. Mueve el cursor un caracter a la izquierda. Mueve el cursor un caracter a la derecha. Va al comienzo de la palabra anterior. Va al comienzo de la palabra siguiente. Secci´on 1.3. Conceptos b´asicos. 9 Limpia la pantalla. Pone toda la palabra en may´ uscula. Pone toda la palabra en min´ uscula. Borra hasta el final de la l´ınea. Completa la cadena incompleta. Es un caracter muy u ´til particularmente para trabajar r´apidamente con nombres de archivos largos. Tambi´en es u ´til el manejo de la salida por pantalla: Interrumpe la ejecuci´on de un programa. Pausa una salida. Continua mostrando una salida pausada. 1.3.2 Directorios. Los directorios son un tipo de archivo que permiten agrupar jer´arquicamente archivos. Permiten mantener unida informaci´on relacionada. Cada usuario tendr´a un home directory, o directorio de login, donde podr´a mantener sus archivos. Al iniciar una sesi´on se posiciona al usuario en este directorio. A diferencia del home directory, hablaremos del working directory para referirnos al directorio en el cual se est´a posicionado. Mientras que el working directory cambia al cambiar de directorio, el home directory se mantiene invariable para un usuario del sistema. Los directorios privados de los usuarios del sistema suelen estar en /users o /home. Comandos para administrar directorios. Describiremos los comandos b´asicos. cd Hace que el working directory sea el directorio especificado. Secci´on 1.3. Conceptos b´asicos. 10 mkdir Crea un directorio. rmdir Elimina un directorio que no contiene archivos. pwd Print Working Directory. Imprime la ruta del directorio en el cual se est´a posicionado. echo $HOME Imprime en contenido de la variable de ambiente $HOME, que contiene la ruta del home directory. M´as adelante hablaremos de variables de ambiente. Jerarqu´ıa de directorios. El directorio de m´aximo nivel es el / (llamado root —¡nada que ver con el usuario root!). All´ı se encuentran una serie de directorios, que describiremos a continuaci´on: /bin Ac´a se encuentran los programas b´asicos. /dev Ac´a se encuentran los dispositivos (terminales, impresoras, etc.). Hablaremos de dispositivos m´as adelante. /etc Contiene archivos y programas de administraci´on. Solo por mencionar algunos: passwd es un archivo que contiene datos de los usuarios, rc se ejecuta al iniciar el sistema. /lib Biblioteca. Contiene principalemente partes del compilador C, preprocesador de C y, por ejemplo, libc.a que es la biblioteca de subrutinas de C. /tmp Temporales. Contiene archivos de vida corta. Por ejemplo, cuando se edita un programa, se crea en este directorio un archivo de trabajo, que es una copia del original. Este directorio se depura peri´odicamente. /usr Sistema de archivos de usuario. Contiene esencialmente los directorios descriptos hasta ahora, con los mismos significados, pero con programas menos vitales para el funcionamiento del sistema. Por ejemplo, el compilador FORTRAN est´a en /usr/lib. Vale la pena invertir un tiempo en recorrer estos directorios para estar m´as familiarizado con el sistema. Secci´on 1.3. Conceptos b´asicos. 1.3.3 11 Permisos. Cada archivo tiene un conjunto de permisos asociados, que determinan que se puede hacer y quien puede hacerlo. Cuando un usuario ingresa al sistema, ´este lo reconoce por un n´ umero llamado user id (o identificador de usuario). Diferentes nombres de usuario pueden tener el mismo user id — aunque no es algo muy deseable, desde el punto de vista de la seguridad. Adem´as de este valor, se le asigna al usuario un group id, que lo coloca dentro de una cierta clase de usuarios. El sistema usa estos dos valores para determinar los permisos para un usuario en relaci´on con un archivo. Los permisos de un archivo pueden permitir: • leer, • escribir, y/o • ejecutar el archivo. Estas acciones se representan por r, w, x, respectivamente (debido a read, write, execute), y cada una se asigna a: • el usuario mismo, • el grupo al que pertenece el usuario, y • al resto de los usarios. Esta clasificaci´on se representa por u, g, o, respectivamente (debido a user, group, others). Por ejemplo, supongamos que el archivo arch tiene los siguiente permisos: rwx rw- r--. Esto significa que el usuario puede leer, escribir (modificar) y ejecutar el archivo; que los usuarios del grupo al que pertenece pueden solo leerlo y modificarlo; y que el resto de los usuarios solo pueden leerlo. Para ver los permisos de un archivo, usar el comando: ls -l [] Los corchetes indican que el par´ametro no es necesario. Hablaremos m´as acerca de este comando m´as adelante. Cambiando los permisos de un archivo. El comando chmod (change mode), permite cambiar permisos de archivos, con el siguiente formato: Secci´on 1.3. Conceptos b´asicos. 12 chmod Solo el due˜ no de un archivo puede cambiar los permisos de un archivo. El par´ametro puede darse de varias maneras. Esencialmente hay dos: • Con s´ımbolos representativos. Usando las seis letras definidas antes, y usando + o para indicar si se d´a el permiso, o si se quita, respectivamente. Por ejemplo: chmod u+x arch Le da permiso de ejecuci´on del archivo arch al usuario. chmod ug+w-r arch Les da permiso de modificaci´on al usuario y al grupo del archivo arch, pero les quita simult´aneamente permiso de lectura. • Con n´ umeros octales. Para cada clasificaci´on se puede asignar una combinaci´on de tres permisos, resultando en 23 = 8 alternativas distintas, lo cual sugiere una representaci´ on en base octal para los permisos. El “bit” de lectura (r) se define como el bit m´as significativo. As´ı, los permisos rw- se representan por el n´ umero octal 4 + 2 + 0 = 6. Por ejemplo: chmod 640 arch Le asigna los permisos rw- r-- --- al archivo arch, es decir, lectura y modificaci´on para el usuario, lectura para el grupo al que pertenece el usuario, y ning´ un permiso al resto de los usuarios. El par´ametro archivos puede ser uno o varios archivos separados por espacio o con wildcards— que explicaremos m´as adelante. Tener presente que el usuario root tiene permiso para todo. Cap´ıtulo 2 El Shell. Como ya se mencion´o antes, cuando un usuario se conecta al sistema, ´este presenta un prompt donde se tipean los comandos que el sistema pasa a ejecutar. No es el kernel el que dirige al usuario, sino un int´erprete de comandos o shell, que es un programa que realiza la interpretaci´ on de los caracteres ingresados. A continuaci´on hablaremos de las ventajas que presta este int´erprete entre el sistema operativo y el usuario. 2.1 Uso de abreviaturas: Metacaracteres. Es posible referirse a una serie de archivos mediante el uso de metacaracteres, los cuales son interpretados por el shell antes de ser pasados al comando en cuesti´on. Los siguientes son metacaracteres: ? Un caracter cualquiera. * Cualquier cadena de caracteres. [conjunto] Cualquier caracter del conjunto. [!conjunto] Cualquier caracter que no este en el conjunto. Ejemplos. Supongamos que creamos los directorios Mayo2001, Junio2001, . . . , Mayo2002. Si que quieren eliminar todos los directorios del a˜ no 2001: 13 Secci´on 2.1. Uso de abreviaturas: Metacaracteres. 14 rmdir *2001 En este caso, el shell sustituye el metacaracter * por Mayo, Junio, etc., y es ´ esto lo que le pasa al comando rmdir. Es decir, desde el punto de vista del comando rmdir, es como que el usuario hubiese tipeado rmdir Mayo2001 Junio 2001 etc., con todos los direcctorios que correspondan. Si se quieren eliminar los meses Junio y Julio: rmdir Ju?io* El shell reemplaza el metacaracter ? por n y l respectivamente, y el * por 2001, que son las cadenas que corresponden a los archivos del directorio actual, y es ´esto lo que le pasa al comando. Nuevamente, desde el punto de vista del comando rmdir, es como si no se hubieran usado metacaracteres, porque ´el no los v´ e. Notar que el uso de metacaracteres simplifica el dise˜ no de los comandos. De no existir el shell, habr´ıa que implementar para cada comando la interpretaci´on de metacaracteres. Ahora, supongamos que tenemos los archivos arch1, arch2, . . . , arch9. rm arch[1-46-9] Elimina todos los archivos, salvo el archivo arch5. Como siempre, el comando no v´e los metacaracteres, sino que v´e los par´ametros arch1, . . . , arch4, arch6, . . . , arch9. rm [a-z] El comando rm informar´ıa que no encuentra ning´ un archivo para borrar, pues no hay archivos cuyos nombres sean exclusivamente caracteres de la a a la z. rm [a-z]8 Borra el archivo arch8. rm *[!8] Borra todos los archivos, salvo arch8. 2.1.1 Nombres de archivos con metacaracteres. Inmediatamente surje la pregunta de si es posible tener archivos que tengan metacaracteres en sus nombres, por ejemplo, arch*. Esto es posible, y si uno no quiere que el shell interprete un metacaracter, debe anteponerle el metacaracter \ o escribir el metacaracter entre ap´ostrofes. Nos referiremos (informalmente) a esta acci´on como casteo de un caracter. Por ejemplo: rm arch Borra el archivo arch*, y no todos los archivos cuyo nombre comiencen con arch. rm arch’*’ Tiene el mismo efecto que el anterior. Secci´on 2.2. Variables de Ambiente. 2.2 15 Variables de Ambiente. Algunas propiedades del shell son controladas por una serie de variables de ´este, que llamaremos variables de ambiente. Algunas variables que t´ıpicamente usa el shell son: HOME contiene el home directory del usuario. PATH contiene la lista de directorios, separados por ’:’, donde el shell busca los comandos a ejecutar. Colocar ’.’ o nada antes de los primeros o u ´ltimos ’:’ indica working directory, aunque suele no setearse por seguridad. SHELL contiene el shell que se est´a ejecutando. PWD contiene el working directory. TERM contiene el tipo de terminal. Ciertos programas lo utilizan para manejar m´as eficientemente la pantalla. 2.2.1 Obteniendo el valor de variables. Obtener el valor de una variable es la acci´on de indicarle al shell que interprete el contenido de la variable. Los valores de variables se abtienen anteponiendo el caracter $ al nombre de la variable. Por ejemplo, para ver el contenido de una variable, se puede hacer: $ echo $HOME El caracter $ en negrita antes del comando echo representa el prompt del shell, y no debe ser tipeado. De aqu´ı en adelante seguiremos esta convenci´on. Para agregar un directorio a la variable de ambiente PATH, se puede hacer: $ PATH=$PATH:/user/games 2.3 Variable de usuario. Como convenci´on, las variables de ambiente llevan nombres en may´ usculas. Uno puede definir variables propias, usando nombres en min´ usculas. Secci´on 2.3. Variable de usuario. 16 Por ejemplo, si uno accede muchas veces a un determinado directorio, podr´ıa hacer: $ midir=/nombre/de/directorio/terriblemente/largo y simplemente ejecutar: $ cd $midir Notar que el auto-completado con la tecla tambi´en funciona con variables. 2.3.1 Sustituci´ on. Ya vimos que el shell reemplaza $var por el valor del string asignado a la variable. Tambi´en, una variable est´a configurada, si alguna vez le ha sido asignado un valor, siendo v´alido el string nulo como valor para una variable. Nos centramos ahora en sustituir el valor de una variable, dependiendo de si ´esta ten´ıa o no un valor asignado. Sustituci´ on incondicional. En este caso, si la variable ten´ıa valor, se pierde. ${variable#patron} ${variable##patron} Si patron coincide con el comienzo del valor de variable , el valor de sustituci´on es el valor de variable con la parte coincidente eliminada. En el primer caso se reemplaza la menor parte coincidente y en el segundo, la mayor parte coincidente. ${variable%patron} ${variable%%patron} Si patron coincide con el final del valor de variable , el valor de sustituci´on es el valor de variable con la parte coincidente eliminada. En el primer caso se reemplaza la menor parte coincidente y en el segundo, la mayor parte coincidente. Sustituci´ on condicional. ${variable:-cadena} Si variable est´a asignada y no es nula el valor de sustituci´on es el valor de variable , sino el valor de sustituci´on es cadena . Secci´on 2.4. Entrecomillado. 17 ${variable:=cadena} Si variable est´a asignada y no es nula el valor de sustituci´on es el valor de variable , sino el valor de sustituci´on es cadena , y le asigna este valor a variable . ${variable:+cadena} Si variable est´a asignada y no es nula el valor de sustituci´on es el valor de cadena , sino el valor de sustituci´on es nulo. ${variable:?cadena} Si variable est´a asignada y no es nula el valor de sustituci´on es el valor de variable , sino el valor de sustituci´on es cadena , y sale al shell. Si cadena es omitido, se imprime el mensaje parameter null or not set. Si se lo utiliza en un .profile no sale del sistema. Sirve para verificar si las variables est´ an seteadas. Los : en la sustituci´on de variable significa opcional. 2.4 Entrecomillado. El entrecomillado se utiliza para indicarle al shell que un string, que de otra forma se interpretar´ıa como partes separadas, debe ser interpretado como una unidad. Por ejemplo, un archivo puede llamarse archivo con nombre largo.txt. El contenido de un archivo puede mostrarse por la salida standard utilizando el comando cat. Si tipeamos: $ cat archivo con nombre largo.txt El shell le pasar´ıa al comando cat los par´ametros archivo, con, nombre y largo.txt por separado. Para que el shell le pase un u ´nico par´ametro deber´ıamos tiperar: $ cat ’archivo con nombre largo.txt’1 2.4.1 Tipos de entrecomillado. Distinguimos 3 tipos de entrecomillado: Comillas. El shell interpreta caracteres especiales. 1 Tambi´en se podr´ıan castear los espacios. Secci´on 2.5. Redireccionamiento de la Entrada y Salida. 18 Ap´ ostrofe. El shell no interpreta caracteres especiales. Acento grave (como en ` a). El shell ejecuta el comando y pasa la salida. Por ejemplo: $ mivar=’es una’ $ echo ’esto $mivar prueba’ esto $mivar prueba $ echo "esto $mivar prueba" esto es una prueba $ echo ‘date‘ Mar, 20 Ago 2002 01:26:43 GMT-03:00 2.5 Redireccionamiento de la Entrada y Salida. La idea de redirecci´on est´a sustentada por el concepto que ya mencionamos, en el que todo en definitiva es un archivo. Muchos de los comandos que se describir´an en cap´ıtulos posteriores, toman su entrada de la entrada standard o producen su salida por la salida standard. Es com´ un que se desee, por ejemplo, la salida de un comando no salga por la salida standard sino que se almacene en un archivo de texto. Lo mismo ocurre para la entrada de datos a un comando: puede ser deseable que el comando no espere datos desde la entrada standard sino que los tome desde un archivo. Los caracteres > y < permiten la redirecci´on de la salida y la entrada de comandos a o desde archivos, respectivamente. 2.5.1 Ejemplos. $ cat arch1 arch2 arch3 Este comando concatena los tres archivos2 por la salida standard. $ cat arch1 arch2 arch3 > total Este comando concatena los tres archivos y esta salida se guarda en el archivo total. Nada se imprime en la salida standard. Si el archivo de redirecci´on no existe, lo crea. Si existe, lo sobreescribe. Notar que es el shell el que se encarga de este redireccionamiento. Es decir, el comando cat simplemente hace su tarea de concatenci´on, desentendi´endose de cual ser´a el destino. 2 Es decir, imprime consecutivamente el contenido de los tres archivos en el orden indicado. Secci´on 2.6. Interconexi´on. 19 $ cat arch1 arch2 arch3 >> total Esto tiene el mismo efecto que en el caso anterior, con la diferencia que si el archivo de redirecci´on existe, no lo sobreescribe, sino que hace un append. $ cat arch $ cat < arch Si bien, ambos casos producen el mismo resultado, en el primer caso, el comando “ve” que tiene que trabajar con el archivo arch. En el segundo caso, en cambio, es el shell quien le pasa el contenido del archivo al comando, y por lo tanto el comando “no se entera” de que trabaja con el archivo, y a sus efectos, “ve” simplemente una entrada standard. Este ejemplo se menciona con el fin de marcar esta, si bien sutil, diferencia entre ambos casos. $ comando-cualquiera 2> archivo-de-errores Para cada proceso de un sistema UNIX se asignan tres descriptores de archivo: entrada standard, salida standard, salida standard para errores. Los dos primeros casos ya los vimos antes. El tercer caso, se refiere a los mensaje de error, que por defecto se imprimen por la terminal. En muchos casos esto no es deseable3 . Para esto es que el shell interpreta a 2> como redireccionamiento de la salida standard para errores. Es decir, cualquier mensaje destinado a la salida standard para errores no se imprimir´a en la terminal, sino que se imprimir´a en el archivo archivo-de-errores. $ comando-cualquiera 2> /dev/null Esencialmente ocurre lo mismo que antes, aunque en este caso, la redirecci´on es hacia el archivo /dev/null, el cual representa un archivo nulo: cualquier secuecia de caracteres redireccionado a este archivo ser´a eliminado sin posibilidad de recuperaci´on. Para hacer una analog´ıa, es una suerte de papelera de reciclaje. $ comando-cualquiera << EOF El comando toma su entrada desde la entrada standard hasta que se ingrese EOF. 2.6 Interconexi´ on. La secci´on anterior se centr´o en el problema de redireccionamiento. Con esto solo, si se quisiera conectar dos comandos, se deberia redireccionar la salida de uno a un archivo temporal y que el segundo comando tome como entrada este archivo. 3 Por ejemplo, en casos en que se deba llevar un log de los errores o el avance del programa. Secci´on 2.6. Interconexi´on. 20 Una de las grandes contribuciones de un sistema operativo UNIX es la posibilidad de interconectar dos procesos sin necesidad de utilizar archivos temporales auxiliares. Esto se consigue con el caracter |. $ who | sort Este ejemplo es con fines ilustrativos. El comando who imprime por la salida standard los usuarios loggeados al sistema. El comando sort4 ordena el archivo que se le especifica. La salida del who no se imprime por la salida standard, sino que se imprime la del sort, cuya entrada es la salida del comando who. En esta instancia, debe quedar claro que el objetivo y el prop´osito de tener estar herramientas brindadas por el sistema, es tener comandos simples, que al interconectarlos produzcan efectos m´as sofisticados. En cap´ıtulos posteriores, veremos como lograr esto, mediante lo que se llaman scripts, para luego ver en detalle el funcionamiento de comandos en detalle. 4 El comando sort se describe en detalle m´ as adelante Cap´ıtulo 3 Programaci´ on con el Shell: Shell-Scripting. En el caso m´as simple, un script es un archivo con permiso de ejecuci´on que contiene una serie de comandos que ser´an ejecutados secuencialmente. Esto salva de estar tipeando esa secuencia de comandos cada vez que se invoca al script. Shell-Scripting se remonta a la filosof´ıa cl´asica de UNIX de separar o dividir un problema grande en problemas m´as peque˜ nos. 3.1 Comentarios. El caracter # es el m´as utilizado para comentarios en shell : ´este ignora todo lo que viene despu´es del caracter numeral. Por ejemplo: $ echo hello # there hello $ echo hello#there hello#there El caracter : tambi´en es de comentarios, pero debe usarse al principio de la l´ınea. En verdad, ´este es el comando null del shell. 3.2 Argumentos y Par´ ametros. El comando shift. Los par´ametros de posici´on son usados para pasar argumentos desde la l´ınea de comandos a los scripts. De la misma manera que con las variables, los valores de par´ametros se obtienen con el caracter $ y el d´ıgito que indica su posici´on, siendo $0 siempre el nombre del comando. 21 Secci´on 3.2. Argumentos y Par´ametros. El comando shift. 22 El shell bsh no permite trabajar con m´as de 10 par´ametros directamente, es decir, interpreta a $10 como el par´ametro uno seguido del caracter cero. Para ello se utiliza el comando shift. Lo que hace shift es pasar el contenido de $1 a $0 y as´ı siguiendo, perdiendo el valor original de cada variable. El siguiente es un ejemplo ilustrativo que imprime los argumentos que se pasan al script como par´ametros: while [ ! -z $1 ] do echo $1 shift done La sentencia while y la expresi´on de testeo se explican en las secciones 3.5.2 y 3.3 respectivamente. 3.2.1 Par´ ametros especiales. Supongamos que se ejecuta: $ prog a b c Entonces vale: $0 prog $# 4 $* a b c seguido de los archivos del working directory "$*" a b c * $$ id del proceso padre $! pid del u ´ltimo comando ejecutado en background $? estado del u ´ltimo comando ejecutado en foreground $opciones del shell en efecto Secci´on 3.3. Pruebas. El comando test. 3.2.2 23 Estado de salida. El comando exit. Cada vez que un programa completa su ejecuci´on, retorna un estado al sistema. Este estado es un n´ umero que indica si el programa ha sido ejecutado existosamente o no. Por lo general, el estado cero indica ejecuci´ on exitosa y todo valor distinto de cero indica que la ejecuci´on ha fallado. Esto permite, adem´as de la verificaci´on del resultado del programa, el control del mismo en el manejo de errores y progresi´on de la ejecuci´on. Como se menciona en el apartado anterior, para ver el estado de salida, basta ver el valor de $? inmediatamente despu´es de la ejecuci´on del proceso en cuesti´on. Para hacer que un script termine devolviendo un estado en particular, se utiliza el comando exit n , siendo n el c´odigo de terminaci´on. Si no especifica este par´ametro, se devolver´a el del u ´ltimo comando ejecutado. 3.3 Pruebas. El comando test. El comando test permite evaluar el valor de verdad de expresiones l´ogicas, devolviendo cero en caso de ´exito, o distinto de cero en caso contrario. El formato de este comando1 es: test expresi´ on o [ expresi´ on ] expresi´ on contendr´a un conjunto de operadores que describiremos a continuaci´on, seg´ un la prueba. Tambi´en, expresi´ on debe estar rodeada por espacios y debe entrecomillarse para embeber los espacios dentro de ella. 3.3.1 Operadores del comando test. ! . . . . . . negaci´on -a . . . . . . AND -o . . . . . . OR 3.3.2 Pruebas sobre archivos. Algunos tipos de prueba sobre archivos son: 1 ]]. tanto para Bourne Shell como para Korn Shell, permitiendo este u ´ltimo la prueba mediante [[ expresi´ on Secci´on 3.4. Aritm´etica entera. El comando expr. -a file -d file -f file -L file -p file -s file -r file -w file -x file file1 -nt file2 file1 -ot file2 3.3.3 A A A A A A -eq -ge -gt -le -lt -ne 3.3.4 24 . . . . . . file existe. . . . . . . file existe y es un directorio. . . . . . . file existe y es un archivo regular. . . . . . . file existe y es un link simb´ olico. . . . . . . file existe y es una named pipe. . . . . . . file existe y no es vac´ıo. . . . . . . file existe y tiene permiso de lectura. . . . . . . file existe y tiene permiso de escritura. . . . . . . file existe y tiene permiso de ejecuci´on. . . . . . . file1 es m´as nuevo que file2 . . . . . . . file1 es m´as antiguo que file2 . Prueba de valores para operaciones algebraicas. B B B B B B . . . . . . igual a . . . . . . mayor o igual a . . . . . . mayor a . . . . . . menor o igual a . . . . . . menor a . . . . . . distinto de Prueba de valores para cadena de caracteres. Debido a que una cadena puede contener nulos o espacios intermedios, siempre es aconsejable entrecomillar a la variable con comillas dobles para evitar errores en el comando test. string1 = string2 . . . . . . las cadenas son iguales string1 != string2 . . . . . . las cadenas no son iguales string . . . . . . la cadena no es nula -z string . . . . . . la cadena tiene longitud cero (es nula) -n string . . . . . . la cadena no es nula 3.4 Aritm´ etica entera. El comando expr. En Bourne Shell, todas las variables son strings. Las operaciones matem´aticas entre strings no son posibles, pero existe una forma de evaluar una expresi´on tipo string como una expresi´ on matem´atica, utilizando el comando expr. expr eval´ ua sus argumentos como una expresi´on matem´atica y devuleve el resultado a la salida standard. Las operaciones disponibles son: +, -, *, % (resto) y /. Cuando se utilicen estos operadores deber´a haber un espacio a ambos lados del mismo. Secci´on 3.5. Comandos de control. 25 Hay tambi´en una operaci´on de equiparaci´ on, :, que compara el primer argumento con el segundo. El segundo debe ser una expresi´ on regular (a ver m´as adelante). La operaci´on retorna el n´ umero de caracteres coincidentes, o cero si no hay coincidencia. Al utilizar una expresi´ on regular coincidente con todo, .*, el operador de equiparaci´on puede ser usado para determinar la longitud del primer argumento. Si se ejecuta una expresi´on entre comillas simples, el resultado reemplaza a la expresi´on misma. Recordar que $, *, etc., deben estar casteados para que no sean interpretados por el shell. Ejemplo. $ $ $ 3 a=’expr 1 + 2’ b=’expr $a \* 4’ echo $a $b 12 3.4.1 Operador de longitud. ${#variable} Devuelve la longitud de variable . 3.5 Comandos de control. Los comandos de control pueden dividirse en dos grupos: • sentencias de decisi´on • sentencias de iteraci´on 3.5.1 Sentencias de Decisi´ on. Sentencia if. Formato: if condici´ on then comandos [elif condici´ on then comandos ] Secci´on 3.5. Comandos de control. 26 [else comandos ] fi Ejemplo. El siguiente script determina si el archivo pasado como par´ametro existe y tiene un tama˜ no mayor a cero. if test -s "$1" then echo $1 es un archivo existente con tama~ no mayor a cero. else echo $1 no existe o tiene tama~ no nulo. fi Sentencia case. Es utilizada para la selecci´on de m´ ultiples alternativas. Cada posibilidad es conocida como branch y cada branch debe estar separada por ;;, siendo opcional en el u ´ltimo branch. La variable en la sentencia case debe ser una coincidencia expl´ıcita: no debe haber expresiones regulares o nombres de archivos referenciados con comodines. S´ı es posible usar la condici´on OR que puede ser utilizada en los patrones, representada por |. Los metacaracteres pueden usarse en los patrones con el siguiente significado: • * : cero o m´as ocurrencias de uno o todos los caracteres. • ? : cualquier caracter. • [] : configura y determina rangos. Formato: case valor in pat1) comandos ;; pat2) comandos ;; ... patN) comandos Secci´on 3.5. Comandos de control. 27 ;; *) comandos por defecto ;; esac Ejemplo. El siguiente script muestra un peque˜ no men´ u para determinar que hacer con el archivo pasado como par´ametro. if test $# then Uso: $0 exit 1 # fi if test ! -ne 1 # verificamos que se pase un par´ ametro archivo # $0 es el nombre del script salimos devolviendo un c´ odigo de terminaci´ on de error por uso err´ oneo -f "$1" # verificamos la existencia del archivo then echo $1 no es un nombre de archivo v´ alido. exit 2 # salimos devolviendo un c´ odigo de terminaci’on de error por archivo no v´ alido fi echo ¿Qu´ e desea hacer con $1?: # presentamos un menu echo echo echo read ’ para imprimirlo.’ ’ para borrarlo.’ ’ para salir.’ accion # leemos la opcion que se ingrese case $accion in I|i) lp $1 ;; B|b) rm $1 ;; *) echo Saliendo sin hacer nada... esac ;; En este ejemplo se introdujeron los comandos read, para leer de la entrada standard el valor para una variable, y el comando lp para formatear e imprimir archivos. Sentencia select. Esta sentencia, solo disponible en Korn Shell, permite un listado de selecci´on por men´ u. Este comando usa la variable de ambiente PS3 para el prompt, y COLUMNS y LINES para determinar la apariencia del men´ u. Secci´on 3.5. Comandos de control. 28 Formato: select variable in arg1 arg2 ...argN do comandos done El usuario selecciona el elemento de la lista sobre la cual ejecutar´a los comandos , los cuales se continuar´an ejecutando hasta que se encuentre con comandos de ruptura, tales como break, exit o return. Ejemplo. PS3="Elija uno: " select i in 6109 6110 6620 7506 7542 exit do case $i in 6109) echo $1 Probabilidad y Estadistica B ;; 6110) echo $1 Analisis Matematico III ;; 6620) echo $1 Organizacion de Computadoras ;; 7506) echo $1 Organizacion de Datos ;; 7542) echo $1 Taller de Programacion I ;; exit) echo Saliendo... exit 0 ;; *) echo Seleccion invalida ;; esac read rta?"Continuar? (s/n)? " if [ $rta != ’s’ ] then echo Fin del menu exit 0 fi done 3.5.2 Sentencias de Iteraci´ on. Sentencia for. Formato: for variable in lista do Secci´on 3.5. Comandos de control. 29 comandos done o alternativamente for variable in lista ; do comando1 ; ...; comandoN ; done La lista puede ser enunciada expl´ıcitamente o ser el resultado de otro comando o metacracteres. Para cada iteraci´on, variable toma el valor de cada uno de los elementos de lista , concluyendo el ciclo cuando se llegue al u ´ltimo elemento de lista . Sentencia while. Esta sentencia ejecuta los comandos mientras la condicion sea verdadera. Formato: while condicion do comandos done Sentencia until. Esta sentencia cicla hasta que condicion se cumpla. Formato: until condicion do comandos done Hasta ac´a se tienen vistas varias de las herramientas que brinda el sistema. Pasaremos ahora a estudiar comandos simples en detalle. Cap´ıtulo 4 Comandos de Entrada y Salida. Estudiaremos ahora comandos del sistema en detalle. Dado que muchos de ellos incluyen opciones muy espec´ıficas y fuera del alcance de este apunte, se sugiere consultar las manual pages correspondientes para mayor informaci´on. 4.1 Traducci´ on de caracteres: el comando tr. El comando tr es un filtro utilziado para traducir los caracteres desde la entrada standard hacia la salida standard. Sintaxis: tr [charset1 ] [charset2 ] Notar que la sintaxis no especifica archivos. Para trabajar con archivos, el ingreso debe ser redireccionado desde la l´ınea de comandos. Los rangos y conjuntos pueden ser utilizados como un mapeo de caracteres de uno en uno. Si charset2 es m´as corto que charset1 , entonces charset2 es completado con la repetici´on del u ´ltimo caracter en el conjunto. 4.1.1 Ejemplos. Para el ejemplo utilizaremos el siguiente archivo, que llamaremos arch: Mercurio Urano Tierra Marte Neptuno G. B. F. B. T. Total Total Total Total Total horas horas horas horas horas 80 78 80 40 80 $ tr 8 2 < arch 30 Secci´on 4.2. El comando cut. Mercurio Urano Tierra Marte Neptuno G. B. F. B. T. Total Total Total Total Total horas horas horas horas horas 31 20 72 20 40 20 $ tr [a-z] [A-Z] < arch MERCURIO URANO TIERRA MARTE NEPTUNO 4.2 G. B. F. B. T. TOTAL TOTAL TOTAL TOTAL TOTAL HORAS HORAS HORAS HORAS HORAS 80 78 80 40 80 El comando cut. El comando cut puede ser usado para cortar columnas desde una tabla o campos de un archivo. Los campos cortados no necesariamente tiene que ser de longitud fija. Sintaxis: cut -lista [arch1 arch2 ...archN ] Si no se le indica ning´ un archivo, toma como entrada la entrada standard. El modificador lista puede ser: -ci -ci,j,k -ci-j -ci - El caracter i -´esimo. Los caracteres i -´esimo, j -´esimo y k -´esimo. Desde el caracter i -´esimo hasta el j -´esimo. A partir del caracter i -´esimo. El comando cut empieza a contar los caracteres desde 1. Esto funciona muy bien en los archivos que posean un formato bien definido, como la salida del comando who1 . Como alternativa se tiene la especificaci´on de campos a cortar: • Con la opci´on -dcaracter se le especifica al comando cut el caracter que debe tomar como separador de campos. • La opci´ on -flista especifica el campo o campos que ser´an cortados. • La opci´ on -s indica que no se impriman aquellas l´ıneas que no contienen al separador de campos. 1 El comando who lista informaci´ on sobre los usuarios loggeados al sistema. Los nombres de usuario son los caracteres del 1 al 8, las terminales son del 12 al 24 y las fecha y hora del login son del 25 al 36. Secci´on 4.3. El comando paste. 4.2.1 32 Ejemplos. $ who root user1 user2 user3 term/01 term/00 term/02 term/03 Apr Apr Apr Apr 12 12 12 12 08:00 09:01 09:13 09:15 $ who | cut -c1-5 root user1 user2 user3 $ who | cut -c1-5,19root user1 user2 user3 Apr Apr Apr Apr 12 12 12 12 08:00 09:01 09:13 09:15 Sea ahora el archivo infou: root:x:0:0:Super User:/:/bin/ksh cron:NONE:1:1:Time Daemon:/: user1::100:101:555 1212:/home/user1:/bin/sh $ cut -d: -f1,6 infou root:/ cron:/ user1:/home/user1 4.3 El comando paste. El comando paste funciona en cierta forma a la inversa del comando cut: yuxtapone columnas. Distinas sintaxis: paste arch1 arch2 ...archN Esta es la forma m´as simple de uso, en la que cada l´ınea de cada archivos se ponen juntas separadas por una tabulaci´on. Secci´on 4.3. El comando paste. 33 paste -d lista arch1 arch2 ...archN En este caso, en lugar de utilizar el separador por defecto, paste utiliza como separadores los caracteres indicados en lista . paste -s [-d lista ] arch1 arch2 ...archN Se utiliza para pegar l´ıneas dentro de un mismo archivo. paste - arch1 [arch2 ...archN ] Indica que adem´as de los archivos indicados, debe tomar una entrada que le est´a siendo redireccionada. 4.3.1 Ejemplos. Supongamos los siguientes tres archivos: ciudades Atlanta New York Los Angeles nombres user1 user2 user3 telefonos (404)555-5356 (212)555-3456 (213)555-1234 $ paste nombres telefonos user1 user2 user3 (404)555-5356 (212)555-3456 (213)555-1234 $ paste -d’=+’ nombres ciudades telefonos user1=Atlanta+(404)555-5356 user2=New York+(212)555-3456 user3=Los Angeles+(213)555-1234 $ paste -s nombres user1 $ cut -d: user2 user3 -f5 clientes1 | paste - clientes2 Cap´ıtulo 5 Expresiones Regulares. Las expresiones regulares (REs) son patrones que describen strings y se usan para matchear 1 esos strings. Las expresiones regulares permiten, por ejemplo, seleccionar alg´ un conjunto de registros de un campo de un archivo de datos. El espectro de aplicaci´on var´ıa desde algo simple como el reemplazo por parte del shell del caracter * por todos los archivos de un directorio hasta matcheos m´as refinados como los que utilizan comandos como grep y awk. Las expresiones regulares se construyen a partir de caracteres ordinarios y metacaracteres. Los caracteres ordinarios se matchean a s´ı mismos, mientras que los metacaracteres matchean distintos grupos de caracteres o modifican la operaci´on de otros caracteres. En UNIX tenemos tres tipos o niveles de expresiones regulares: 1. los del shell, para nombres de archivos, de los cuales ya se habl´o antes; 2. los simples, utilizados por comandos como grep y sed; 3. los extendidos, utilizados por comandos como egrep. Para los tres casos, se cumple: • La barra invertida \ se usa para castear un caracter, es decir, todo caracter que siga a una barra invertida se tomar´a como una caracter ordinario, inclusive si ´este es un metacaracter. • Caracteres entre corchetes [] representan un solo caracter matcheado de todos los del conjunto. – Si el primer caracter de un conjunto es el acento circunflejo ^ se matchea el complemento del conjunto, es decir, todo lo no perteneciente al conjunto. – Si se utiliza el gui´on -, se est´a indicando un rango de caracteres. 1 En este apunte vamos a usar este t´ermino para significar corresponder o coincidir, por falta de un verbo que exprese m´ as precisamente el verbo ingl´es to match. 34 Secci´on 5.1. Expresiones regulares simples. 35 Por Ejemplo. abcde [abcde] [a-e] [^a-e] \[\]\\ 5.1 Los caracteres ’a’, ’b’, ’c’, ’d’ y ’e’ se matchean en ese orden. Uno de los caracteres ’a’, ’b’, ’c’, ’d’ o ’e’ se matchean. Idem anterior. Un caracter, salvo ’a’, ’b’, ’c’, ’d’ o ’e’, se matchean. Los caracteres ’[’, ’]’, ’\’ se matchean en ese orden. Expresiones regulares simples. Aparte de los caracteres ya mencionados, las expresiones regulares simples brindan los siguientes metacaracteres: • El asterisco * significa repetir la RE anterior a ´el un n´ umero arbitrario de veces, incluyendo ninguna vez. • El punto . matchea un caracter cualquiera. • El acento circunflejo ^ en este caso est´a sobrecargado: solo tiene sentido como primer caracter de una RE, caso en el cual significa matchear el comienzo de la l´ınea. • El signo de pesos $ solo tiene sentido como u ´ltimo caracter de una RE, caso en el cual significa matchear el final de la l´ınea. El comando grep trabaja con llaves, cuando son casteadas, para denotar una cantidad de ocurrencias de la RE que precede: \{n\} \{n,\} \{n,m\} Exactamente n ocurrencias. Por lo menos n ocurrencias. Entre n y m ocurrencias. Tambi´en, el editor vi trabaja con par´entesis angulares <> para indicar comienzo o final de una palabra, respectivamente. 5.1.1 Algunos ejemplos de expresiones regulares simples. p[aeo]lo Alguno de ’palo’, ’pelo’, ’polo’. ^$ Una l´ınea en blanco (matchear comienzo, nada, y fin). ^[a-zA-Z]$ Secci´on 5.2. Expresiones regulares extendidas. 36 L´ıneas de una sola palabra. ^[0-9]$ L´ıneas con exactamente un n´ umero. d.n Cualquier secuencia de tres caracteres comenzando con una ’d’ y terminando con una ’n’. d[aeiou]n ’dan’, ’den’, ’din’, ’don’, or ’dun’. 4[2-9][0-9][0-9]-[0-9]\{4\} Un nmero ´ telef´onico del Gran Buenos Aires: un cuatro, un d´ıgito entre dos y nueve, dos d´ıgitos, un gui´on y cuatro d´ıgitos. 5.2 Expresiones regulares extendidas. Las expresiones regulares extendidas agregan par´entesis para agrupar. • La barra vertical (o pipe) | para alternar. • El signo m´as + para repetir el item precedente por lo menos una vez. • El signo de interrogaci´on ? para matchear el item precedente ninguna o una vez. 5.2.1 Ejemplos de REs Extendidas. (Andrea|Beatriz|Carla) (Dieguez|Fernandez) Matchea alguno de los seis nombres ’Andrea Dieguez’, ’Andrea Fernandez’, ’Beatriz Dieguez’, ’Beatriz Fernandez’, ’Carla Dieguez’ o ’Carla Fernandez’. [0-9]+ Matchea un n´ umero entero (uno o m´as d´ıgitos). (\+|-)?[0-9]+ [+-]?[0-9]+ Matchea un n´ umero entero que puede o no llevar signo (un signo m´as, un signo menos o nada, seguido de un n´ umero entero). Further articles in this series will focus on various utilities which use REs to select data for processing–grep, egrep, sed, and awk. Referencias [1] Apunte de “Entorno UNIX” por Paola Chamoles. A˜ no 1999. 75.08—Sistemas Operativos. [2] Red-Hat Official Installation Guide. http://www.redhat.com/docs/manuals/linux/RHL-7.2-Manual/install-guide/ [3] Manual page del shell bash. 37