Vous êtes sur la page 1sur 93

Uso de la lnea de comandos Esta seccin cubre materiales correspondientes al tema 1.103.

1 del examen 101 de Administracin de Nivel Junior (LPIC-1). Este tema tiene un valor de ponderacin de 5. Esta seccin tratar los siguientes temas:
y y y y y y y y

Interaccin con shells y comandos usando la lnea de comandos Comandos y secuencias de comandos vlidos Definicin, referenciacin y exportacin de variables de entorno Historial de comandos y facilidades de edicin Invocacin de comandos dentro y fuera de la ruta Uso de la sustitucin de comandos Aplicacin recursiva de comandos a travs de un rbol de directorios Uso de pginas man (manuales) para aprender sobre comandos

Esta seccin proporciona una breve introduccin a algunas de las principales caractersticas del shell bash y se detiene especialmente en las caractersticas ms importantes a fines de la certificacin. Sin embargo, shell es un entorno muy rico y se recomienda explorarlo con mayor profundidad. Existen muchos manuales excelentes dedicados a shells de UNIX y Linux y al shell bash en particular. El shell bash El shell bash es uno de los numerosos shells disponibles para Linux. Tambin recibe el nombre de Bourne-againshell, en honor a Stephen Bourne, creador del shell inicial (/bin/sh). Bash es bsicamente compatible con sh pero adems proporciona varias mejoras tanto en las capacidades de funciones como en las de programacin. Bash incorpora caractersticas del shell Korn (ksh) y del shell C (csh) y est diseado en conformidad con el estndar POSIX. Antes de ahondar en bash, recuerde que un shell es un programa que acepta y ejecuta comandos. Tambin soporta construcciones de programacin que permiten la construccin de comandos complejos a partir de partes ms pequeas. Estos comandos complejos, o scripts, pueden guardarse como archivos para convertirse en comandos en s mismos. De hecho, muchos de los comandos dentro de un tpico sistema Linux son scripts. Los shells tienen una serie de comandos incorporados como cd,breakyexec. Otros comandos son externos. Los shells tambin usan tres flujos de entrada/salida estndar:
y

stdin es el flujo de entrada estndar y proporciona los datos de entrada a los comandos.

y y

stdout es el flujo de salida estndar y muestra los datos de salida de los comandos. stderr es el flujo de error estndar y muestra datos de salida de error de los comandos.

Los flujos de entrada proporcionan datos de entrada a los programas, normalmente a partir de la pulsacin de teclas de la terminal. Los flujos de salida imprimen caracteres de texto, normalmente a una terminal. La terminal originalmente era un typewriter ASCII o una terminal de visualizacin, pero en la actualidad es ms frecuente que se trate de una ventana en un escritorio grfico. En una seccin posterior de este tutorial, Flujos, canalizaciones y redireccionamientos, se analiza con mayor profundidad el redireccionamiento de estos flujos de entrada/salida estndar. A continuacin, esta seccin se centrar en el redireccionamiento en el nivel superior. En adelante, este tutorial considerar que usted sabe cmo obtener un shell prompt. De lo contrario, consulte el artculo de developerWorks "Basic tasks for new Linux developers" que le explicar ste y muchos temas ms. Si usted usa un sistema Linux sin escritorio grfico o si abre una ventana de terminal en un escritorio grfico, visualizar un prompt igual o similar a alguno de los mostrados en el Listado 1. Listado 1. Algunos prompts de usuario tpicos
[db2inst1@echidna db2inst1]$ ian@lyrebird:~> $

Si inicia sesin como usuario root (o superusuario), su prompt probablemente sea como el mostrado en el Listado 2. Listado 2. Ejemplos de prompt en superusuario o usuario root
[root@echidna root]# lyrebird:~ # #

El usuario root tiene mucho poder, por lo cual se recomienda ser cuidadoso al usarlo. Con privilegios root, la mayora de los prompts incluirn un signo numeral (#) aadido. Los privilegios de usuarios comunes suelen delinearse con un carcter diferente, a veces un signo de moneda ($). Su prompt puede ser distinto a los ejemplos proporcionados en este tutorial. Su prompt podra incluir su nombre de usuario, nombre de host, directorio actual, fecha u hora de impresin del prompt, etc. Volver arriba

Comandos y secuencias Ahora que tenemos el prompt, veamos qu podemos hacer con l. La principal funcin de shell es interpretar los comandos para permitirle interactuar con su sistema Linux. En los sistemas Linux (e UNIX), los comandos tienen un nombre de comando y cuentan con opciones y parmetros. Algunos comandos no tienen ni opciones ni parmetros, otros tienen opciones pero carecen de parmetros, y otros carecen de opciones pero tienen parmetros. Cuando una lnea contiene un carcter #, todo el resto de los caracteres de la lnea se ignoran. Entonces, el carcter # puede estar indicando tanto un comentario como un prompt root. El contexto indicar claramente de qu caso se trata. Echo El comandoechoimprime sus argumentos (o hace eco de ellos) a la terminal, como muestra el Listado 3. Listado 3. Ejemplos de Echo
[ian@echidna ian]$ echo Word Word [ian@echidna ian]$ echo A phrase A phrase [ian@echidna ian]$ echo Where are my spaces? Where are my spaces? [ian@echidna ian]$ echo "Here are my spaces." # plus comment Here are my spaces.

En el tercer ejemplo del Listado 3, todos los espacios sobrantes se comprimieron en un nico espacio en los datos de salida. Para que esto no suceda, debe colocar comillas en las cadenas, ya sean dobles (") o simples ('). Bash usa el espacio en blanco, como los espacios vacos, las tabulaciones y los caracteres de nueva lnea, para separar la lnea de entrada en tokens, que luego se pasan al comando. Colocar las cadenas entre comillas conserva el espacio vaco adicional y convierte a toda la cadena en un nico token. En el ejemplo anterior, cada token posterior al nombre de comando es un parmetro, por lo tanto, tenemos los parmetros 1, 2, 4 y 1, respectivamente. El comando echo tiene algunas opciones. Generalmente, echo anexar a los datos de salida un carcter de nueva lnea aadido. Use la opcin-npara suprimirlo. Use la opcin-epara permitir que ciertos caracteres de escape de barra invertida tengan un significado especial. La Tabla 3 muestra algunos caracteres de este tipo.

Tabla 3. Caracteres echo y de escape Secuencia Funcin de escape \a Alerta (campana) \b Retroceso \c Suprimir nueva lnea aadida (cumple la misma funcin que la opcin -n) \f Avance de pgina (limpia la pantalla de un visor de video) \n Nueva lnea \r Retorno de carro \t Tabulacin horizontal Escapes y continuacin de lnea El uso de barras invertidas en bash genera un pequeo problema. Cuando el carcter barra invertida (\) no se coloca entre comillas, funciona como un escape para sealarle a bash que conserve el significado literal del carcter a continuacin. Esto resulta necesario en los metacaracteres shell especiales, a los que nos referiremos un poco ms adelante. Existe una excepcin a esta regla: una barra invertida seguida por una nueva lnea provoca que bash pase por alto ambos caracteres y trate a la secuencia como si fuera una solicitud de continuacin de lnea. Esto puede resultar til para separar lneas extensas, especialmente en shell scripts. Para que el comandoecho(o uno de los tantos otros comandos que usan caracteres de control con escape similares) administren correctamente las secuencias antes descriptas deber colocar entre comillas las secuencias de escape o incluirlas en una cadena entre comillas, a menos que use una segunda barra invertida para que el shell conserve una de las barras para el comando. El Listado 4 muestra algunos ejemplos de los distintos usos de la \. Listado 4. Ms ejemplos de echo
[ian@echidna ian]$ echo -n No new line No new line[ian@echidna ian]$ echo -e "No new line\c" No new line[ian@echidna ian]$ echo "A line with a typed > return" A line with a typed return [ian@echidna ian]$ echo -e "A line with an escaped\nreturn" A line with an escaped return [ian@echidna ian]$ echo "A line with an escaped\nreturn but no -e option" A line with an escaped\nreturn but no -e option [ian@echidna ian]$ echo -e Doubly escaped\\n\\tmetacharacters Doubly escaped metacharacters [ian@echidna ian]$ echo Backslash \

> followed by newline \ > serves as line continuation. Backslash followed by newline serves as line continuation.

Obsrvese que bash muestra un prompt especial (>) cuando se ingresa una lnea con comillas sin cerrar. El flujo de entrada contina en una segunda lnea incluye el carcter de nueva lnea. Metacaracteres y operadores de control del shell bash Bash tiene varios metacaracteres, que, cuando no aparecen entre comillas, sirven para separar los datos de entrada en palabras. Adems del espacio en blanco, estos son '|', '&', ';', '(', ')', '<' y '>'. Explicaremos algunos de estos caracteres con mayor profundidad en otras secciones de este tutorial. Por el momento, considere que si desea incluir un metacarcter como parte del texto, ste deber aparecer o bien entre comillas o como carcter de escape, usando una barra invertida (\), como muestra el Listado 4. La nueva lnea y ciertos metacaracteres o pares de metacaracteres tambin pueden usarse como operadores de control. Estos son '||', '&&', '&', ';', ';;', '|'' '(' y ')'. Algunos de estos operadores de control permiten crear secuencias o listas de comandos. La secuencia de comandos ms sencilla se compone de tan solo dos comandos separados por un punto y coma (;). Cada comando se ejecuta en secuencia. En entornos programables, los comandos devuelven una indicacin de xito o falla. Los comandos Linux suelen devolver un valor cero en casos de xito y un valor distinto a cero en casos de fallas. Puede ingresar algn tipo de procesamiento condicional en su lista usando los operadores de control && y ||. Si separa dos comandos con el operador de control &&, el segundo se ejecutar si y slo si el primero devuelve un valor de salida de cero. Si separa los comandos con ||, el segundo se ejecutar slo si el primero devuelve un cdigo de salida distinto a cero. El Listado 5 muestra algunas secuencias de comandos que usan el comando echo. Estas primeras no son demasiado interesantes porque, en ellas, echo devuelve 0. Ms adelante mostraremos otros ejemplos que permiten usar una mayor variedad de comandos. Listado 5. Secuencias de comandos
[ian@echidna ian]$ echo line 1;echo line 2; echo line 3 line 1 line 2 line 3 [ian@echidna ian]$ echo line 1&&echo line 2&&echo line 3 line 1 line 2 line 3 [ian@echidna ian]$ echo line 1||echo line 2; echo line 3 line 1 line 3

Exit

Un shell puede cerrarse usando el comandoexit. Puede proporcionar un cdigo exit como parmetro, si as lo desea. Si est ejecutando el shell en una ventana de terminal en un escritorio grfico, la ventana se cerrar. Asimismo, si est conectado con un sistema remoto usando, por ejemplo, ssh o telnet, su conexin finalizar. En el shell bash, tambin puede presionar la teclaCtrljunto con la tecla d para salir. Analicemos otro operador de control. Si adjunta un comando o una lista de comandos entre parntesis, el comando o la secuencia se ejecutar en un subshell, es decir que el comando exit saldr del subshell en lugar de salir del shell en el que est trabajando. El Listado 6 muestra un ejemplo simple de secuencias y de && y ||. Listado 6. Subshells y secuencias
[ian@echidna ian]$ (echo In subshell; exit 0) && echo OK || echo Bad exit In subshell OK [ian@echidna ian]$ (echo In subshell; exit 4) && echo OK || echo Bad exit In subshell Bad exit

Continue leyendo este tutorial para ver ms secuencias de comandos. Volver arriba Variables de entorno Cuando se ejecuta en un shell bash, el entorno se constituye de varios elementos, como la forma del prompt, su directorio principal, su directorio en funcionamiento, el nombre de su shell, los archivos que ha abierto, las funciones que ha definido, etc. Su entorno incluye numerosas variables que pueden haber sido establecidas por bash o por usted. El shell bash tambin le permite tener variables shell, que podr exportar a su entorno para que sean usadas por otros procesos que se ejecutan en el shell u otros shells que usted puede haber generado a partir del shell actual. Tanto las variables de entorno como las variables de shell tienen un nombre. El valor de una variable se referencia usando '$' antes del nombre. La Tabla 4 muestra algunas de las variables de entorno bash ms comunes. Tabla 4. Algunas variables de entorno bash comunes Nombre Funcin USER Nombre del usuario que inici sesin UID Identificador de usuario numrico del usuario que inici sesin HOME Directorio principal del usuario PWD Directorio en funcionamiento

SHELL Nombre del shell $ Identificador de proceso (o PID) del proceso de shell bash (u otro) en ejecucin PPID Identificador de proceso del proceso que inici este proceso (es decir, el identificador del proceso primario) ? Cdigo de salida del ltimo comando El Listado 7 muestra lo que probablemente ver en algunas de estas variables bash comunes. Listado 7. Variables de entorno y shell
[ian@echidna ian]$ echo $USER $UID ian 500 [ian@echidna ian]$ echo $SHELL $HOME $PWD /bin/bash /home/ian /home/ian [ian@echidna ian]$ (exit 0);echo $?;(exit 4);echo $? 0 4 [ian@echidna ian]$ echo $$ $PPID 30576 30575

No usa bash?
El shell bash es el shell predeterminado en la mayora de las distribuciones Linux. Si usted no est ejecutando bajo el shell bash, proceda de alguna de las siguientes maneras para poder practicar con el shell bash:
y

Use el comando
chsh -s /bin/bash

para cambiar el shell predeterminado. La nueva forma predeterminada se aplicar la prxima vez que inicie sesin. Use el comando
su - $USER -s /bin/bash

para crear otro proceso como proceso secundario de su shell actual. El proceso nuevo ser un shell de inicio de sesin que usa bash. Cree un identificador con un shell bash predeterminado para usar durante la preparacin para el examen de LPI.

Puede crear o activar una variable shell ingresando un nombre seguido inmediatamente por un signo igual (=). Las variables distinguen maysculas de minsculas, es decir que var1 y VAR1 son variables diferentes. Por convencin, las variables (en especial las variables exportadas) se ingresan en maysculas, pero esto no es un requisito. En teora, $$ y $? son parmetros shell, no variables. Slo pueden referenciarse y no es posible asignarles un valor.

Cuando cree una variable shell, normalmente ser recomendable exportarla al entorno para que quede disponible para otros procesos que se inician desde este shell. Las variables que se exportan no estn disponibles para el shell primario. Para exportar un nombre de variable, se usa el comandoexport. Como atajo, con bash es posible asignar un valor y exportar una variable en un slo paso. Para ejemplificar las operaciones de asignacin y exportacin, ejecutemos el comando bash en el shell bash y luego ejecutemos el shell Korn (ksh) desde el nuevo shell bash. Usaremos el comandopspara visualizar informacin acerca del comando que se encuentra en ejecucin. Ampliaremos nuestros conocimientos depscuando expliquemos el estado de procesos ms adelante en este tutorial. Listado 8. Ms variables de entorno y shell
[ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 30576 30575 -bash [ian@echidna ian]$ bash [ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 16353 30576 bash [ian@echidna ian]$ VAR1=var1 [ian@echidna ian]$ VAR2=var2 [ian@echidna ian]$ export VAR2 [ian@echidna ian]$ export VAR3=var3 [ian@echidna ian]$ echo $VAR1 $VAR2 $VAR3 var1 var2 var3 [ian@echidna ian]$ echo $VAR1 $VAR2 $VAR3 $SHELL var1 var2 var3 /bin/bash [ian@echidna ian]$ ksh $ ps -p $$ -o "pid ppid cmd" PID PPID CMD 16448 16353 ksh $ export VAR4=var4 $ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL var2 var3 var4 /bin/bash $ exit $ [ian@echidna ian]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL var1 var2 var3 /bin/bash [ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 16353 30576 bash [ian@echidna ian]$ exit [ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 30576 30575 -bash [ian@echidna ian]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL /bin/bash

Notas:

1. Al inicio de esta secuencia, el shell bash tena el PID 30576. 2. El segundo shell bash tiene el PID 16353, y su shell primario es PID 30576, el shell bash original. 3. Creamos VAR1, VAR2 y VAR3 en el segundo shell bash, pero solamente exportamos VAR2 y VAR3. 4. En el shell Korn, creamos VAR4. El comandoechomostr valores nicamente para VAR2, VAR3 y VAR4; confirmando que VAR1 no se export Le sorprendi ver que el valor de la variable SHELL no cambi pese al cambio del prompt? No siempre se puede esperar que SHELL le informe bajo qu shell est ejecutando, pero el comandopss le indicar el comando real. Observe quepscoloca un guin (-) enfrente del primer shell bash para indicar que se trata del shell de inicio de sesin. 5. Volviendo al segundo shell bash, vemos a VAR1, VAR2 y VAR3. 6. Y, por ltimo, al volver al shell original, vemos que ninguna de nuestras nuevas variables existe an. Anteriormente sealamos que se podan usar comillas simples o dobles. Hay una gran diferencia entre las dos. El shell expande las variables shell que se encuentran entre comillas dobles ($quot;), y no realiza la expansion si se usan comillas simples ('). En el ejemplo anterior, iniciamos otro shell dentro de nuestro shell y obtuvimos un nuevo identificador de proceso. Con la opcin-c, es posible pasar un comando al otro shell, el cual ejecutar el comando y volver. Si pasamos una cadena entre comillas como comando, el shell externo quitar las comillas y pasar la cadena. Si usamos comillas dobles, la expansin de variables se realizar antes de que se pase la cadena, por lo cual los resultados pueden no ser los esperados. Como el shell y el comando se ejecutarn en otro proceso, tendrn otro PID. El Listado 9 ejemplifica estos conceptos. El PID del shell bash de nivel superior se encuentra resaltado. Listado 9. Colocacin entre comillas y variables shell
[ian@echidna ian]$ echo "$SHELL" '$SHELL' "$$" '$$' /bin/bash $SHELL 19244 $$ [ian@echidna ian]$ bash -c "echo Expand in parent $$ $PPID" Expand in parent 19244 19243 [ian@echidna ian]$ bash -c 'echo Expand in child $$ $PPID' Expand in child 19297 19244

Hasta ahora, todas nuestras referencias de variables terminaron con espacio en blanco y esto nos indic dnde terminaba el nombre de variable. En realidad, los nombres de variables slo pueden estar compuestos por letras, nmeros o el carcter guin bajo y, por consiguiente, el shell sabe que un nombre de variable ha terminado cuando encuentra un carcter de otro tipo. A veces es necesario usar variables en expresiones cuyo significado resulta ambiguo. En estos casos, puede usar llaves para delimitar un nombre de variable, como muestra el Listado 10.

Listado 10. Uso de llaves con nombres de variables


[ian@echidna ian]$ echo "-$HOME/abc-" -/home/ian/abc[ian@echidna ian]$ echo "-$HOME_abc-" -[ian@echidna ian]$ echo "-${HOME}_abc-" -/home/ian_abc-

Env El comandoenv sin opciones ni parmetros muestra las variables del entorno actual. Tambin puede usarse para ejecutar un comando en un entorno personalizado. La opcin-i(o simplemente-) limpia el entorno actual antes de ejecutar el comando, mientras que la opcin-udesactiva las variables de entorno que usted no desee pasar. El Listado 11 muestra datos de salida parciales del comandoenv sin ningn parmetro y luego tres ejemplos de invocacin de diferentes shells sin el entorno primario. Observe con atencin estos ejemplos antes de pasar a la explicacin. Listado 11. El comando env
[ian@echidna ian]$ env HOSTNAME=echidna TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=9.27.89.137 4339 22 SSH_TTY=/dev/pts/2 USER=ian ... _=/bin/env OLDPWD=/usr/src [ian@echidna ian]$ env -i bash -c 'echo $SHELL; env' /bin/bash PWD=/home/ian SHLVL=1 _=/bin/env [ian@echidna ian]$ env -i ksh -c 'echo $SHELL; env' _=/bin/env PATH=/bin:/usr/bin [ian@echidna ian]$ env -i tcsh -c 'echo $SHELL; env' SHELL: Undefined variable.

Observe que bash estableci la variable SHELL pero no la export al entorno, aunque s cre otras tres variables en el entorno. En el ejemplo de ksh, tenemos

dos variables de entorno, pero nuestro intento de hacer eco del valor de la variable SHELL devuelve una lnea en blanco. Finalmente, tcsh no cre ninguna variable de entorno y produce un error ante el intento de referenciar el valor de SHELL. Unset y set El Listado 11 mostr distintos comportamientos de los shells en el manejo de variables y entornos. Si bien este tutorial se centra en bash, cabe destacar que no todos los shells se comportan de la misma manera. Adems, los shells se comportan de diferentes maneras dependiendo de si se trata de shells de inicio de sesin o no. Por el momento, nos quedaremos con el concepto de que un shell de inicio de sesin es el shell que se obtiene cuando se inicia sesin en un sistema; es posible iniciar otros shells para que se comporten como shells de inicio de sesin si lo desea. Los tres shells que se iniciaron en el ejemplo anterior usandoenv -ino eran shells de inicio de sesin. Pruebe pasar la opcin-lal comando shell propiamente dicho para ver las diferencias que obtendra con un shell de inicio de sesin. Analicemos nuestro intento de visualizar el valor de la variable SHELL en estos shells que no son shells de inicio de sesin: 1. Cuando se inici bash, ste activ la variable SHELL, pero no la export automticamente al entorno. 2. Cuando se inici ksh, ste no activ la variable SHELL. Sin embargo, la referenciacin de una variable de entorno no definida resulta equivalente a la referenciacin de una variable con valor vaco. 3. Cuando se inici tcsh, ste no activ la variable SHELL. En este caso, el comportamiento predeterminado es diferente al de ksh (y bash), ya que el error se informa ante el intento de usar una variable. Puede usar el comandounsetpara desactivar una variable y quitarla de la lista de variables shell. Si la variable se export al entorno, esta operacin tambin la quitar del entorno. Puede usar el comandosetpara controlar varias facetas del funcionamiento de bash (o de otros shells). Set es un comando incorporado a shell, por lo tanto, sus distintas opciones son especficas para shell. En bash, la opcin-uhace que bash informe un error en casos de variables no definidas en lugar de tratarlas como variables definidas pero vacas. Puede activar las distintas opciones desetcon-y desactivarlas con+. Para visualizar las opciones activadas, useecho $-. Listado 12. Unset y set
[ian@echidna ian]$ echo $himBH [ian@echidna ian]$ echo $VAR1 [ian@echidna ian]$ set -u;echo $himuBH

[ian@echidna ian]$ echo $VAR1 bash: VAR1: unbound variable [ian@echidna ian]$ VAR1=v1 [ian@echidna ian]$ VAR1=v1;echo $VAR1 v1 [ian@echidna ian]$ unset VAR1;echo $VAR1 bash: VAR1: unbound variable [ian@echidna ian]$ set +u;echo $VAR1;echo $himBH

Si usa el comandosetsin opciones, ste mostrar todas las variables shell con sus valores (de haberlos). Tambin se puede usar otro comando,declare, para crear, exportar y visualizar valores de variables shell. Puede investigar el resto de las opciones desety del comandodeclaremediante las pginas man. Nos referiremos a las pginas man ms adelante en esta seccin. Exec El ltimo comando que explicaremos en esta seccin esexec. Puede usar el comandoexecpara ejecutar otro programa que reemplace al shell actual. En el Listado 13 se inicia un shell bash secundario y luego se usaexecpara reemplazarlo por un shell Korn. Luego de salir del shell Korn, se vuelve al shell bash original (en este ejemplo, PID 22985). Listado 13. Uso de exec
[ian@echidna ian]$ echo $$ 22985 [ian@echidna ian]$ bash [ian@echidna ian]$ echo $$ 25063 [ian@echidna ian]$ exec ksh $ echo $$ 25063 $ exit [ian@echidna ian]$ echo $$ 22985

Volver arriba Historial de comandos Si usted est ingresando comandos mientras sigue este tutorial, probablemente habr notado que se us varias veces un mismo comando, o un mismo comando con cambios mnimos. Una buena noticia es que el shell bash puede mantener un

historial de sus comandos. El historial est activado de manera predeterminada. Puede desactivarlo usando el comandoset +o historyy volverlo a activar usandoset -o history. La variable de entorno denominada HISTSIZE le indica a bash la cantidad de lneas a mantener en el historial. Otra serie de configuraciones controlan el funcionamiento y la gestin del historial. Para obtener informacin completa acerca de este tema, consulte las pginas man de bash. Algunos de los comandos que pueden usarse con la facilidad de historial son: history Muestra todo el historial history N Muestra las ltimas lneasNde su historial history -dN Elimina una lneaNde su historial; puede usar este comando cuando, por ejemplo, una lnea contiene una contrasea !! Muestra el comando ms reciente !N Muestra el comando del historial en la posicinN !-N Muestra el comando que se encuentraNcomandos atrs en el historial (!-1 es equivalente a !!) !# Muestra el comando actual que est ingresando en el momento !string Muestra el comando ms reciente que comienza constring !?string? Muestra el comando ms reciente que contienestring Adems, puede usar los dos puntos (:) seguidos por ciertos valores para acceder o para modificar una parte o un comando de su historial. El Listado 14 muestra algunas capacidades del historial. Listado 14. Manipulacin del historial
[ian@echidna ian]$ echo $$ 22985 [ian@echidna ian]$ env -i bash -c 'echo $$' 1542 [ian@echidna ian]$ !! env -i bash -c 'echo $$' 1555 [ian@echidna ian]$ !ec echo $$ 22985 [ian@echidna ian]$ !en:s/$$/$PPID/ env -i bash -c 'echo $PPID' 22985

[ian@echidna ian]$ history 6 1097 echo $$ 1098 env -i bash -c 'echo $$' 1099 env -i bash -c 'echo $$' 1100 echo $$ 1101 env -i bash -c 'echo $PPID' 1102 history 6 [ian@echidna ian]$ history -d1100

Los comandos del Listado 14 realizan las siguientes operaciones: 1. Se hace eco del PID del shell actual 2. Se ejecuta un comando echo en un nuevo shell y se hace eco del PID de dicho shell 3. Se vuelve a ejecutar el ltimo comando 4. Se vuelve a ejecutar el ltimo comando que comienza con 'ec'; esto vuelve a ejecutar el primer comando de este ejemplo 5. Se vuelve a ejecutar el ultimo comando que comienza con 'en'; pero, al sustituir '$PPID' por '$$', se visualiza el PID primario 6. Se visualizan los ltimos 6 comandos del historial 7. Se elimina la entrada de historial 1100, el ltimo comando echo Tambin es posible editar el historial de forma interactiva. El shell bash usa la biblioteca readline para gestionar la edicin y el historial de comandos. Las teclas y combinaciones de teclas predeterminadas para desplazarse dentro del historial o las lneas de edicin son similares a las usadas en el editor Emacs de GNU. Las combinaciones de pulsacin de teclas Emacs suelen expresarse de la siguiente manera:C-x o M-x, donde x es una tecla comn y C y M son las teclas Control y Meta, respectivamente. En un sistema de PC tpico, la tecla Ctrl funciona como la tecla Control de Emacs y la tecla Alt Funciona como la tecla Meta. La Tabla 5 resume algunas de las funciones de edicin del historial disponibles. Adems de las combinaciones de teclas mostradas en la Tabla 5, las teclas de movimiento del cursor (flechas derecha, izquierda, arriba y abajo) y las teclas Home (Inicio) y End (Fin) generalmente estn configuradas para funcionar de manera lgica. Consulte las pginas man para obtener informacin acerca de funciones adicionales y de cmo personalizar estas opciones usando un archivo readline init (generalmente, inputrc de su directorio principal). Tabla 5. Edicin del historial con comandos emacs Tecla comn Comando Descripcin de PC C-f Flecha Mueve el cursor un espacio hacia la derecha derecha C-b Flecha Mueve el cursor un espacio hacia la izquierda izquierda M-f Alt-f Mover el cursor al comienzo de la siguiente palabra;

M-b Alt-b C-a Home C-e End BackspaceBackspace C-d Del C-k M-d C-y Ctrl-k Alt-d Ctrl-y

los entornos GUI generalmente usan esta combinacin de teclas para abrir el men File de la ventana Mover el cursor al comienzo de la siguiente palabra Mover el cursor al comienzo de la lnea Mover el cursor al fin de la lnea Borrar el carcter anterior al cursor Borrar el carcter posterior al cursor (Las funciones Del y Backspace pueden configurarse de manera inversa) Borrar (kill) hasta el final de la lnea y guardar el texto eliminado para su uso posterior Borrar (kill) hasta el final de la palabra y guardar el texto eliminado para su uso posterior Volver a insertar el texto eliminado con un comando kill

Si prefiere manipular el historial usando un modo de edicin de tipo vi, use el comandoset -o vipara pasar a modo vi. Para volver al modo emacs, useset -o emacs. Cuando se recupera un comando en modo vi, en principio estar en modo insert (insertar) de vi. Nos referiremos al editor vi en la seccin Edicin de archivos con vi. Volver arriba Rutas Algunos comandos bash estn incorporados, mientras que otros son externos. Analicemos ahora los comandos externos, cmo ejecutarlos y cmo saber si un comando es interno. Dnde encuentra los comandos el shell? Los comandos externos son simplemente archivos que se encuentran dentro de su sistema de archivos. La seccin posterior, Gestin bsica de archivos, de este tutorial y del tutorial para el Tema 104 abordan el tema en mayor profundidad. En sistemas Linux y UNIX, se accede a todos los archivos como parte de un mismo gran rbol con raz en /. En los ejemplos proporcionados hasta el momento, nuestro directorio actual fue el directorio principal del usuario. Los usuarios no root suelen tener un directorio dentro del /home directory (directorio principal), por ejemplo: /home/ian, en mi caso. El directorio principal de root suele ser /root. Al ingresar un nombre de comando, bash busca dicho comando en suruta, la cual es una lista de directorios separados por comas dentro de la variable de entorno PATH.

Si desea saber qu comando se ejecutar si ingresa una cadena en particular, use el comandowhichotype. El Listado 15 muestra mi ruta predeterminada junto con las ubicaciones de varios comandos. Listado 15. Bsqueda de ubicaciones de comandos
[ian@echidna ian]$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/ian/bin [ian@echidna ian]$ which bash env zip xclock echo set ls alias ls='ls --color=tty' /bin/ls /bin/bash /bin/env /usr/bin/zip /usr/X11R6/bin/xclock /bin/echo /usr/bin/which: no set in (/usr/local/bin:/bin:/usr/bin:/usr/X11R6/b in:/home/ian/bin) [ian@echidna ian]$ type bash env zip xclock echo set ls bash is /bin/bash env is /bin/env zip is /usr/bin/zip xclock is /usr/X11R6/bin/xclock echo is a shell builtin set is a shell builtin ls is aliased to `ls --color=tty'

Obsrvese que todos los directorios incluidos en la ruta terminan en /bin. Esta es una convencin comn, pero no es un requisito. El comandowhichinform que el comandolses unaliasy que no se pudo encontrar el comandoset. En este caso, interpretamos que, o bien el comando no existe, o se trata de un comando incorporado. El comandotypeinforma que el comandolses unaliaspero identifica al comandosetcomo un comando incorporado a shell. Tambin informa que existe un comandoechoincorporado adems del quewhichencontr en /bin. Los dos comandos tambin producen datos de salida en diferentes rdenes. Vimos que el comandols, usado para listar el contenido de directorios, es unalias. Los alias son una forma prctica de configurar algunos comandos para usar diferentes conjuntos de elementos predeterminados o para proporcionar un nombre alternativo a un comando. En nuestro ejemplo, la opcin--color=ttyhace que los listados de directorios aparezcan codificados por colores en base al tipo de archivo o directorio. Pruebe ejecutardircolors --print-databasepara ver cmo se controlan los cdigos por color y qu color se usa para cada tipo de archivo. Estos comandos tienen otras opciones adicionales. Elija el comando que mejor responda a sus necesidades. Personalmente, suelo usarwhichcuando estoy casi seguro de que encontrar el ejecutable y solamente necesito obtener su

especificacin de ruta completa. Creo quetypeproporciona informacin ms precisa, que puede ser necesaria en un shell script. Ejecucin de otros comandos Vimos en el Listado 15 que los archivos ejecutables tienen una ruta completa que comienza con /, el directorio root. Por ejemplo, el programa xclock es realmente /usr/X11R6/bin/xclock, un archivo ubicado en el directorio /usr/X11R6/bin. Aunque un comando no se encuentre en su especificacin de ruta o PATH, podr ejecutarlo si especifica una ruta y un nombre de comando. Se pueden usar dos tipos de rutas:
y y

Rutas absolutas, que comienzan con /, como las vistas en el Listado 15 (/bin/bash, /bin/env, etc). Rutas relativas, que son relativas con respecto a sudirectorio en funcionamientocomo lo informa el comandopwd. Estos comandos no comienzan con / pero contienen al menos una /.

Puede usar rutas absolutas sin importar cul sea su directorio en funcionamiento, pero probablemente slo pueda usar rutas relativas cuando el comando est cerca de su directorio actual. Supongamos que nos encontramos desarrollando una nueva versin del clsico programa "Hello World!" en un subdirectorio de su directorio principal llamado mytestbin. Podra usar la ruta relativa para ejecutar sus comandos comomytestbin/hello. Puede usar dos nombres especiales en una ruta; un slo punto (.) hace referencia al directorio actual, y dos puntos seguidos (..) hace referencia al directorio actual primario. Debido a que su directorio principal no suele ni (por lo general) debe estar en su PATH, deber explicitar una ruta para todo ejecutable que quiera ejecutar desde su directorio principal. Por ejemplo, si tuviera una copia del programa hello en su directorio principal, podra ejecutarlo usando el comando./hello. Puede usar tanto. como .. como parte de una ruta absoluta, aunque un slo . no resulta demasiado til en un caso como ste. Tambin puede usar una virgulilla (~) para referirse a su propio directorio principal y ~usernamepara referirse al directorio principal del usuario llamadousername. El Listado 16 muestra algunos ejemplos. Listado 16. Rutas absolutas y relativas
[ian@echidna ian]$ /bin/echo Use echo command rather than builtin Use echo command rather than builtin [ian@echidna ian]$ /usr/../bin/echo Include parent dir in path Include parent dir in path [ian@echidna ian]$ /bin/././echo Add a couple of useless path components Add a couple of useless path components [ian@echidna ian]$ pwd # See where we are /home/ian [ian@echidna ian]$ ../../bin/echo Use a relative path to echo Use a relative path to echo [ian@echidna ian]$ myprogs/hello # Use a relative path with no dots -bash: myprogs/hello: No such file or directory

[ian@echidna ian]$ mytestbin/hello # Use a relative path with no dots Hello World! [ian@echidna ian]$ ./hello # Run program in current directory Hello World! [ian@echidna mytestbin]$ ~/mytestbin/hello # run hello using ~ Hello World! [ian@echidna ian]$ ../hello # Try running hello from parent -bash: ../hello: No such file or directory

Modificacin del directorio en funcionamiento As como puede ejecutar programas de distintos directorios de su sistema, tambin es posible modificar el directorio en funcionamiento mediante el comandocd. El argumento decddebe ser una ruta absoluta o relativa a un directorio. Con respecto a los comandos, puede usar ., .., ~ y ~usernameen las rutas. Si usacdsin parmetros, el cambio se realizar en su directorio principal. Como parmetro, un slo guin (-) significa que el cambio se aplicar en el directorio anteriormente en funcionamiento. Su directorio principal se almacena en la variable de entorno HOME y el directorio anterior se almacena en la variable OLDPWD , por lo tanto,cdslo es equivalente acd $HOMEycd -es equivalente acd $OLDPWD. Cuando digamoscambiar el directorionos estaremos refiriendo acambiar el directorio en funcionamiento. En cuanto a los comandos, tambin existe una variable de entorno, CDPATH, que contiene el conjunto de directorios separados por dos puntos que deben buscarse al resolver rutas relativas (adems del directorio en funcionamiento). Si en la resolucin se usa una ruta de CDPATH,cdimprimir la ruta completa del directorio obtenido como datos de salida. Normalmente, una modificacin exitosa en un directorio genera como datos de salida solamente un prompt nuevo y probablemente modificado. El Listado 17 muestra algunos ejemplos. Listado 17. Modificacin de directorios
[ian@echidna home]$ cd /;pwd / [ian@echidna /]$ cd /usr/X11R6;pwd /usr/X11R6 [ian@echidna X11R6]$ cd ;pwd /home/ian [ian@echidna ian]$ cd -;pwd /usr/X11R6 /usr/X11R6 [ian@echidna X11R6]$ cd ~ian/..;pwd /home [ian@echidna home]$ cd ~;pwd /home/ian [ian@echidna ian]$ export CDPATH=~ [ian@echidna mytestbin]$ cd /;pwd /

[ian@echidna /]$ cd mytestbin /home/ian/mytestbin

Volver arriba Aplicacin recursiva de comandos Muchos comandos Linux pueden aplicarse recursivamente a todos los archivos que se encuentran en un rbol de directorio. Por ejemplo, el comandolstiene una opcin-Rpara listar directorios recursivamente y los comandoscp,mv,rmydifftienen una opcin-rpara su aplicacin recursiva. La seccin Gestin bsica de archivos explica en profundidad la aplicacin recursiva de comandos. Volver arriba Sustitucin de comandos El shell bash tiene una capacidad muy potente que permite usar los resultados de un comando como datos de entrada de otro comando; esto se denominasustitucin de comandos. La sustitucin de comandos puede llevarse a cabo ingresando entre acentos graves (`) el comando cuyos resultados se desean usar. Esta forma se sigue usando con frecuencia; sin embargo, una opcin que resulta ms sencilla cuando se trabaja con comandos anidados mltiples es ingresar el comando entre $( y ). En el tutorial anterior, "LPI exam 101 prep (topic 102): Linux installation and package management," vimos que el comandorpmpoda indicar de cul paquete proviene un comando; en ese caso, usamos la capacidad de sustitucin de comandos, que result una tcnica prctica. Ahora realmente comprendemos lo que estbamos haciendo. La sustitucin de comandos es una herramienta muy valiosa en los shell scripts y tambin resulta til en la lnea de comandos. El Listado 18 muestra un ejemplo de cmo obtener una ruta absoluta de un directorio desde una ruta relativa, cmo averiguar qu RPM proporciona el comando /bin/echo y cmo listar (como root) los rtulos de tres particiones en un disco duro. Por ltimo, se usa el comandoseqpara generar una secuencia de nmeros enteros. Listado 18. Sustitucin de comandos
[ian@echidna ian]$ echo '../../usr/bin' dir is $(cd ../../usr/bin;pwd) ../../usr/bin dir is /usr/bin [ian@echidna ian]$ which echo /bin/echo [ian@echidna ian]$ rpm -qf `which echo` sh-utils-2.0.12-3

[ian@echidna ian]$ su Password: [root@echidna root]# for n in $(seq 7 9); do echo p$n `e2label /dev/hda$n`;done p7 RH73 p8 SUSE81 p9 IMAGES

Volver arriba Pginas man El ltimo tema de esta seccin del tutorial explica cmo obtener documentacin de comandos Linux a travs de pginas manuales y otras fuentes de documentacin. Pginas y secciones manuales La principal (y tradicional) fuente de documentacin son laspginas manuales, a las cuales se puede acceder usando el comandoman. La Figura 1 muestra la pgina manual del comandoman. Use el comandoman manpara visualizar esta informacin. Figura 1. Pgina man del comando man

La Figura 1 muestra los elementos tpicos de las pginas man:

y y y y y

Un encabezado con el nombre del comando seguido por su correspondiente nmero de seccin entre parntesis El nombre del comando y de todos los comandos relacionados que se describen en esta pgina man Una sinopsis de las opciones y los parmetros aplicables al comando Una breve descripcin del comando Informacin detallada de cada una de las opciones

Pueden existir otras secciones que proporcionen descripciones del uso, expliquen cmo informar errores y brinden informacin acerca del autor y una lista de comandos relacionados (de haberlos). Por ejemplo, la pgina man demannos informa que los comandos relacionados (y sus secciones manuales) son: apropos(1), whatis(1), less(1), groff(1) y man.conf(5). Existen ocho secciones de pginas manuales comunes. Las pginas manuales suelen instalarse con la instalacin de un paquete, por lo tanto, si usted no tiene instalado un paquete en particular, probablemente no tenga una pgina manual acerca de dicho paquete. Asimismo, es posible que algunas de sus secciones manuales estn vacas o casi vacas. Las secciones manuales comunes y los ejemplos proporcionados en ellas son: 1. 2. 3. 4. 5. 6. Comandos de usuario (env, ls, echo, mkdir, tty) Llamadas al sistema o funciones kernel (link, sethostname, mkdir) Rutinas de bibliotecas (acosh, asctime, btree, locale, XML::Parser) Informacin relacionada con dispositivos (isdn_audio, mouse, tty, zero) Descripciones de formatos de archivos (keymaps, motd, wvdial.conf) Juegos (obsrvese que, en la actualidad, muchos juegos son grficos y proporcionan ayuda grfica fuera del sistema de pginas man) 7. Miscelneo (arp, boot, regex, unix utf8) 8. Administracin de sistemas (debugfs, fdisk, fsck, mount, renice, rpm) Otras secciones que podran estar disponibles son:9, documentacin del kernel Linux,n, documentacin nueva,o, documentacin antigua yl, documentacin local. Algunas entradas se repiten en varias secciones. Nuestros ejemplos muestran que mkdir est incluido en las secciones 1 y 2, mientras que tty aparece en las secciones 1 y 4. Es posible especificar una seccin en particular, por ejemplo:man 4 ttyoman 2 mkdir, o especificar la opcin-apara listar todas las secciones manuales pertinentes. Al observar la figura anterior, probablemente haya notado quemantiene numerosas opciones. Puede estudiar dichas opciones por su cuenta. Por el momento, nos referiremos a algunos de los comandos incluidos en "See also" (Ver tambin) que se relacionan conman. See also

Dos comandos importantes relacionados conmansonwhatisyapropos. El comandowhatisbusca pginas man con el nombre por usted ingresado y muestra la informacin de nombres de las pginas manuales pertinentes. El comandoaproposrealiza una bsqueda de palabras claves en las pginas manuales y lista las que contienen las palabras claves ingresadas. El Listado 19 muestra estos comandos. Listado 19. Ejemplos de whatis y apropos
[ian@lyrebird ian]$ whatis man man (1) - format and display the on-line manual pages man (7) - macros to format man pages man [manpath] (1) - format and display the on-line manual pages man.conf [man] (5) - configuration data for man [ian@lyrebird ian]$ whatis mkdir mkdir (1) - make directories mkdir (2) - create a directory [ian@lyrebird ian]$ apropos mkdir mkdir (1) - make directories mkdir (2) - create a directory mkdirhier (1x) - makes a directory hierarchy

Por cierto, si no logra encontrar la pgina manual de man.conf, intntelo ejecutandoman man.config. Los datos de salida de las pginas del comandomanse visualizan usando un programa de paginacin. En la mayora de los sistemas Linux, suele ser el programaless. Otra posibilidad es un programa ms antiguo llamadomore. Si desea imprimir la pgina, especifique la opcin-tpara dar formato de impresin a la pgina usando el programagroffotroff. El paginador less tiene varios comandos para buscar cadenas dentro de los datos de salida mostrados. Useman lesspara conocer ms acerca de/(buscar hacia delante),?(buscar hacia atrs), yn(repetir ltima bsqueda), entre muchos otros comandos. Otras fuentes de documentacin Adems de las pginas manuales a las que se puede acceder desde una lnea de comandos, la Fundacin para el Software Libre cre una serie de archivosinfoque se procesan con el programainfo. Estos archivos proporcionan una gran variedad de facilidades de navegacin, como la capacidad de saltar a otras secciones. Ingreseman infooinfo infopara obtener ms informacin. Como no todos los comandos estn documentados en info, aunque se convierta en usuario info, deber usar info y man simultneamente.

Adems, las pginas man ofrecen algunas interfaces grficas, comoxman(de XFree86 Project) yyelp(del navegador de ayuda Gnome 2.0). Si no logra encontrar ayuda con respecto a un comando, intente ejecutando el comando con la opcin--help. De esta manera, probablemente obtenga la ayuda del comando o se le informe cmo obtener la ayuda que necesita. La prxima seccin se refiere al procesamiento de flujos de texto con filtros. Flujos de texto y filtros Esta seccin cubre materiales para el tema 1.103.2 del examen 101 de Administracin de Nivel Junior (LPIC-1). Este tema tiene un valor de ponderacin de 6. Esta seccin aborda los siguientes temas:
y y

Envo de archivos de texto y flujos de salida a travs de filtros de utilidades de texto para modificar los datos de salida Uso de los comandos UNIX estndar incluidos en el paquete textutils de GNU

Filtrado de textos Se denominafiltradode textos al proceso de tomar un flujo de entrada de texto y realizar algn tipo de conversin en el texto antes de enviarlo a un flujo de salida. Aunque tanto los datos de entrada como los de salida pueden provenir de un archivo, en los entornos Linux y UNIX, el filtrado suele realizarse construyendo unacanalizacinde comandos en la que los datos de salida de un comando secanalizanoredirigenpara ser usados como datos de entrada del siguiente comando. Las canalizaciones y los redireccionamientos se abordan con mayor profundidad en la seccin acerca de Flujos, canalizaciones y redireccionamientos. Por el momento, analicemos las canalizaciones y el redireccionamiento de datos de salida de nivel bsico usando los operadores | y >. Canalizacin con | Como vimos en la seccin anterior, los shells usan tresflujosde entrada/salida estndar:
y y y

stdines elflujo de entrada estndary proporciona los datos de entrada a los comandos. stdoutes elflujo de salida estndary muestra los datos de salida de los comandos. stderres elflujo de error estndary muestra datos de salida de error de los comandos.

Hasta el momento, los datos de entrada de este tutorial provinieron de parmetros que proporcionamos a los comandos, y los datos de salida se visualizaron en nuestra terminal. Muchos comandos de procesamiento de texto (filtros) pueden tomar datos de salida tanto del flujo de entrada estndar como de un archivo. Para usar los datos de salida de un comando (command1) como datos de entrada de un filtro (command2) debe conectar los comandos usando el operador de canalizaciones (|), como muestra el Listado 20. Listado 20. Canalizacin de los datos de salida de command1 a los datos de entrada de command2
command1 | command2

Ambos comandos pueden tener opciones o argumentos, lo cual abordaremos ms adelante en esta seccin. | tambin puede usarse para redirigir los datos de salida de command2 de esta canalizacin hacia otro comando adicional, command3. La construccin de canalizaciones extensas de comandos con capacidades individuales limitadas es una forma comn de completar tareas en Linux y UNIX. Tambin es frecuente el uso de un guin (-) en lugar de un nombre de archivo como argumento de un comando, lo cual significa que los datos de entrada provendrn de stdin y no de un archivo. Redireccionamiento de los datos de salida con > Si bien es importante tener la posibilidad de crear una canalizacin de varios comandos y visualizar los datos de salida en la terminal, en algunas ocasiones se requerir guardar los datos de salida en un archivo. Esto es posible mediante el operador de redireccionamiento de datos de salida (>). A continuacin en esta seccin, usaremos algunos archivos pequeos. Procedamos a crear un directorio llamado lpi103 y a crear cd dentro de dicho directorio. Luego usaremos > para redirigir los datos de salida del comandoechoa un archivo llamado text1. El Listado 21 muestra todas estas operaciones. Obsrvese que los datos de salida no se visualizan en la terminal porque se han redirigido al archivo. Listado 21. Canalizacin de los datos de salida del command1 a un archivo
[ian@echidna ian]$ mkdir lpi103 [ian@echidna ian]$ cd lpi103 [ian@echidna lpi103]$ echo -e "1 apple\n2 pear\n3 banana">text1

Ahora que contamos con las herramientas bsicas para la canalizacin y el redireccionamiento, analicemos algunos de los comandos y filtros de

procesamiento de texto ms comunes de UNIX y Linux. Esta seccin muestra slo algunas de las capacidades bsicas; consulte las pginas man correspondientes para conocer ms acerca de estos comandos. Volver arriba Cat, tac, od y split Revisemos el contenido del archivo test1 creado anteriormente. Use el comandocat(concatenar)para visualizar el contenido de un archivo en stdout. El Listado 22 verifica el contenido del archivo antes creado. Listado 22. Vsualizacin de contenido de archivos con cat
[ian@echidna lpi103]$ cat text1 1 apple 2 pear 3 banana

El comandocattoma los datos de entrada de stdin si no se especifica el nombre de archivo (o si se especifica como nombre de archivo). Usemos este comando junto con el redireccionamiento de los datos de salida para crear otro archivo de texto, como muestra el Listado 23. Listado 23. Creacin de un archivo de texto con cat
[ian@echidna lpi103]$ cat>text2 9 plum 3 banana 10 apple

En el Listado 23,catsigue leyendo desde stdin hasta el final del archivo. Use la combinacin Ctrl-d (mantenga apretada la tecla Ctrl y presione la tecla d) para indicar el final del archivo. sta es la misma combinacin de teclas que se usa para salir del shell bash. Tambin tenga en cuenta que la tecla tab lo ayuda a alinear los nombres de las frutas en una columna. A veces, es posible que usted desee visualizar un archivo en orden inverso. Obviamente, tambin existe un filtro de texto para ello. A ste se lo denominatac(que escatal revs). El Listado 24 muestra el archivo text2 nuevo y el archivo text1 viejo en orden inverso. Vea cmo la visualizacin simplemente concatena los dos archivos. Listado 24. Visualizacin inversa con tac
[ian@echidna lpi103]$ tac text2 text1 10 apple 3 banana 9 plum 3 banana 2 pear 1 apple

Ahora, suponga que usted visualiza los dos archivos de texto usando cat o tac y puede observar diferencias de alineacin. Para saber qu est causando esto, usted debe prestar atencin a los caracteres de control que se encuentran en el archivo. Como estos se ponen en prctica en los datos de salida de visualizacin de texto en vez de representar en alguna forma el carcter de control que se visualiza, debemosvolcarel archivo en un formato que le permita encontrar e interpretar estos caracteres especiales. Las utilidades de texto de GNU incluyen un comandood(uOctalDump) para esto. Existen varias opciones paraod, como por ejemplo la opcin-Apara controlar la raz de las compensaciones del archivo y-tpara controlar la forma de los contenidos del archivo visualizado. La raz se puede especificar como o (octal - la predeterminada), d (decimal), x (hexadecimal), o n (no se visualiza ninguna compensacin). Usted puede visualizar los datos de salida como octal, hexadecimal, decimal, punto flotante, ASCII con escapes con barra invertida o caracteres nombrados (nl para una lnea nueva, ht para un tabulador horizontal, etc.). El Listado 25 le muestra algunos de los formatos disponibles para volcar el archivo text2 a modo de ejemplo. Listado 25. Volcado de archivos con od
[ian@echidna lpi103]$ od text2 0000000 004471 066160 066565 031412 061011 067141 067141 005141 0000020 030061 060411 070160 062554 000012 0000031 [ian@echidna lpi103]$ od -A d -t c text2 0000000 9 \t p l u m \n 3 \t b a n a n a \n 0000016 1 0 \t a p p l e \n 0000025 [ian@echidna lpi103]$ od -A n -t a text2 9 ht p l u m nl 3 ht b a n a n a nl 1 0 ht a p p l e nl

Notas: 1. La opcin-Adecatle ofrece una forma alternativa de ver dnde se encuentran sus tabuladores y finales de lnea. Vea la pgina man para obtener mayor informacin al respecto. 2. Si usted cuenta con un entorno mainframe, probablemente le interese conocer la utilidad hexdump, que forma parte de un conjunto diferente de utilidades. Como este tema no se trata aqu, sea tan amable de ver las pginas man para obtener mayor informacin. Nuestros archivos a modo de ejemplo son muy pequeos. Pero, a veces, usted tendr archivos grandes que tendr que dividir en partes ms pequeas. Por ejemplo, es probable que desee dividir un archivo grande en partes que entren en un CD con el objetivo de mandar todo esto a alguien por correo para que cree un

DVD para usted. El comandosplithar esto de tal forma que el comandocatse podr usar para recrear el archivo con gran facilidad. De manera predeterminada, los archivos que resultan del comandosplittienen un prefijo en su nombre de "x" seguido por un sufijo de "aa", "ab", "ac", ..., "ba", "bb", etc. Las opciones le permiten modificar estos valores predeterminados. Usted tambin puede controlar el tamao de los archivos de salida y determinar si los archivos resultantes contienen lneas completas o slo cantidades de bytes. El Listado 26 ilustra la divisin de nuestros dos archivos de texto con diferentes prefijos para los archivos de salida. Dividimos text1 en archivos que contienen dos lneas como mucho y text2 en archivos que contienen 18 bytes como mucho. Luego de esto, usamoscatpara visualizar algunas de las partes de manera individual y para visualizar un archivo completo usandoglobbing, que se describe en la seccin denominada Comodines y globbing ms adelante en este tutorial. Listado 26. Divisin y recombinacin con split y cat
[ian@echidna lpi103]$ split -l 2 text1 [ian@echidna lpi103]$ split -b 18 text2 y [ian@echidna lpi103]$ cat yaa 9 plum 3 banana 10[ian@echidna lpi103]$ cat yab apple [ian@echidna lpi103]$ cat y* 9 plum 3 banana 10 apple

Tenga en cuenta que el archivo dividido denominado yab no finaliz con un carcter de lnea nueva. Por lo tanto, nuestro prompt se compens luego de que usramoscatpara visualizarlo. Volver arriba Wc, head y tail
Catytacvisualizan todo el archivo. Eso est bien para el caso de archivos pequeos

(como los de nuestros ejemplos). Pero supongamos que usted tiene un archivo grande. En primer lugar, es probable que desee usar el comandowc(WordCount) para ver el tamao real del archivo. El comandowcvisualiza la cantidad de lneas, palabras y bytes que tiene un archivo. Tambin puede visualizar la cantidad de bytes usandols -l. El Listado 27 le muestra el listado de directorios de formato largo para nuestros dos archivos de texto y el resultado del comandowc. Listado 27. Uso de wc con archivos de texto
[ian@echidna lpi103]$ ls -l text*

-rw-rw-r-- 1 ian ian 24 Sep 23 12:27 text1 -rw-rw-r-- 1 ian ian 25 Sep 23 13:39 text2 [ian@echidna lpi103]$ wc text* 3 6 24 text1 3 6 25 text2 6 12 49 total

Las opciones le permiten controlar el resultado del comandowco visualizar otra informacin (como, por ejemplo, la longitud mxima de la lnea). Vea la pgina man para mayor informacin. Dos comandos le permiten visualizar la primera parte (cabeza) o la ltima parte (cola). Estos comandos son:headytail. Se los puede usar como filtros o pueden tomar el nombre de un archivo como un argumento. De manera predeterminada, visualizan las primeras (o las ltimas) 10 lneas del archivo / flujo. El Listado 28 usa el comandodmesgpara visualizar los mensajes de arranque, junto conwc,tail, yheadpara descubrir que hay 177 mensajes. Luego de esto, se visualizan los ltimos 10 de estos. Y, por ltimo, se visualizan los seis mensajes que comienzan a 15 desde el final. Algunas de las lneas que figuran en este archivo de salida figuran truncadas (lo que se indica con ...). Listado 28. Uso de wc, head y tail para visualizar mensajes de arranque
[ian@echidna lpi103]$ dmesg | wc 177 1164 8366 [ian@echidna lpi103]$ dmesg | tail i810: Intel ICH2 found at IO 0x1880 and 0x1c00, MEM 0x0000 and ... i810_audio: Audio Controller supports 6 channels. i810_audio: Defaulting to base 2 channel mode. i810_audio: Resetting connection 0 ac97_codec: AC97 Audio codec, id: ADS98 (Unknown) i810_audio: AC'97 codec 0 Unable to map surround DAC's (or ... i810_audio: setting clocking to 41319 Attached scsi CD-ROM sr0 at scsi0, channel 0, id 0, lun 0 sr0: scsi3-mmc drive: 0x/32x writer cd/rw xa/form2 cdda tray Uniform CD-ROM driver Revision: 3.12 [ian@echidna lpi103]$ dmesg | tail -n15 | head -n 6 agpgart: Maximum main memory to use for agp memory: 941M agpgart: Detected Intel i845 chipset agpgart: AGP aperture is 64M @ 0xf4000000 Intel 810 + AC97 Audio, version 0.24, 13:01:43 Dec 18 2003 PCI: Setting latency timer of device 00:1f.5 to 64 i810: Intel ICH2 found at IO 0x1880 and 0x1c00, MEM 0x0000 and ...

Otro uso comn detailconsiste enseguirun archivo usando la opcin-f, generalmente con un conteo de lnea de 1. Usted puede usar esto cuando tenga un proceso de segundo plano que est generando informacin en un archivo y

usted desee ver cmo est saliendo todo. En este modo,tailse ejecutar hasta que usted lo cancele (usando Ctrl-c) y visualizar las lneas a medida que se van escribiendo en el archivo. Volver arriba Expand, unexpand y tr Cuando creamos nuestros archivos text1 y text2, creamos text2 con caracteres de tabulacin. A veces, es posible que usted desee intercambiar tabuladores por espacios o viceversa. Los comandosexpandyunexpandse encargan de hacer esto. La opcin-tque se agrega a ambos comandos le permite configurar las detenciones del tabulador. Un solo valor configura tabuladores que se repiten cada dicho intervalo. El Listado 29 le muestra cmo expandir los tabuladores en text2 para que pasen a significar un solo espacio y otra secuencia arbitraria deexpandyunexpandque alinea el texto que figura en text2. Listado 29. Uso de expand y unexpand
[ian@echidna lpi103]$ expand -t 1 text2 9 plum 3 banana 10 apple [ian@echidna lpi103]$ expand -t8 text2|unexpand -a -t2|expand -t3 9 plum 3 banana 10 apple

Desafortunadamente, usted no puede usarunexpandpara reemplazar los espacios que figuran en text1 por tabuladores, ya queunexpandrequiere dos espacios por lo menos para realizar la conversin a tabuladores. Sin embargo, usted puede usar el comandotr, que convierte los caracteres en un conjunto (set1) en los caracteres correspondientes en otro conjunto (set2). El Listado 30 le muestra cmo usar el comandotrpara convertir espacios en tabuladores. Como el comandotres slo un filtro, usted genera datos de entrada para l usando el comandocat. Este ejemplo tambin ilustra el uso de - para indicar los datos de entrada estndar paracat. Listado 30. Uso de expand y unexpand
[ian@echidna lpi103]$ cat text1 |tr ' ' '\t'|cat - text2 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple

Si no comprende bien qu ocurri en los dos ltimos ejemplos, intente usar el comandoodpara terminar cada etapa de la canalizacin en cuestin. Por ejemplo:
cat text1 |tr ' ' '\t' | od -tc

Volver arriba Pr, nl y fmt El comandoprse usa para formatear archivos para que se los pueda imprimir. El encabezado predeterminado incluye el nombre del archivo y la fecha y la hora de creacin del archivo, junto con un nmero de pgina y dos lneas de pie de pgina en blanco. Cuando se crean datos de salida desde varios archivos o desde el flujo de datos de entrada estndar, se usa la fecha y la hora actual en vez del nombre del archivo y la fecha de creacin. Usted puede imprimir archivos uno al lado del otro en columnas y controlar muchos aspectos relativos al formateo a travs de las opciones. Como siempre, vea la pgina man para mayor informacin. El comandonlenumera las lneas, lo que puede resultar bastante conveniente al momento de imprimir los archivos. Usted tambin puede enumerar las lneas con la opcin-ndel comandocat. El Listado 31 le muestra cmo imprimir nuestro archivo text1 y, luego de esto, cmo enumerar text2 e imprimirlo al lado de text1. Listado 31. Enumeracin y formateo para impresin
[ian@echidna lpi103]$ pr text1 | head 2005-09-23 12:27 1 apple 2 pear 3 banana [ian@echidna lpi103]$ nl text2 | pr -m - text1 | head 2005-09-26 11:48 1 9 2 3 3 10 plum banana apple 1 apple 2 pear 3 banana Page 1 text1 Page 1

Otro comando muy til para formatear textos esfmt, que formatea al texto en cuestin para que se adece a los mrgenes establecidos. Usted puede juntar varias lneas cortas y dividir las lneas largas. En el Listado 32, creamos text3 con una sola lnea larga de texto usando las variantes de la funcin histrica!#:*para no tener que escribir nuestra oracin cuatro veces. Tambin creamos text4 con una

palabra por lnea. Luego de esto, usamos el comandocatpara visualizar todo esto sin ningn formato, incluyendo un carcter "$" visualizado para mostrar el final de las lneas. Por ltimo, usamos el comandofmtpara formatear las lneas de manera tal que no excedan los 60 caracteres. Una vez ms, vea la pgina man para mayor informacin sobre todas las opciones adicionales. Listado 32. Formateo de la longitud mxima de lnea
[ian@echidna lpi103]$ echo "This is a sentence. " !#:* !#:1-$>text3 echo "This is a sentence. " "This is a sentence. " "This is a sentenc e. " "This is a sentence. ">text3 [ian@echidna lpi103]$ echo -e "This\nis\nanother\nsentence.">text4 [ian@echidna lpi103]$ cat -et text3 text4 This is a sentence. This is a sentence. This is a sentence. This i s a sentence. $ This$ is$ another$ sentence.$ [ian@echidna lpi103]$ fmt -w 60 text3 text4 This is a sentence. This is a sentence. This is a sentence. This is a sentence. This is another sentence.

Volver arriba Sort y uniq El comandosortordena los datos de entrada usando la secuencia de intercalacin para el lugar (LC_COLLATE) del sistema. El comandosorttambin puede fusionar archivos ya ordenados y verificar si un archivo est ordenado o no. El Listado 33 ilustra el uso del comandosortpara ordenar nuestros dos archivos de texto luego de convertir los espacios en blanco en tabuladores en text1. Como el orden de organizacin es por carcter, los resultados lo pueden llegar a sorprender. Afortunadamente, el comandosortpuede ordenar por valores numricos y por caracteres. Usted puede especificar esta opcin para todo el registro o para cadacampo. A menos que especifique un separador de campo diferente, los campos se delimitan por medio de espacios en blanco o tabuladores. El segundo ejemplo en el Listado 33 le muestra cmo se ordena el primer campo numricamente y el segundo campo por medio de la secuencia de intercalacin (alfabticamente). Tambin ilustra el uso de la opcin-upara eliminar todas las lneas duplicadas y conservar slo las lneas que no se repitan. Listado 33. Orden numrico y por caracteres
[ian@echidna lpi103]$ cat text1 | tr ' ' '\t' | sort - text2 10 apple

1 apple 2 pear 3 banana 3 banana 9 plum [ian@echidna lpi103]$ cat text1|tr ' ' '\t'|sort -u -k1n -k2 - text2 1 apple 2 pear 3 banana 9 plum 10 apple

Tenga en cuenta que todava tendremos dos lneas con la fruta "manzana". Otro comando denominadouniqnos ofrece control adicional sobre la eliminacin de lneas duplicadas. El comandouniqgeneralmente opera sobre los archivos ordenados, pero remueve lneas idnticas consecutivas desde cualquier archivo (ordenado o no). El comandouniqtambin puede ignorar algunos campos. El Listado 34 ordena nuestros dos archivos de texto usando el segundo campo (nombre de la fruta) y, luego de esto, elimina las lneas idnticas, comenzando desde el segundo campo (es decir que salteamos el primer campo cuando realizamos una prueba conuniq). Listado 34. Uso de uniq
[ian@echidna lpi103]$ cat text1|tr ' ' '\t'|sort -k2 - text2|uniq -f1 10 apple 3 banana 2 pear 9 plum

Nuestro orden se realiz por secuencia de intercalacin. Por lo tanto,uniqnos muestra la lnea "10 apple" en vez de la lnea "1 apple". Intente agregar un orden numrico en el campo clave 1 para ver cmo modificar esto. Volver arriba Cut, paste y join (Cortar, pegar y unir) Ahora, observemos tres comandos ms que se ocupan de los campos que incluyen datos de texto. Estos comandos son muy tiles al momento de trabajar con datos tabulares. El primero de ellos es el comandocut, que extrae campos de los archivos de texto. El delimitador de campo predeterminado es el carcter de tabulacin. El Listado 35 usa el comandocutpara separa las dos columnas de text2 y, luego de esto, usa un espacio como un delimitador de salida (lo que constituye una forma extica de convertir el tabulador en cada lnea en un espacio). Listado 35. Uso de cut
[ian@echidna lpi103]$ cut -f1-2 --output-delimiter=' ' text2 9 plum 3

banana 10 apple

El comandopastepega las lneas de dos o ms archivos una al lado de la otra de manera similar a la forma en la que el comandoprfusiona archivos usando su opcin-m. El Listado 36 le muestra los resultados de pegar nuestros dos archivos de texto. Listado 36. Pegado de archivos
[ian@echidna lpi103]$ paste text1 text2 1 apple 9 plum 2 pear 3 banana 3 banana 10 apple

Estos ejemplos le muestran el pegado simple, pero el comandopastepuede pegar datos de uno o ms archivos de diversas formas. Vea la pgina man para mayor informacin. Nuestro ltimo comando para manipular campos esjoin, que sirve para unir archivos basndose en un campo correspondiente. Estos archivos deberan ordenarse en el campo de unin. Como text2 no est ordenado numricamente, podramos ordenarlo y, luego de esto, el comando join unira las dos lneas que tengan un campo de unin correspondiente (3 en este caso). Adems, tambin creamos un archivo nuevo (text5) ordenando text1 en el segundo campo (el nombre de la fruta) y, luego de esto, reemplazamos los espacios por tabuladores. Si despus de haber hecho esto ordenamos text2 y lo unimos con text5 usando el segundo campo, deberamos obtener dos coincidencias (manzana y banana). El Listado 37 ilustra estas dos uniones. Listado 37. Unin de archivos con campos de unin
[ian@echidna lpi103]$ sort -n text2|join -1 1 -2 1 text1 3 banana banana [ian@echidna lpi103]$ sort -k2 text1|tr ' ' '\t'>text5 [ian@echidna lpi103]$ sort -k2 text2 | join -1 2 -2 2 text5 apple 1 10 banana 3 3

El campo a usar para la unin se especifica independientemente para cada archivo. Usted podra, por ejemplo, realizar la unin basndose en el campo 3 de un archivo y en el campo 10 de otro. Volver arriba Sed

Sed es elstreameditor (editor de flujo). Varios artculos de developerWorks, al igual que muchos libros y captulos de libros, estn disponibles en relacin a sed. Ver la seccin Recursos. Sed es una herramienta extremadamente poderosa y las tareas que puede desarrollar slo estn limitadas por su imaginacin. Esta breve introduccin, si bien no est completa y no entra en detalles, debera incitarlo a informarse ms al respecto de sed. Al igual que en el caso de muchos de los comandos de texto que hemos visto hasta ahora, sed puede operar como un filtro o tomar sus datos de entrada de un archivo. Los datos de salida se dirigen hacia el flujo estndar de salida. Sed carga lneas de los datos de entrada en elespacio de patrones, aplica los comandos de edicin de sed a los contenidos del espacio de patrones y, luego de esto, escribe el espacio de patrones en los datos de salida estndar. Sed puede combinar diversas lneas en el espacio de patrones y escribir en un archivo, escribir slo los datos de salida seleccionados o no escribir nada. Sed usa la sintaxis de expresiones regulares (ver Bsqueda con expresiones regulares ms adelante en este tutorial) para buscar y reemplazar texto de manera selectiva en el espacio de patrones y para controlar qu lneas del texto deberan resultar afectadas por los conjuntos de comandos de edicin. Unhold bufferofrece almacenamiento temporario para el texto. El hold buffer puede reemplazar el espacio de patrones, agregarse al espacio de patrones o reemplazarse por el espacio de patrones. Sed cuenta con una cantidad limitada de comandos. Pero al combinarlos con la sintaxis de expresiones regulares y con el hold buffer, se obtienen capacidades ms que interesantes. A todo conjunto de comandos sed se lo suele denominarscript sed. El Listado 38 le muestra tres scripts sed simples. En el primero, usamos el comandos(substitute) para substituir una mayscula por una minscula "a" en cada lnea. Este ejemplo slo reemplaza la primera "a". Por lo tanto, en el segundo ejemplo, agregamos el indicador "g" (que se refiere a global) para que sed modifique todas las ocurrencias. En el tercer script, introducimos el comandod(delete) para borrar una lnea. En nuestro ejemplo, usamos una direccin de 2 para indicar que slo se debera borrar la lnea 2. Separamos los comandos usando un punto y coma (;) y usamos la misma substitucin global que usamos en el segundo script para reemplazar "A" por "a". Listado 38. Comienzo de los scripts sed
[ian@echidna lpi103]$ sed 's/a/A/' text1 1 Apple 2 peAr 3 bAnana [ian@echidna lpi103]$ sed 's/a/A/g' text1 1 Apple 2 peAr 3 bAnAnA [ian@echidna lpi103]$ sed '2d;$s/a/A/g' text1

1 apple 3 bAnAnA

Adems de operar sobre lneas individuales, sed puede operar sobre un rango de lneas. El principio y el final de este rango se separa por medio de una coma (,) y a esto se lo puede llegar a especificar como un nmero de lnea, un signo de intercalacin (^) para el comienzo del archivo o un signo pesos ($) para el final del archivo. Cuando se incluye una direccin o un rango de direcciones, usted puede agrupar varios comandos entre llaves ({ y }) para que estos comandos operen slo sobre las lneas seleccionadas por el rango. El Listado 39 ilustra dos formas de aplicar una sustitucin global a slo las dos ltimas lneas de nuestro archivo. Adems, tambin ilustra el uso de la opcin-epara agregar comandos al espacio de patrones. Cuando se usan llaves, debemos separar los comandos de esta forma. Listado 39. Direcciones sed
[ian@echidna lpi103]$ sed -e '2,${' -e 's/a/A/g' -e '}' text1 1 apple 2 peAr 3 bAnAnA [ian@echidna lpi103]$ sed -e '/pear/,/bana/{' -e 's/a/A/g' -e '}' text1 1 apple 2 peAr 3 bAnAnA

Los scripts sed tambin se pueden almacenar en archivos. De hecho, es probable que usted desee hacer esto en el caso de los scripts que usa con mayor frecuencia. Recuerde que ya usamos el comandotrpara cambiar los espacios en blanco en text1 por tabuladores. Ahora, hagamos eso con un script sed almacenado en un archivo. Usaremos el comandoechopara crear el archivo. El Listado 40 muestra los resultados de esto. Listado 40. Un one-liner sed
[ian@echidna lpi103]$ echo -e "s/ /\t/g">sedtab [ian@echidna lpi103]$ cat sedtab s/ / /g [ian@echidna lpi103]$ sed -f sedtab text1 1 apple 2 pear 3 banana

Existen muchos one-liner sed como los que figuran en el Listado 40. Vea la seccin Recursos y encuentre vnculos hacia algunos de ellos.

Nuestro ejemplo sed final usa el comando=para imprimir nmeros de lnea y, luego de esto, filtrar los datos de salida resultantes a travs de sed para imitar el efecto del comandonlpara enumerar lneas. El Listado 41 usa el comando = para imprimir nmeros de lnea y, luego de esto, usa el comandoNpara leer una segunda lnea de entrada en el espacio de patrones. Por ltimo, remueve el carcter de lnea nueva (\n) entre las dos lneas en el espacio de patrones. Listado 41. Enumeracin de lneas con sed
[ian@echidna lpi103]$ sed '=' text2 1 9 plum 2 3 banana 3 10 apple [ian@echidna lpi103]$ sed '=' text2|sed 'N;s/\n//' 19 plum 23 banana 310 apple

No es exactamente lo que queramos! Lo que realmente nos gustara sera que nuestros nmeros estn alineados en una columna con un espacio antes de las lneas del archivo. En el Listado 42, ingresamos varias lneas de comando (observe el comando secundario >). Analice el ejemplo y lea la explicacin que figura a continuacin. Listado 42. Enumeracin de lneas con sed: Segundo round
[ian@echidna lpi103]$ cat text1 text2 text1 text2>text6 [ian@echidna lpi103]$ ht=$(echo -en "\t") [ian@echidna lpi103]$ sed '=' text6|sed "N > s/^/ / > s/^.*\(......\)\n/\1$ht/" 1 1 apple 2 2 pear 3 3 banana 4 9 plum 5 3 banana 6 10 apple 7 1 apple 8 2 pear 9 3 banana 10 9 plum 11 3 banana 12 10 apple

Estos son los pasos que dimos: 1. Primero, usamoscatpara crear un archivo de doce lneas a partir de dos copias de nuestros archivos text1 y text2. No tiene gracia formatear nmeros en columnas si no tenemos diferentes cantidades de dgitos. 2. El shell bash usa la tecla tab para completar el comando. Por lo tanto, puede resultar til contar con un carcter de tabulacin cautivo que lo pueda usar cuando quiera un tabulador. Usamos el comandoechopara lograr esto y guardar el carcter en la variable "ht" del shell.

3. Creamos un flujo que contiene nmeros de lnea seguidos por lneas de datos, como lo hicimos con anterioridad, y lo filtramos a travs de una segunda copia de sed. 4. Leemos una segunda lnea en el espacio de patrones. 5. Agregamos un prefijo a nuestro nmero de lnea al comienzo del espacio de patrones (indicado por ^) con seis espacios en blanco. 6. Luego de esto, sustituimos toda la lnea hasta la lnea nueva con los ltimos seis caracteres antes de la lnea nueva ms un carcter de tabulacin. Tenga en cuenta que la parte izquierda del comando "s" usa "\(" y "\)" para marcar los caracteres que deseamos usar en la parte derecha. En la parte derecha, hacemos referencia al primer conjunto marcado de dicha forma (y slo a dicho conjunto en este ejemplo) como \1. Tenga en cuenta que nuestro comando figura entre comillas ("), por lo que se lo reemplazar por $ht. La ltima versin (versin 4) de sed incluye documentacin en formatoinfoy contiene muchos ejemplos excelentes. Estos no figuran en la versin anterior (3.02). Sed GNU aceptar el uso desed --versionpara visualizar la versin. Gestin bsica de archivos Esta seccin se ocupa del material para el tema 1.103.3 del examen 101 de Administracin Nivel Junior (LPIC-1). El tema tiene un valor de ponderacin de 3. En esta seccin, usted aprender sobre los siguientes temas:
y y y y y

Listado de los contenidos del directorio Copiar, mover y eliminar archivos y directorios Manipular mltiples archivos y directorios de manera recursiva Uso de patrones de comodines para manipular archivos Uso del comandofindpara encontrar y actuar sobre archivos basndose en su tipo, tamao u hora

Listado de directorios Como dijimos con anterioridad en la seccin de uso de la lnea de comandos, se accede a todos los archivos en los sistemas Linux y UNIX como parte de un nico sistema de archivos grande y estructurado en forma de rbol que se encuentra en /. Listado de entradas de directorio Si hizo todo lo que le indicamos en la seccin anterior, ya cre un directorio (lpi103) en su directorio principal. Los nombres de los archivos y el directorio sonabsolutos, lo que significa que comienzan con una /, o sonrelativosaldirectorio que se usa en la actualidad, lo que significa que no comienzan con una /. La ruta

absoluta hacia un archivo o directorio consiste de una / seguida por una serie de 0 o ms nombres de directorios (cada uno de ellos seguido por otra /) y un nombre de directorio final. En el caso del nombre de un archivo o directorio que sea relativo al directorio que se usa en la actualidad, simplemente concatene el nombre absoluto del directorio que se usa en la actualidad, una / y el nombre relativo. Por ejemplo, el directorio que creamos en la ltima seccin (lpi103) se cre en mi directorio principal (/home/ian). Por lo tanto, su ruta completa o absoluta es /home/ian/lpi103. El Listado 43 le muestra tres formas diferentes de usar el comandolspara mostrar una lista de los archivos que se encuentran en este directorio. Listado 43. Listado de entradas de directorio
[ian@echidna lpi103]$ pwd /home/ian/lpi103 [ian@echidna lpi103]$ echo $PWD /home/ian/lpi103 [ian@echidna lpi103]$ ls sedtab text2 text4 text6 xab yab text1 text3 text5 xaa yaa [ian@echidna lpi103]$ ls "$PWD" sedtab text2 text4 text6 xab yab text1 text3 text5 xaa yaa [ian@echidna lpi103]$ ls /home/ian/lpi103 sedtab text2 text4 text6 xab yab text1 text3 text5 xaa yaa

Como puede observar, usted puede hacer que el nombre del directorio sea como un parmetro del comandolsy le mostrar una lista de los contenidos de dicho directorio. Listado de detalles En un dispositivo de almacenamiento, un archivo o directorio figura en una coleccin debloques. La informacin sobre el archivo figura en uninodeque registra informacin tal como el propietario, cundo se accedi al archivo por ltima vez, qu tamao tiene, si es o no un directorio y quin puede leerlo o escribirlo. Al nmero de inode tambin se lo conoce como elnmero de serie del archivoy es nico dentro de un sistema de archivos en particular. Podemos usar la opcin-l(o-format=long) para visualizar parte de la informacin almacenada en dicho inode. De manera predeterminada, el comandolsno muestra una lista de archivos especiales, es decir aquellos cuyos nombres comienzan con un punto (.). Todos los directorios que no son el directorio principal tienen dos entradas especiales por lo menos: el directorio en s mismo (.) y el directorio principal (..). El directorio raz no tiene un directorio principal.

El Listado 44 usa las opciones-ly-apara visualizar un listado de formato largo de todos los archivos que incluyen las entradas de directorio . y .. Listado 44. Listado largo de directorios
[ian@echidna lpi103]$ ls -al total 56 drwxrwxr-x 2 ian ian drwxr-xr-x 94 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian -rw-rw-r-- 1 ian ian 4096 Sep 30 15:01 . 8192 Sep 27 12:57 .. 8 Sep 26 15:24 sedtab 24 Sep 23 12:27 text1 25 Sep 23 13:39 text2 84 Sep 25 17:47 text3 26 Sep 25 22:28 text4 24 Sep 26 12:46 text5 98 Sep 26 16:09 text6 15 Sep 23 14:11 xaa 9 Sep 23 14:11 xab 18 Sep 23 14:11 yaa 7 Sep 23 14:11 yab

En el Listado 44, la primera lnea muestra la cantidad total de bloques de disco (56) usados por los archivos que figuran en la lista. Los campos restantes le ofrecen informacin sobre el archivo.
y

El primer campo (drwxrwxr-x o -rw-rw-r-- en este caso) nos indica si el archivo es un directorio (d) o un archivo regular (-). Tambin existe la posibilidad de que observe vnculos simblicos (l), que discutiremos ms adelante, u otros valores para algunos archivos especiales (como los archivos en el sistema de archivos /dev). Al tipo lo siguen tres conjuntos de permisos (como rwx o r--) para el propietario, los miembros del grupo del propietario y todos. Los tres valores indican respectivamente si el usuario, el grupo o todos tienen permisos de lectura (r), escritura (w) o ejecucin (x). Ms adelante, discutimos otros usos (como, por ejemplo, setuid). El prximo campo es un nmero que nos indica la cantidad devnculos ****fsicosque existen junto con el archivo. Dijimos que el inode contiene informacin sobre el archivo. La entrada de directorio del archivo incluye un vnculo fsico (o indicador) hacia el inode para el archivo. Por lo tanto, todas las entradas que figuran en la lista deberan tener por lo menos un vnculo fsico. Las entradas de directorio tienen una adicional para la entrada . y otra adicional para cada entrada .. del subdirectorio. De esta forma, podemos observar en el listado anterior que mi directorio principal tiene varios subdirectorios. Los prximos dos campos son el propietario del archivo y el grupo primario del propietario. Algunos sistemas, como el sistema Red Hat, ofrecen un grupo independiente para cada usuario de manera predeterminada. En

y y y

otros sistemas, todos los usuarios pueden encontrarse en un grupo o en varios grupos. El siguiente campo contiene la longitud del archivo. El penltimo campo contiene la fecha y hora de la ltima modificacin. Y el ltimo campo contiene el nombre del archivo o del directorio.

La opcin-idel comandolsvisualizar los nmeros del inode para usted. Usaremos esta informacin ms adelante en este tutorial y tambin cuando discutamos los vnculos fsicos y simblicos en el tutorial correspondiente al Tema 104. Archivos mltiples Usted tambin puede especificar mltiples parmetros para el comandols, donde cada nombre sea el de un archivo o el de un directorio. Si el nombre es el de un directorio, el comandolsmuestra una lista de los contenidos del directorio en vez de la informacin sobre la entrada en s misma. En nuestro ejemplo, supongamos que deseamos obtener informacin sobre la entrada de directorio lpi103 como figura en el directorio principal. El comandols -l ../lpi103nos mostrara un listado como el del ejemplo anterior. El Listado 45 le muestra cmo usarls -ldy tambin cmo realizar una lista de entradas de mltiples archivos o directorios. Listado 45. Uso de ls -d
[ian@echidna lpi103]$ ls -ld ../lpi103 sedtab xaa drwxrwxr-x 2 ian ian 4096 Oct 2 18:49 ../lpi103 -rw-rw-r-- 1 ian ian 8 Sep 26 15:24 sedtab -rw-rw-r-- 1 ian ian 15 Sep 23 14:11 xaa

Tenga en cuenta que la hora de modificacin correspondiente a lpi103 difiere de la que figura en el listado anterior. Adems, al igual que en el listado anterior, difiere de la fecha y hora de cualquiera de los archivos que se encuentran en el directorio. Es esto lo que usted esperara? No generalmente. Sin embargo, al desarrollar este tutorial, cre algunos ejemplos extra y, luego de ello, los borr. Por lo tanto, la fecha y hora del directorio refleja eso. Discutiremos los horarios de los archivos ms adelante en esta seccin cuando hablemos de cmo encontrar archivos. Ordenamiento de los datos de salida De manera predeterminada,lsnos muestra una lista por orden alfabtico. Hay varias opciones para ordenar los datos de salida. Por ejemplo,ls -tordena por hora de modificacin (de la ms reciente a la ms antigua), mientras quels -lSproduce una larga lista ordenada por tamao (de la ms grande a la ms pequea). Si agregamos-r, se invierte el orden. Por ejemplo, usels -lrtpara producir un listado

extenso ordenado de la ms antigua a la ms reciente. Vea la pgina man para informarse sobre otras formas de realizar listas de archivos y directorios. Volver arriba Copiar, mover y borrar Ya hemos aprendido algunas formas de crear archivos. Pero supongamos que deseamos hacer copias de archivos, cambiar el nombre de archivos, moverlos a travs de las diferentes jerarquas del sistema de archivos o incluso borrarlos. Para esto, usaremos tres comandos cortos. cp se usa para realizar una copia de uno o ms archivos. Usted debe elegir por lo menos dos nombres: un nombre deorigen(o ms de uno) y un nombre dedestino. Si usted especifica dos nombres de archivo, el primero se copiar sobre el segundo. Tanto el nombre de origen como el nombre de destino del archivo pueden incluir una especificacin de ruta. Si usted especifica un directorio como el ltimo nombre, podr especificar mltiples archivos para que se copien en l. Todos los archivos se copiarn desde sus ubicaciones originales y las copias tendrn el mismo nombre que los archivos originales. Tenga en cuenta que no se asume de manera predeterminada que el destino sea el directorio actual (como s ocurre en los sistemas operativos DOS y Windows). mv se usa paramoverocambiar el nombrede uno o ms archivos o directorios. En general, los nombres que usted puede usar cumplen con las mismas reglas que las que se usan cuando se copia con el comandocp. Usted puede cambiar el nombre de un solo archivo o mover un conjunto de archivos hacia un directorio nuevo. Como el nombre es slo una entrada de directorio que crea un vnculo con un inode, no nos debera sorprender que el nmero de inode no se modifique, a menos que se mueva el archivo hacia otro sistema de archivos. En tal caso, la funcin de mover el archivo sera como copiar el archivo en una ubicacin nueva para luego borrar el original. rm se usa paraeliminaruno o ms archivos. Veremos cmo eliminar directorios en breve. El Listado 46 ilustra el uso decpymvpara realizar copias de seguridad de nuestros archivos de texto. Tambin usamosls -ipara mostrar los nodos ndice correspondientes a algunos de nuestros archivos. 1. En primer lugar, hacemos una copia de nuestro archivo text1 y la denominamos text1.bkp. 2. Luego, decidimos crear un subdirectorio de backup usando el comandomkdir.

3. Hacemos una segunda copia de seguridad de text1, esta vez, en el directorio de backup. Adems, mostramos que los tres archivos tienen nodos ndice diferentes. 4. Luego de esto, movemos nuestro archivo text1.bkp hacia el directorio de backup y, luego de ello, cambiamos el nombre del archivo para que sea ms consistente con la segunda copia de seguridad. Si bien podramos haber hecho esto con un solo comando, usamos dos a modo ilustrativo. 5. Verificamos los nodos ndice una vez ms y confirmamos que text1.bkp con el inode 2129019 ya no se encuentra en nuestro directorio lpi103. El inode es el que pertenece a text1.bkp.1 en el directorio de backup. Listado 46. Copiar y mover archivos
[ian@echidna lpi103]$ cp text1 text1.bkp [ian@echidna lpi103]$ mkdir backup [ian@echidna lpi103]$ cp text1 backup/text1.bkp.2 [ian@echidna lpi103]$ ls -i text1 text1.bkp backup 2128984 text1 2129019 text1.bkp backup: 1564497 text1.bkp.2 [ian@echidna lpi103]$ mv text1.bkp backup [ian@echidna lpi103]$ mv backup/text1.bkp backup/text1.bkp.1 [ian@echidna lpi103]$ ls -i text1 text1.bkp backup ls: text1.bkp: No such file or directory 2128984 text1 backup: 2129019 text1.bkp.1 1564497 text1.bkp.2

Generalmente, el comandocpcopia un archivo sobre una copia ya existente (si el archivo existente se puede escribir). Por otro lado, el comandomvno mover ni cambiar el nombre de un archivo si el destino ya existe. Existen varias opciones muy tiles relacionadas con el comportamiento decpymv. -f o --force har que cp intente eliminar un archivo de destino existente, incluso cuando est protegido contra escritura. -i o --interactive solicitar confirmacin antes de intentar reemplazar un archivo existente. -b o --backup realizar una copia de seguridad de todos los archivos que se reemplazarn. Al igual que en los casos anteriores, vea las pginas man para obtener ms informacin sobre stas y otras opciones para copiar y mover archivos.

En el Listado 47, ilustramos el copiado con una copia de seguridad y el posterior borrado del archivo. Listado 47. Copias de seguridad y borrado de archivos
[ian@echidna lpi103]$ cp text2 backup [ian@echidna lpi103]$ cp --backup=t text2 backup [ian@echidna lpi103]$ ls backup text1.bkp.1 text1.bkp.2 text2 text2.~1~ [ian@echidna lpi103]$ rm backup/text2 backup/text2.~1~ [ian@echidna lpi103]$ ls backup text1.bkp.1 text1.bkp.2

Tenga en cuenta que el comandormtambin acepta las opciones-i(interactive) yf(force). Luego de eliminar un archivo usandorm, el sistema de archivos ya no tiene ms acceso a l. Algunos sistemas, de manera predeterminada, configuran un aliasalias rm='rm -i'para el usuario raz con el objetivo de evitar el borrado accidental de archivos. Esto tambin resulta una buena idea si le preocupa todo lo que podra llegar a borrar de manera accidental. Antes de pasar a otro tema, deberamos tener en cuenta que el comandocp, de manera predeterminada, crea una nueva fecha y hora para el / los archivo(s) nuevos. El propietario y el grupo tambin se configuran como el propietario y el grupo del usuario que est realizando el copiado. Se puede usar la opcin-ppara preservar los atributos seleccionados. Tenga en cuenta que el usuario raz puede ser el nico usuario capaz de preservar la propiedad. Vea la pgina man para mayor informacin. Volver arriba Mkdir y rmdir Ya discutimos cmo crear un directorio conmkdir. Ahora, analizaremos mkdir ms en detalle y presentaremos el comando que se usa para eliminar directorios:rmdir. Mkdir Supongamos que estamos en nuestro directorio lpi103 y deseamos crear los subdirectorios dir1 y dir2. El comandomkdir, al igual que todos los dems comandos que hemos estado discutiendo, se ocupar de mltiples solicitudes de creacin de directorios en un solo paso (como se puede observar en el Listado 48). Listado 48. Creacin de mltiples directorios
[ian@echidna lpi103]$ mkdir dir1

dir2

Tenga en cuenta que no habr datos de salida cuando se complete este proceso de manera exitosa. Sin embargo, usted podra usarecho $?para confirmar que el cdigo de salida sea realmente 0. Si, en cambio, usted desea crear un subdirectorio anidado, como por ejemplo d1/d2/d3, esto fallara porque los directorios d1 y d2 no existen. Afortunadamente,mkdircuenta con la opcin-ppara crear los directorios principales que sean necesarios. El Listado 49 ilustra esto. Listado 49. Creacin de directorios principales
[ian@echidna lpi103]$ mkdir d1/d2/d3 mkdir: cannot create directory `d1/d2/d3': No such file or directory [ian@echidna lpi103]$ echo $? 1 [ian@echidna lpi103]$ mkdir -p d1/d2/d3 [ian@echidna lpi103]$ echo $? 0

Rmdir Eliminar directorios usando el comandormdires lo opuesto a crearlos. Una vez ms, existe la opcin-ppara tambin eliminar los directorios principales. Slo puede eliminar un directorio con el comandormdirsi est vaco y no hay ninguna opcin que obligue la eliminacin. Veremos otra forma de lograr esto cuando analicemos la manipulacin recursiva. Una vez que aprenda eso, probablemente deje de usarrmdiren la lnea de comandos. De todas formas, no est dems saber de su existencia. Para ilustrar la eliminacin del directorio, copiamos nuestro archivo text1 en el directorio d1/d2 para que deje de estar vaco. Luego, usamos el comandormdirpara eliminar todos los directorios que creamos conmkdir. Como puede observar, d1 y d2 no se eliminaron porque d2 no estaba vaco. Los dems directorios se eliminaron perfectamente. Cuando eliminemos la copia de text1 de d2, podremos eliminar d1 y d2 con una sola invocacin dermdir -p. Listado 50. Eliminacin de directorios
[ian@echidna lpi103]$ cp text1 d1/d2 [ian@echidna lpi103]$ rmdir -p d1/d2/d3 dir1 dir2 rmdir: `d1/d2': Directory not empty [ian@echidna lpi103]$ ls . d1/d2 .: backup sedtab text2 text4 text6 xab yab

d1

text1 text3 text5 xaa

yaa

d1/d2: text1 [ian@echidna lpi103]$ rm d1/d2/text1 [ian@echidna lpi103]$ rmdir -p d1/d2

Volver arriba Manipulacin recursiva En las partes restantes de esta seccin, analizaremos las diversas operaciones para ocuparse de mltiples archivos y para realizar la manipulacin recursiva de parte de un rbol de directorio. Listado recursivo El comandolstiene la opcin-R(tenga en cuenta que se usa la letra mayscula "R") para mostrar un listado de un directorio y todos sus subdirectorios. Esta opcin recursiva slo aplica en el caso de los nombre de directorios. No sirve para encontrar todos los archivos denominados "text1", por ejemplo, en un rbol de directorio. Usted puede usar otras de las opciones que ya hemos discutido junto con-R. El Listado 51 muestra un listado recursivo de nuestro directorio lpi103, incluyendo los nmeros de inode. Listado 51. Listado de directorio recursivo
[ian@echidna lpi103]$ ls -iR ~/lpi103 /home/ian/lpi103: 1564496 backup 2128985 text2 2128982 text5 2128987 xab 2128991 sedtab 2128990 text3 2128995 text6 2128988 yaa 2128984 text1 2128992 text4 2128986 xaa 2128989 yab /home/ian/lpi103/backup: 2129019 text1.bkp.1 1564497 text1.bkp.2

Copia recursiva Usted puede usar la opcin-r(o-Ro--recursive) para que el comandocpse dirija hacia los directorios originales y copie los contenidos de manera recursiva. Para evitar una recursin infinita, el directorio original no se puede copiar. El Listado 52 le muestra cmo copiar todo lo que se encuentra en nuestro directorio lpi103 en un subdirectorio denominado copy1. Usamosls -Rpara mostrar el rbol de directorio resultante.

Listado 52. Copia recursiva


[ian@echidna lpi103]$ cp -pR . copy1 cp: cannot copy a directory, `.', into itself, `copy1' [ian@echidna lpi103]$ ls -R .: backup sedtab text2 text4 text6 xab yab copy1 text1 text3 text5 xaa yaa ./backup: text1.bkp.1 text1.bkp.2 ./copy1: backup text1 text3 text5 xaa yaa sedtab text2 text4 text6 xab yab ./copy1/backup: text1.bkp.1 text1.bkp.2

Borrado recursivo Ya mencionamos quermdirslo elimina directorios vacos. Podemos usar la opcinr(o-Ro--recursive) para que el comandormelimine ambos archivos y directorios como se puede observar en el Listado 53, donde eliminamos el directorio copy1 que acabamos de crear junto con todos sus contenidos, incluyendo el subdirectorio de backup y todos sus contenidos. Listado 53. Borrado recursivo
[ian@echidna lpi103]$ rm -r copy1 [ian@echidna lpi103]$ ls -R .: backup text1 text3 text5 xaa yaa sedtab text2 text4 text6 xab yab ./backup: text1.bkp.1 text1.bkp.2

Si tiene archivos que usted no puede escribir, es probable que tenga que agregar la opcin-fpara forzar la eliminacin. Esto lo suele hacer el usuario raz cuando realiza una limpieza. Pero tenga mucho cuidado porque puede llegar a perder datos valiosos. Volver arriba Comodines y globbing

Generalmente, es posible que usted necesite realizar una sola operacin sobre muchos objetos del sistema de archivos sin afectar a todo el rbol (como lo acabamos de hacer con las operaciones recursivas). Por ejemplo, es posible que usted desee encontrar las horas de modificacin de todos los archivos de texto que creamos en lpi103 sin que se muestre un listado de los archivos divididos. Aunque esto es fcil de lograr debido a que nuestro directorio es muy pequeo, suele ser mucho ms difcil en el caso de los sistemas de archivos ms grandes. Para resolver este problema, use el soporte de comodines que forma parte del shell bash. Este soporte, al que se lo suele denominar "globbing" (porque originalmente se lo implement como un programa denominado /etc/glob), le permite especificar mltiples archivos usando el patrn de comodines. Una cadena que contiene cualquiera de estos caracteres "?", "*" o "[", es unpatrn de comodines. Globbing es el proceso por medio del que el shell (o posiblemente otro programa) expande estos patrones en una lista de nombres de ruta que se corresponden con el patrn. Esta correspondencia se logra de la siguiente manera. ? se corresponde con cualquier carcter solo. * se corresponde con cualquier cadena (incluso una cadena vaca). [ introduce unaclase de carcter. Una clase de carcter es una cadena no vaca que termina en "]". Una correspondencia significa que existe correspondencia con cualquier carcter nico encerrado entre corchetes. Hay que tener varias cosas que cuenta.
y

Los caracteres "*" y "?" se corresponden entre s. Si los usa en el nombre de un archivo, deber tener mucho cuidado en relacin al uso correcto de estos caracteres. Como la cadena no debe estar vaca y debe terminar en "]", usted debe colocar "]" primero en la cadena si desea que haya correspondencia. El carcter "-" entre dos caracteres representa un rango que incluye estos dos caracteres y todos los dems que se encuentran entre ellos. Por ejemplo, [0-9a-fA-F] representa a todo dgito hexadecimal en minscula o en mayscula. Usted puede realizar la correspondencia con un "-" colocndolo al principio o al final de un rango. El carcter "!" especificado como el primer carcter de un rango complementa dicho rango para que se corresponda con cualquier carcter excepto los caracteres restantes. Por ejemplo, [!0-9] significa cualquier carcter excepto los dgitos 0 a 9. Un "!" en cualquier posicin que no sea al principio se corresponde consigo

mismo. Recuerde que tambin se usa "!" con la funcin histrica de shell. Por lo tanto, tenga cuidado para salir de manera adecuada. Globbing se aplica de manera independiente a cada componente de un nombre de ruta. Usted no puede realizar la correspondencia con una "/" o incluir una en un rango. La puede usar en cualquier lado donde especifique mltiples nombres de archivos o directorios (por ejemplo, en los comandosls,cp,mvorm). En el Listado 54, primero creamos un par de archivos con nombres raros y, luego de esto, usamos los comandoslsyrmcon los patrones de comodines. Listado 54. Ejemplos de patrn de comodines
[ian@echidna lpi103]$ echo odd1>'text[*?!1]' [ian@echidna lpi103]$ echo odd2>'text[2*?!]' [ian@echidna lpi103]$ ls backup text1 text2 text3 text5 xaa yaa sedtab text[*?!1] text[2*?!] text4 text6 xab yab [ian@echidna lpi103]$ ls text[2-4] text2 text3 text4 [ian@echidna lpi103]$ ls text[!2-4] text1 text5 text6 [ian@echidna lpi103]$ ls text*[2-4]* text2 text[2*?!] text3 text4 [ian@echidna lpi103]$ ls text*[!2-4]* # Surprise! text1 text[*?!1] text[2*?!] text5 text6 [ian@echidna lpi103]$ ls text*[!2-4] # More surprise! text1 text[*?!1] text[2*?!] text5 text6 [ian@echidna lpi103]$ echo text*>text10 [ian@echidna lpi103]$ ls *\!* text[*?!1] text[2*?!] [ian@echidna lpi103]$ ls *[x\!]* text1 text2 text3 text5 xaa text[*?!1] text[2*?!] text4 text6 xab [ian@echidna lpi103]$ ls *[y\!]* text[*?!1] text[2*?!] yaa yab [ian@echidna lpi103]$ ls tex?[[]* text[*?!1] text[2*?!] [ian@echidna lpi103]$ rm tex?[[]* [ian@echidna lpi103]$ ls *b* sedtab xab yab backup: text1.bkp.1 text1.bkp.2 [ian@echidna lpi103]$ ls backup/*2 backup/text1.bkp.2 [ian@echidna lpi103]$ ls -d .* . ..

Notas:

1. La complementacin en conjunto con "*" puede causar algunas sorpresas. El patrn "*[!2-4]" se corresponde con la parte ms larga de un nombre que no tiene 2, 3 4 a continuacin, lo que se corresponde tanto con text[*?!1] como con text[2*?!]. Entonces, ambas sorpresas deberan quedar en claro ahora. 2. Como en el caso de los ejemplos anteriores dels, si la expansin del patrn resulta en un nombre que es un nombre de directorio y no se especifica la opcin-d, los contenidos de dicho directorio aparecern en una lista (como en nuestro ejemplo anterior para el caso del patrn "*b*"). 3. Si el nombre de un archivo comienza con un punto (.), dicho carcter se debe corresponder de manera explcita. Tenga en cuenta que slo el ltimo comandolsincluy en la lista las dos entradas de directorio especiales (. y ..). Recuerde que el shell puede expandir todos los caracteres de comodines en un comando, lo que puede ocasionar resultados inesperados. Adems, si usted especifica un patrn que no se corresponde con ningn objeto del sistema de archivos, POSIX requiere que la cadena del patrn original se transfiera al comando. Ilustramos esto en el Listado 55. Algunas implementaciones anteriores transfirieron una lista nula al comando. Por lo tanto, usted se puede encontrar con scripts viejos que tengan un comportamiento inusual. Ilustramos estos puntos en el Listado 55. Listado 55. Sorpresas con el patrn de comodines
[ian@echidna lpi103]$ echo text* text1 text2 text3 text4 text5 text6 [ian[ian@echidna lpi103]$ echo "text*" text* @echidna lpi103]$ echo text[[\!?]z?? text[[!?]z??

Para mayor informacin sobre globbing, ingrese aman 7 glob. Usted necesitar el nmero de seccin, ya que tambin hay informacin sobre glob en la seccin 3. La mejor forma de comprender todas las interacciones de shell es por medio de la prctica. Por lo tanto, experimente con estos comodines siempre que pueda. Recuerde experimentar conlspara verificar su patrn de comodines antes de usarlo concp,mv, o lo que es incluso peor, conrmy tener que enfrentar diversos resultados inesperados. Volver arriba Archivos touch Ahora, analizaremos el comandotouch, que puede actualizar el acceso al archivo y las horas de modificacin o crear archivos vacos. En la prxima parte, veremos

cmo usar esta informacin para encontrar archivos y directorios. Usaremos el directorio lpi103 que creamos con anterioridad en este tutorial. Tambin analizaremos el comando touch El comandotouchsin opciones toma uno o ms nombres de archivos como parmetros y actualiza la hora de modificacin de los archivos. sta es la misma fecha y hora que generalmente se visualiza con un listado de directorio largo. En el Listado 56, usamos el ya conocido comandoechopara crear un archivo pequeo denominado f1 y, luego de esto, usamos un listado de directorio largo para visualizar la hora de modificacin (omtime). En este caso, tambin es la hora en la que se cre el archivo. Luego de esto, usamos el comandosleeppara esperar 60 segundos y ejecutarlsuna vez ms. Tenga en cuenta que la fecha y hora correspondiente al archivo se modific en un minuto. Listado 56. Actualizacin de la hora de modificacin con touch
[ian@echidna lpi103]$ echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1 -rw-rw-r-- 1 ian ian 4 Nov 4 15:57 f1 -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1

Si usted especifica un nombre de archivo para un archivo que no existe, el comandotouchcrear un archivo vaco, a menos que usted especifique las opciones-co--no-create. El Listado 57 ilustra ambos comandos. Tenga en cuenta que slo se crea f2. Listado 57. Creacin de archivos vacos con touch
[ian@echidna lpi103]$ touch f2; touch -c f3; ls -l f* -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 16:12 f2

El comandotouchtambin puede configurar la mtime de un archivo para una fecha y hora especfica usando las opciones-do-t. La opcin-des muy flexible en lo que hace a los formatos de fecha y hora que aceptar, mientras que la opcintnecesita por lo menos una hora con el formato MMDDhhmm con valores opcionales relativos al ao y a los segundos. El Listado 58 le muestra algunos ejemplos. Listado 58. Configuracin de mtime con touch
[ian@echidna lpi103]$ touch -t 200511051510.59 f3 [ian@echidna lpi103]$ touch -d 11am f4

[ian@echidna lpi103]$ touch -d "last fortnight" f5 [ian@echidna lpi103]$ touch -d "yesterday 6am" f6 [ian@echidna lpi103]$ touch -d "2 days ago 12:00" f7 [ian@echidna lpi103]$ touch -d "tomorrow 02:00" f8 [ian@echidna lpi103]$ touch -d "5 Nov" f9 [ian@echidna lpi103]$ ls -lrt f* -rw-rw-r-- 1 ian ian 0 Oct 24 12:32 f5 -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 16:12 f2 -rw-rw-r-- 1 ian ian 0 Nov 5 00:00 f9 -rw-rw-r-- 1 ian ian 0 Nov 5 12:00 f7 -rw-rw-r-- 1 ian ian 0 Nov 5 15:10 f3 -rw-rw-r-- 1 ian ian 0 Nov 6 06:00 f6 -rw-rw-r-- 1 ian ian 0 Nov 7 11:00 f4 -rw-rw-r-- 1 ian ian 0 Nov 8 2005 f8

Si no est seguro de qu fecha una expresin de fecha puede llegar a determinar, puede usar el comandodatepara enterarse de ello. ste tambin acepta el uso de la opcin-dy puede determinar el mismo tipo de formatos de fecha quetouch. Usted puede usar la opcin-r(o--reference) junto con unnombre de archivo de referenciapara indicar quetouch(odate) debera usar la fecha y hora de un archivo existente. El Listado 59 le muestra algunos ejemplos. Listado 59. Fechas y horas de los archivos de referencia
[ian@echidna lpi103]$ date Mon Nov 7 12:40:11 EST 2005 [ian@echidna lpi103]$ date -r f1 Fri Nov 4 15:58:27 EST 2005 [ian@echidna lpi103]$ touch -r f1 f1a [ian@echidna lpi103]$ ls -l f1* -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a

Un sistema Linux registra tanto la hora demodificacinde un archivo y la hora deaccesoal archivo. Ambas fechas y horas estn configuradas con los mismos valores que aquellos que figuran en un archivo cuando se lo crea. Adems, ambas se reconfiguran cuando se modifica el archivo en cuestin. Cuando se accede a un archivo, se actualiza la hora (incluso si no se realiza ninguna modificacin). Para el caso de nuestro ltimo ejemplo contouch, analizaremos las horas deacceso. Las opciones-a(o--time=atime,--time=accesso--time=use) especifican que la hora de acceso se debera actualizar. El Listado 60 usa el comandocatpara acceder al archivo f1 y visualizar sus contenidos. Luego de esto, usamosls -lyls lupara visualizar la modificacin y acceder a las horas correspondientes a f1 y a f1a, que creamos usando f1 como archivo de referencia. Luego de esto, reconfiguramos la hora de acceso de f1 para que sea la de f1a usandotouch -a.

Listado 60. Hora de acceso y hora de modificacin


[ian@echidna lpi103]$ cat f1 xxx [ian@echidna lpi103]$ ls -lu f1* -rw-rw-r-- 1 ian ian 4 Nov 7 14:13 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a [ian@echidna lpi103]$ ls -l f1* -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a [ian@echidna lpi103]$ cat f1 xxx [ian@echidna lpi103]$ ls -l f1* -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a [ian@echidna lpi103]$ ls -lu f1* -rw-rw-r-- 1 ian ian 4 Nov 7 14:13 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a [ian@echidna lpi103]$ touch -a -r f1a f1 [ian@echidna lpi103]$ ls -lu f1* -rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1 -rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a

Para mayor informacin sobre todas las especificaciones posibles de fecha y hora, vea las pginas man o de informacin para adentrarse en los comandos touch y date. Volver arriba Cmo encontrar archivos? En el ltimo tema de esta parte del tutorial, analizaremos el comandofind, que se usa para encontrar archivos en uno o ms rboles de directorio (basndose en criterios como el nombre, la fecha y hora o el tamao). Una vez ms, usaremos el directorio lpi103 que creamos con anterioridad en este tutorial. find El comandofindbuscar archivos o directorios usando todo el nombre o parte de l u otro criterio de bsqueda (como, por ejemplo, el tamao, el tipo, el propietario del archivo, la fecha de creacin o la ltima fecha de acceso). El uso ms bsico del comando find consiste en realizar una bsqueda por nombre o por parte del nombre. El Listado 61 le muestra un ejemplo de nuestro directorio lpi103 en el que buscamos, en primer lugar, todos los archivos que tienen "1" o "k" en su nombre. Luego de esto, realizamos algunas bsquedas de ruta que explicaremos en las notas que figuran a continuacin.

Listado 61. Bsqueda de archivos por nombre


[ian@echidna lpi103]$ find . -name "*[1k]*" ./text1 ./f1 ./backup ./backup/text1.bkp.2 ./backup/text1.bkp.1 ./f1a [ian@echidna lpi103]$ find . -ipath "*ACK*1" ./backup/text1.bkp.1 [ian@echidna lpi103]$ find . -ipath "*ACK*/*1" ./backup/text1.bkp.1 [

Notas: 1. Los patrones que usted puede usar son patrones de comodines shell como aquellos que analizamos con anterioridad en la seccin Comodines y globbing. 2. Puede usar-pathen vez de-namepara realizar la correspondencia con rutas completas en vez de slo con los nombres base del archivo. En este caso, el patrn puede abarcar los componentes de la ruta. 3. Si desea realizar una bsqueda que no distinga entre maysculas y minsculas, como se puede observar en el uso deipathque figura con anterioridad, antes de las opciones defindque buscan en una cadena o en un patrn, coloque una "i". 4. Si desea encontrar un archivo o un directorio cuyo nombre comienza con un punto (como, por ejemplo, .bashrc o el directorio actual (.)), debe especificar un punto inicial como parte del patrn. Si no hace esto, las bsquedas de nombre ignorarn estos archivos o directorios. En el primer ejemplo que figura con anterioridad, encontramos ambos archivos y un directorio (./backup). Use el parmetro-typejunto con un tipo de una letra para restringir la bsqueda. Use "f" para buscar los archivos regulares, "d" para buscar directorios y "l" para buscar vnculos simblicos. Vea la pgina man para usarfindy encontrar otros tipos posibles. El Listado 62 le muestra el resultado de la bsqueda de directorios (-type d). Listado 62. Bsqueda de archivos por tipo
[ian@echidna lpi103]$ find . -type d . ./backup [ian@echidna lpi103]$ find . -type d -name "*" ./backup

Tenga en cuenta que la especificacin-type d, sin especificar ningn tipo de nombre, visualiza directorios que tienen un punto inicial en sus nombres (slo el directorio actual en este caso). Tambin podemos realizar la bsqueda por tamao de archivo. Dicha bsqueda puede ser por un tamao especfico (n) o por archivos que tengan un tamao superior (+n) o inferior (-n) a un valor determinado. Al usar el lmite superior y el lmite inferior, podemos buscar archivos cuyo tamao se encuentre dentro de un rango determinado. De manera predeterminada, la opcin-sizedefindasume una unidad de "b" para bloques de 512 bytes. Entre las otras opciones disponibles, especifique "c" para indicar bytes o "k" para indicar kilobytes. En el Listado 63, primero buscamos todos los archivos con un tamao de 0 y, luego de esto, todos aquellos que tienen un tamao de 24 o 25 bytes. Tenga en cuenta que al especificar-emptyen vez de-size 0tambin se encuentran los archivos vacos. Listado 63. Bsqueda de archivos por tamao
[ian@echidna lpi103]$ find . -size 0 ./f2 ./f3 ./f4 ./f5 ./f6 ./f7 ./f8 ./f9 ./f1a [ian@echidna lpi103]$ find . -size -26c -size +23c -print ./text1 ./text2 ./text5 ./backup/text1.bkp.2 ./backup/text1.bkp.1

El Listado 63 introduce la opcin-print, que es un ejemplo de unaaccinque se puede tomar sobre los resultados que arroja la bsqueda. En el shell bash, sta es la accin predeterminada si no se especifica ninguna otra accin. En algunos sistemas y en algunos shells, es necesario indicar una accin. En caso contrario, no existir ningn dato de salida. Entre las dems acciones, podemos incluir las siguientes:-ls, que imprime la informacin del archivo equivalente a la del comandols -lids, o-exec, que ejecuta un comando para cada archivo.-execdebe concluir con un punto y coma, que debe ser escapado para evitar que el shell lo interprete primero. Adems, especifique {} donde desee que el archivo resultante se use en el comando. Como se describe con anterioridad, las llaves tambin tienen un significado para el shell y se las debera escapar (o colocar entre comillas). El Listado 64 le muestra cmo las

opciones-lsy-execse pueden usar para realizar una lista de la informacin del archivo. Listado 64. Bsqueda e influencia sobre los archivos
[ian@echidna lpi103]$ find . -size -26c -size +23c -ls 2128984 4 -rw-rw-r-- 1 ian ian 24 Sep 23 12:27 ./text1 2128985 4 -rw-rw-r-- 1 ian ian 25 Sep 23 13:39 ./text2 2128982 4 -rw-rw-r-- 1 ian ian 24 Sep 26 12:46 ./text5 1564497 4 -rw-rw-r-- 1 ian ian 24 Oct 4 09:45 ./backup/text1.bkp.2 2129019 4 -rw-rw-r-- 1 ian ian 24 Oct 4 09:43 ./backup/text1.bkp.1 [ian@echidna lpi103]$ find . -size -26c -size +23c -exec ls -l '{}' \; -rw-rw-r-- 1 ian ian 24 Sep 23 12:27 ./text1 -rw-rw-r-- 1 ian ian 25 Sep 23 13:39 ./text2 -rw-rw-r-- 1 ian ian 24 Sep 26 12:46 ./text5 -rw-rw-r-- 1 ian ian 24 Oct 4 09:45 ./backup/text1.bkp.2 -rw-rw-r-- 1 ian ian 24 Oct 4 09:43 ./backup/text1.bkp.1

La opcin-execse puede usar con tantos propsitos como se le ocurra. Por ejemplo:
find . -empty -exec rm '{}' \;

elimina todos los archivos vacos en un rbol de directorio, mientras que


find . -name "*.htm" -exec mv '{}' '{}l' \;

cambia el nombre de todos los archivos .htm para que pasen a ser archivos .html. En el caso de nuestros ltimos ejemplos, usamos las fechas y horas que se describen con anterioridad con el comandotouchpara localizar aquellos archivos que tengan una fecha y hora particular. El Listado 65 le muestra tres ejemplos: 1. Cuando se lo usa con-mtime -2, el comandofindbusca todos los archivos modificados en los ltimos dos das. En este caso, un da es un perodo de 24 horas relativo a la fecha y a la hora actual. Tenga en cuenta que usted usara-atimesi desease buscar archivos basndose en la hora de acceso en vez de en la hora de modificacin. 2. Al agregar la opcin-daystart, buscamos considerar los das como das calendario (comenzando desde la medianoche). Ahora, el archivo f3 se excluye de la lista. 3. Por ltimo, le mostramos cmo usar un rango de tiempo en minutos en vez de en das para buscar los archivos modificados entre la ltima hora (60 minutos) y las ltimas 10 horas (600 minutos). Listado 65. Bsqueda de archivos por fecha y hora

[ian@echidna lpi103]$ date Mon Nov 7 14:59:02 EST 2005 [ian@echidna lpi103]$ find . -mtime -2 -type f -exec ls -l '{}' \; -rw-rw-r-- 1 ian ian 0 Nov 5 15:10 ./f3 -rw-rw-r-- 1 ian ian 0 Nov 7 11:00 ./f4 -rw-rw-r-- 1 ian ian 0 Nov 6 06:00 ./f6 -rw-rw-r-- 1 ian ian 0 Nov 8 2005 ./f8 [ian@echidna lpi103]$ find . -daystart -mtime -2 -type f -exec ls -l '{}' \; -rw-rw-r-- 1 ian ian 0 Nov 7 11:00 ./f4 -rw-rw-r-- 1 ian ian 0 Nov 6 06:00 ./f6 -rw-rw-r-- 1 ian ian 0 Nov 8 2005 ./f8 [ian@echidna lpi103]$ find . -mmin -600 -mmin +60 -type f -exec ls -l '{}' \; -rw-rw-r-- 1 ian ian 0 Nov 7 11:00 ./f4

Las pginas man, en relacin al comandofind, lo pueden ayudar a interiorizarse sobre la gran variedad de opciones que no podemos explicar en esta breve introduccin. Flujos, canalizaciones y redireccionamientos Esta seccin se ocupa del material relativo al tema 1.103.4 para el examen 101 de Administracin Nivel Junior (LPIC-1). El tema tiene un valor de ponderacin de 5. En esta seccin, usted se interiorizar en los siguientes temas:
y y y y

Redireccionamiento de los flujos de entrada y salida estndar: entrada estndar, salida estndar y error estndar. Canalizacin de los datos de salida desde un comando hasta la entrada de otro. Envo de los datos de salida a stdout y a un archivo. Uso de los datos de salida del comando como argumentos para otro comando.

Redireccionamiento de las entradas y las salidas estndar Recuerde que los shells usan tres flujos de entrada y salidaestndar. 1. stdoutes elflujo de salida estndarque visualiza los datos de salida de los comandos. Adems, tiene el descriptor de archivo 1. 2. stderres elflujo de error estndarque visualiza los datos de salida de error de los comandos. Adems, tiene el descriptor de archivo 2. 3. stdines elflujo de entrada estndarque provee los datos de entrada a los comandos. Adems, tiene el descriptor de archivo 0. Los flujos de entrada proveen datos de entrada a los programas (generalmente, debido a pulsaciones de teclas de terminal). Los flujos de salida imprimen caracteres de texto (generalmente, en la terminal). La terminal sola ser una

mquina de escribir ASCII o una terminal de visualizacin. Pero en la actualidad, suele ser una ventana en un escritorio grfico. Como pudimos observar en Filtros y flujos de texto, podemos redireccionar los datos de salida estndar hacia un archivo o hacia los datos de entrada estndar de otro comando y podemos redireccionar la entrada estndar desde un archivo o desde los datos de salida de otro comando. Redireccionamiento de los datos de salida Existen dos formas de redireccionar los datos de salida: n> redirecciona los datos de salida desde el descriptor de archivonhacia un archivo. Usted debe tener autorizacin para escribir el archivo. Si el archivo no existe, se lo crea. En el caso de que s exista, los contenidos existentes se suelen perder sin que se realice ninguna advertencia al respecto. n>> tambin redirecciona los datos de salida desde el descriptor de archivonhacia un archivo. Una vez ms, usted debe tener autorizacin para escribir el archivo. Si el archivo no existe, se lo crea. En el caso de que s exista, los datos de salida se adjuntan al archivo existente. Lanen n> o en n>> se refiere aldescriptor de archivo. Si se la omite, se asumen los datos de salida estndar. El Listado 66 ilustra el uso del redireccionamiento para separar los datos de salida estndar y el error estndar del comandolsusando los archivos que creamos con anterioridad en nuestro directorio lpi103. Tambin ilustramos cmo se adjuntan los datos de salida a los archivos ya existentes. Listado 66. Redireccionamiento de los datos de salida
[ian@echidna lpi103]$ ls x* z* ls: z*: No such file or directory xaa xab [ian@echidna lpi103]$ ls x* z* >stdout.txt 2>stderr.txt [ian@echidna lpi103]$ ls w* y* ls: w*: No such file or directory yaa yab [ian@echidna lpi103]$ ls w* y* >>stdout.txt 2>>stderr.txt [ian@echidna lpi103]$ cat stdout.txt xaa xab yaa yab [ian@echidna lpi103]$ cat stderr.txt ls: z*: No such file or directory ls: w*: No such file or directory

Como ya lo explicamos, el redireccionamiento de los datos de salida usando n> suele sobrescribir los archivos ya existentes. Usted puede controlar esto con la opcinnoclobberdel builtinset. Si se lo configur, usted lo puede desactivar usando n>| (como se puede observar en el Listado 67). Listado 67. Redireccionamiento de los datos de salida con noclobber
[ian@echidna lpi103]$ set -o noclobber [ian@echidna lpi103]$ ls x* z* >stdout.txt 2>stderr.txt -bash: stdout.txt: cannot overwrite existing file [ian@echidna lpi103]$ ls x* z* >|stdout.txt 2>|stderr.txt [ian@echidna lpi103]$ cat stdout.txt xaa xab [ian@echidna lpi103]$ cat stderr.txt ls: z*: No such file or directory [ian@echidna lpi103]$ set +o noclobber #restore original noclobber setting

A veces, es posible que usted desee redireccionar los datos de salida estndar y el error estndar hacia un archivo. Esto se suele hacer en el caso de los procesos automatizados o los trabajos de segundo plano con el objetivo de que usted pueda revisar los datos de salida ms adelante. Use &> o &>> para redireccionar los datos de salida estndar y el error estndar hacia el mismo lugar. Otra forma de hacer esto consiste en redireccionar el descriptor de archivony, luego de esto, redireccionar el descriptor de archivomhacia el mismo lugar usando la construccin m>&n o m>>&n. El orden en el que los datos de salida se redireccionan es importante. Por ejemplo:
command 2>&1 >output.txt

no es lo mismo que
command >output.txt 2>&1

Ilustramos estos redireccionamientos en el Listado 68. Tenga en cuenta que, en el ltimo comando, los datos de salida estndar se redireccionaron luego del error estndar. Por lo tanto, los datos de salida del error estndar todava van hacia la ventana de terminal. Listado 68. Redireccionamiento de dos flujos hacia un mismo archivo
[ian@echidna lpi103]$ ls x* z* &>output.txt [ian@echidna lpi103]$ cat output.txt ls: z*: No such file or directory xaa xab [ian@echidna lpi103]$ ls x* z* >output.txt 2>&1 [ian@echidna lpi103]$ cat output.txt ls: z*: No such file or directory xaa xab [ian@echidna lpi103]$ ls x* z* 2>&1 >output.txt ls: z*: No such file or directory [ian@echidna lpi103]$ cat output.txt xaa xab

En otras ocasiones, es posible que usted desee ignorar por completo los datos de salida estndar o el error estndar. Para hacer esto, redireccione el flujo adecuado

hacia /dev/null. En el Listado 69, le mostramos cmo ignorar los datos de salida del error del comandols. Listado 69. Cmo ignorar los datos de salida usando /dev/null?
[ian@echidna lpi103]$ ls x* z* 2>/dev/null xaa xab [ian@echidna lpi103]$ cat /dev/null

Redireccionamiento de los datos de entrada De la misma forma que podemos redireccionar los flujos stdout y stderr, tambin podemos redireccionar stdin desde un archivo usando el operador <. Si hace memoria, en nuestra discusin de sort y uniq, usamos el comandotrpara reemplazar los espacios en nuestro archivo text1 por tabuladores. En ese ejemplo, usamos los datos de salida del comandocatpara crear los datos de entrada estndar para el comandotr. En vez de usarcatinnecesariamente, podemos usar el redireccionamiento de los datos de entrada para convertir los espacios en tabuladores (como se puede observar en el Listado 70). Listado 70. Redireccionamiento de los datos de entrada
[ian@echidna lpi103]$ tr ' ' '\t'<text1 1 apple 2 pear 3 banana

Los shells, incluyendo a bash, tambin tienen el concepto de undocumento here, que es otra forma de redireccionar los datos de entrada. Esta forma usa << junto con una palabra (como, por ejemplo, END) para un marcador o un centinela para indicar el final de los datos de entrada. Ilustramos esto en el Listado 71. Listado 71. Redireccionamiento de los datos de entrada con un documento here
[ian@echidna lpi103]$ sort -k2 <<END > 1 apple > 2 pear > 3 banana > END 1 apple 3 banana 2 pear

Se acuerda de cmo creamos el archivo text2 en el Listado 23? Seguramente se est preguntando por qu no ingressort -k2y sus datos y luego presion Ctrl-d para indicar el final de los datos de entrada. Y la respuesta corta a esto es que usted lo podra haber hecho, pero no habra aprendido nada sobre los documentos here. La respuesta real es que los documentos here se usan mucho ms a menudo en los shell scripts (que se detallan en el tutorial correspondiente al tema 109 sobre shells, scripting, programacin y compilacin). Un script no tiene ninguna otra forma de sealar qu lneas del script se deberan considerar datos de entrada. Como los shell scripts usan mucho la tabulacin para que la sangra

sea la correcta y as facilitar la lectura, esto no es todo en relacin a los documentos here. Si usted usa <<- en vez de <<, los tabuladores iniciales desaparecern. En el Listado 72, usamos la misma tcnica para crear un carcter de tabulacin cautivo que usamos en el Listado 42. Luego de esto, creamos un shell script muy pequeo que contiene dos comandoscat(cada uno de ellos lee de un documento here). Por ltimo, usamos el comando.(punto) paraoriginarel script, lo que significa ejecutarlo en el contexto shell actual. Listado 72. Redireccin de entrada con un documento here
[ian@echidna lpi103]$ ht=$(echo -en "\t") [ian@echidna lpi103]$ cat<<END>ex-here.sh > cat <<-EOF > apple > EOF > ${ht}cat <<-EOF > ${ht}pear > ${ht}EOF > END [ian@echidna lpi103]$ cat ex-here.sh cat <<-EOF apple EOF cat <<-EOF pear EOF [ian@echidna lpi103]$ . ex-here.sh apple pear

Volver arriba Canalizaciones En la seccin Flujos y filtros de texto, se defini elfiltradode texto como el proceso de tomar un flujo de texto de entrada y convertir el texto antes de enviarlo a un flujo de salida. Tambin se dijo que el filtrado se suele realizar construyendo unacanalizacinde comandos cuando los datos de salida de un comando soncanalizadosoredirigidospara su uso como datos de entrada para el siguiente. Este uso de canalizaciones no se limita a los flujos de texto, aunque es cierto que es en esos flujos donde se suelen usar. Canalizacin de stdout a stdin Como ya se analiz, el operador | (canalizacin) se usa entre dos comandos para dirigir el stdout del primer comando hasta el stdin del segundo. Para construir canalizaciones ms largas, es necesario agregar ms comandos y ms operadores, como se muestra en el listado 73. Listado 73. Canalizacin de datos de salida a travs de varios comandos
command1 | command2 | command3

Es importante mencionar que las canalizaciones solamente canalizan stdout hasta stdin. No es posible usar 2 | para canalizar stderr nicamente; por lo menos, no con las herramientas analizadas hasta el momento. Si stderr ha sido redirigido hasta stdout, ambos flujos sern canalizados. Esto se ilustra en el listado 74, donde se emplea una canalizacin para ordenar los mensajes de salida normales

y de error a partir de un improbable comandolscon cuatro argumentos comodn que no estn en orden alfabtico. Listado 74. Canalizacin de dos flujos de salida
[ian@echidna lpi103]$ ls y* x* z* u* q* 2>&1 |sort ls: q*: No such file or directory ls: u*: No such file or directory ls: z*: No such file or directory xaa xab yaa yab

Los comandos pueden presentar opciones o argumentos. Muchos de ellos, en lugar de un nombre de archivo, usan un guin (-) como argumento para indicar que la entrada debera provenir de stdin, y no de un archivo. Verifique las pginas man del comando para estar seguro. Construir largas canalizaciones de diversos comandos con capacidad limitada es una forma habitual de realizar tareas en Linux y UNIX. Una de las ventajas que presentan las canalizaciones en los sistemas Linux y UNIX es que, a diferencia de otros populares sistemas operativos, no hay ningn archivo intermedio involucrado en la canalizacin. El stdout del primer comando no es escrito en un archivo y luego ledo por el segundo comando. Si su versin detarno soporta la descompresin de archivos comprimidos conbzip2, no se preocupe. Como se analiz en el tutorial del tema 102, es posible usar una canalizacin como
bunzip2 -c drgeo-1.1.0.tar.bz2 | tar -xvf -

para realizar la tarea. Volver arriba Datos de salida como argumentos En la seccin Uso de la lnea de comandos se analiz la sustitucin de comandos y cmo usar los datos de salida de un comando como parte de otro. En la seccin Administracin bsica de archivos aprendimos cmo utilizar la opcin-idel comandofindpara usar los datos de salida del comandofindcomo datos de entrada de otro comando. El listado 75 muestra tres formas de visualizar los contenidos de los archivos text1 y text2 mediante estas tcnicas.

Listado 75. Uso de datos de salida como argumentos con sustitucin de comandos y find -exec
[ian@echidna lpi103]$ cat `ls text[12]` 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple [ian@echidna lpi103]$ cat $(find . -name "text[12]") 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple [ian@echidna lpi103]$ find . -name "text[12]" -exec cat '{}' \; 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple

Hasta ahora, los mtodos explicados no presentan complicaciones; sin embargo, tienen algunas limitaciones. Analicemos el caso de un nombre de archivo que contiene un espacio en blanco (vaco en este caso). Observe el listado 76 y vea si puede comprender qu sucede con cada uno de los comandos antes de leer las explicaciones pertinentes. Listado 76. Uso de datos de salida como argumentos con sustitucin de comandos y find -exec
[ian@echidna lpi103]$ echo grapes>"text sample2" [ian@echidna lpi103]$ cat `ls text*le2` cat: text: No such file or directory cat: sample2: No such file or directory [ian@echidna lpi103]$ cat "`ls text*le2`" grapes [ian@echidna lpi103]$ cat "`ls text*2`" cat: text2 text sample2: No such file or directory

Estos son los pasos que se siguieron.


y

Se cre un archivo llamado "text sample2" que contena una lnea con la palabra "grapes".

y y

Se intent usar la sustitucin de comandos para visualizar el contenido de "text sample2", pero sin xito, porque el shell pas dos parmetros a cat, a saber, text y sample2. Como somos ms inteligentes que el shell, decidimos encerrar entre comillas los valores de sustitucin de comandos, y tuvimos xito. Por ltimo, cambiamos la expresin comodn, y obtuvimos un error muy extrao. Lo que sucede es que el shell le da al comandocatunnico parmetro que es equivalente a la cadena que se originara a partir de echo -e "text2\ntext sample2" Si esto le parece extrao, prubelo usted mismo.

Ahora es necesario encontrar una manera de delinear los nombres de archivo independientemente de si estos consisten en una o ms palabras. Si bien no se aclar anteriormente, cuando los datos de salida de comandos tales comolsse usan en una canalizacin o una sustitucin de comandos, por lo general, los datos de salida tendrn un elemento por lnea. Esto se puede abordar con un builtinreaden un bucle con el builtinwhile. Aunque se excede el alcance del presente objetivo, ilustramos para despertar su inters y para introducir la solucin que presentamos a continuacin. Listado 77. Uso de while y read en un bucle
[ian@echidna lpi103]$ ls text*2 | while read l; do cat "$l";done 9 plum 3 banana 10 apple grapes

xargs La mayora de las veces se busca procesar listas de archivos; por eso, es fundamental encontrar una manera de buscarlas y luego procesarlas. Afortunadamente, el comandofindcuenta con una opcin,-print0, que separa nombres de archivo de salida con un carcter nulo en vez de una nueva lnea. Algunos comandos, comotaryxargs, tienen una opcin-0--nullque les permite comprender este tipo de parmetros. Ya hemos visto el comandotar. El comandoxargsfunciona de una manera similar a la opcin-execdefind, aunque presenta algunas diferencias importantes que se analizarn ms adelante. Antes, veamos un ejemplo. Listado 78. Uso de xargs con -0
[ian@echidna lpi103]$ find . -name "text*2" -print0 |xargs -0 cat 9 plum 3 banana 10 apple 1 apple 2 pear 3 banana grapes

Observe que ahora los datos de salida se canalizan desdefindhastaxargs. El punto y coma delimitado al final del comando no resulta necesario; de manera predeterminada, xargs anexa los argumentos a la cadena de comandos. Sin embargo, parece haber siete lneas de salida, y no las cuatro esperadas. Qu sali mal? Otra vez find Es posible usar el comandowcpara comprobar que hay solamente cuatro lneas de salida en los dos archivos que se pensaba imprimir. Este problema radica en quefindbusca en el directorio de copia de seguridad y tambin encuentra backup/text1.bkp.2, que coincide con nuestro patrn de comodines. Para solucionar esta cuestin, se utiliza la opcin-maxdepthdefind, que restringe la bsqueda a la profundidad de un solo directorio, el actual. Adems, con la opcinmindepthcorrespondiente, es posible especificar en gran medida la ubicacin de la bsqueda. El listado 79 ejemplifica la solucin final. Listado 79. Restriccin de find a las cuatro lneas deseadas
[ian@echidna lpi103]$ ls text*2 text2 text sample2 [ian@echidna lpi103]$ wc text*2 3 6 25 text2 1 1 7 text sample2 4 7 32 total [ian@echidna lpi103]$ find . -name "text*2" -maxdepth 1 -print0 |xargs -0 cat 9 plum 3 banana 10 apple grapes

Ms sobre xargs Existen otras diferencias entrexargsyfind -exec.


y

De manera predeterminada, el comandoxargsle pasa al comando tantos argumentos como fuera posible. Es posible limitar el nmero de lneas de entrada que se usarn con-l--max-linesy un nmero. Otra alternativa consiste en usar-no--max-argspara limitar el nmero de argumentos pasados, o bien-so--max-charspara limitar el nmero mximo de caracteres que se utilizan en la cadena de argumentos. Si el comando puede procesar mltiples argumentos, generalmente conviene procesar la mxima cantidad posible a la misma vez. Se puede usar '{}' del mismo modo que confind -execsi se especifica la opcin-io--replace. Es posible cambiar el valor predeterminado de '{}' de la cadena que indica dnde se debe sustituir el parmetro de entrada especificando un valor para-i. Esto implica-l 1.

Los ejemplos finales dexargspueden verse en el listado 80. Listado 80. Otros ejemplos de xargs
[ian@echidna lpi103]$ # pass all arguments at once [ian@echidna lpi103]$ find . -name "text*2" |xargs echo ./text2 ./backup/text1.bkp.2 ./text sample2 [ian@echidna lpi103]$ # show the files we created earlier with the touch command [ian@echidna lpi103]$ ls f[0-n]*|xargs echo f1 f1a f2 f3 f4 f5 f6 f7 f8 f9 [ian@echidna lpi103]$ # remove them in one stroke [ian@echidna lpi103]$ ls f[0-n]*|xargs rm [ian@echidna lpi103]$ # Use a replace string [ian@echidna lpi103]$ find . -name "text*2" |xargs -i echo - '{}' - ./text2 - ./backup/text1.bkp.2 - ./text sample2 [ian@echidna lpi103]$ # Limit of one input line per invocation [ian@echidna lpi103]$ find . -name "text*2" |xargs -l1 echo ./text2 ./backup/text1.bkp.2 ./text sample2 [ian@echidna lpi103]$ # Limit of one argument per invocation [ian@echidna lpi103]$ find . -name "text*2" |xargs -n1 echo ./text2 ./backup/text1.bkp.2 ./text sample2

Observe que en este caso no se us-print0. Esto explica el ejemplo final del listado 80? Volver arriba Divisin de datos de salida Esta seccin concluye con una breve discusin de otro comando. Es posible que el usuario desee ver los datos de salida en la pantalla mientras guarda una copia para ms adelante. Si bien esto se podra hacer redirigiendo los datos de salida del comando hacia un archivo en una ventana y luego usandotail -fn1para seguir los datos de salida en otra pantalla, es ms fcil usar el comandotee. El comandoteese utiliza con una canalizacin. Los argumentos son un archivo (o mltiples archivos) para datos de salida estndar. La opcin-aanexa en lugar de sobrescribir archivos. Como se analiz anteriormente al discutir las canalizaciones, es necesario redirigir stderr hasta stdout antes de canalizar hastateesi se quiere guardar ambas opciones. El listado 81 muestra el uso deteepara guardar los datos de salida en dos archivos, f1 y f2.

Listado 81. Divisin de stdout con tee


[ian@echidna lpi103]$ ls text[1-3]|tee f1 f2 text1 text2 text3 [ian@echidna lpi103]$ cat f1 text1 text2 text3 [ian@echidna lpi103]$ cat f2 text1 text2 text3

Creacin, supervisin y eliminacin de procesos Esta seccin abarca el material del tema 1.103.5 del examen 101 para Junior Level Administration (LPIC-1). El valor de ponderacin de este tema es 5. En esta seccin, usted aprender los siguientes temas:
y y y y y

Trabajos de primer y segundo plano Inicio de procesos sin terminal para E/S Supervisin y visualizacin de procesos Envo de seales a procesos Identificacin y eliminacin de procesos

Si se detiene a reflexionar por un instante, resulta evidente que hay muchas cosas en ejecucin en su computadora que son distintas de los programas de terminal que estuvimos ejecutando. De hecho, si usa un escritorio grfico, es posible que haya abierto ms de una ventana de terminal a la vez, o quizs un explorador de archivos, un explorador de Internet, un juego, una hoja de clculo u otra aplicacin. Hasta ahora, en los ejemplos analizados, se ingresaron comandos en una ventana de terminal. El comando se ejecuta y nosotros tenemos que esperar a que finalice para poder realizar alguna accin. En la seccin Uso de la lnea de comandos, conocimos el comandops, que muestra el estado del proceso, y aprendimos que los procesos tienen una id. de proceso (PID) y una id. de proceso primario (PPID). En esta seccin aprenderemos cmo se puede hacer ms de una cosa a la vez usando la ventana de terminal. Trabajos de primer y segundo plano Cuando se ejecuta un comando en la ventana de terminal, como vinimos haciendo hasta ahora, ese comando se est ejecutando enprimer plano. Hasta ahora, los comandos se han ejecutado rpidamente, pero supongamos que estamos ejecutando un escritorio grfico y deseamos que en el escritorio se visualice un

reloj digital. Dejemos de lado el hecho de que la mayora de los escritorios ya tienen uno; este es un mero ejemplo. Si tiene instalado el Sistema de Ventanas X, es probable que tambin tenga ciertas utilidades comoxclockoxeyes. Cualquiera de las dos podra funcionar en este ejercicio, pero usaremos xclock. La pgina man explica que es posible iniciar un reloj digital en el escritorio grfico usando el comando
xclock -d -update 1

La parte-update 1solicita actualizaciones una vez por segundo; de lo contrario, el reloj se actualizara una vez por minuto. Si se lo ejecuta en una ventana de terminal, aparecer un reloj como el de la figura 2, y la apariencia de la ventana de terminal sera similar a la del listado 82. Si no dispone de xclock o del Sistema de Ventanas X, le ensearemos a crear un reloj digital alternativo con su terminal; por ahora siga leyendo y luego vuelva a hacer estos ejercicios con ese reloj. Figura 2. Reloj digital con xclock

Listado 82. Inicio de xclock


[ian@echidna ian]$ xclock -d -update 1

Desafortunadamente, la ventana de terminal ya no tiene un aviso, por lo que resulta fundamental retomar el control. Por suerte, el shell Bash tiene la teclasuspender, Ctrl-z. Al presionar esta combinacin de teclas, aparecer un aviso de terminal como se muestra en el listado 83 Listado 83. Suspensin de xclock con Ctrl-z
[ian@echidna ian]$ xclock -d -update 1 [1]+ Stopped xclock -d -update 1 [ian@echidna ian]$

El reloj sigue estando en el escritorio, pero ha dejado de ejecutarse. Esto es precisamente lo que genera una suspensin. De hecho, si se arrastra otra ventana sobre una parte del reloj, esa parte no se vuelve a dibujar. Tambin se puede visualizar un mensaje de salida de terminal que indica "[1]+ Stopped". El 1 representa unnmero de trabajo. El reloj se puede reiniciar escribiendofg %1. Tambin es posible usar el nombre del comando, o una parte de l, escribiendofg %xclockofg %?clo. Finalmente, si solamente se utilizafgsin parmetros, es posible reiniciar el trabajo que se detuvo en ltimo lugar, el trabajo 1 en este caso. Si se lo reinicia confg, el trabajo pasar a primer plano, y ya no habr un shell prompt. Es necesario colocar el trabajo ensegundo plano; el comandobgtiene el mismo tipo de especificacin de trabajo que el comandofgy eso es precisamente

lo que hace. El listado 84 muestra cmo traer el trabajo de xclock al primer plano y suspenderlo usando dos formas del comandofg. Es posible suspenderlo una vez ms y colocarlo en segundo plano; el reloj se sigue ejecutando mientras se realiza otro trabajo en la terminal. Listado 84. Colocacin de xclock en segundo plano
[ian@echidna ian]$ fg %1 xclock -d -update 1 [1]+ Stopped xclock -d -update 1 [ian@echidna ian]$ fg %?clo xclock -d -update 1 [1]+ Stopped xclock -d -update 1 [ian@echidna ian]$ bg [1]+ xclock -d -update 1 & [ian@echidna ian]$

Uso de "&" Habr observado que cuando se coloc el trabajo de xclock en segundo plano, el mensaje ya no deca "Stopped" y terminaba con el smbolo et (&). En realidad, no es necesario suspender el proceso para colocarlo en segundo plano. Al anexar el smbolo et al comando, el shell iniciar el comando (o lista de comandos) en segundo plano. Usando este mtodo, iniciemos un reloj analgico con fondo color trigo y agujas rojas. Aparecern un reloj similar al de la figura 3 y datos de salida de terminal como los que se indican en el listado 85. Figura 3. Reloj analgico con xclock

Listado 85. Inicio de xclock en segundo plano con &


[ian@echidna ian]$ xclock -bg wheat -hd red -update 1& [2] 5659

Observe que esta vez el mensaje es ligeramente diferente. Representa un nmero de trabajo y una id. de proceso (PID). Ya analizaremos las PID y ms temas de estado ms adelante. Por ahora, usemos el comandojobspara determinar qu trabajos se estn ejecutando. Agregue la opcin-lpara listar las PID, y notar que el trabajo 2 tiene la PID 5659, tal como se muestra en el listado 86. Observe

adems que el trabajo 2 tiene el smbolo ms (+) al lado del nmero de trabajo, lo que indica que este es eltrabajo actual. El trabajo pasar a primer plano si no se da ninguna especificacin con el comandofg. Listado 86. Visualizacin de informacin de trabajos y procesos
[ian@echidna ian]$ jobs -l [1]4234 Running xclock -d -update 1 & [2]+ 5659 Running xclock -bg wheat -hd red -update 1 &

Antes de abordar otras cuestiones relativas a los trabajos de segundo plano, creemos un reloj digital alternativo. Use el comandosleeppara generar un retraso de dos segundos y use el comandodatepara imprimir la fecha y la hora actuales. Ajuste estos comandos en un buclewhilecon un bloquedo/donepara crear un bucle infinito. Por ltimo, encierre todos estos elementos entre parntesis para formar una lista de comandos y coloque toda la lista en segundo plano usando el smbolo et. Listado 87. Reloj digital alternativo
[ian@echidna ian]$ (while sleep 2; do date;done) & [1] 16291 [ian@echidna ian]$ Thu Nov 10 22:58:02 EST 2005 Thu Nov 10 22:58:04 EST 2005 Thu Nov 10 22:58:06 EST 2005 Thu Nov 10 22:58:08 EST 2005 fThu Nov 10 22:58:10 EST 2005 Thu Nov 10 22:58:12 EST 2005 gThu Nov 10 22:58:14 EST 2005 ( while sleep 2; do date; done ) Thu Nov 10 22:58:16 EST 2005 Thu Nov 10 22:58:18 EST 2005

Tal como se esperaba, la lista se ejecuta como trabajo 1 con PID 16291. Cada dos segundos se ejecuta el comando date y se imprimen en la terminal una fecha y una hora determinadas. Los datos de entrada que se ingresen sern resaltados. Si usted es lento para escribir, los caracteres quedarn intercalados entre las lneas de salida hasta que logre escribir el comando completo. Observe que la "f" y la "g" que escribimos para traer la lista de comandos a primer plano estn separadas. Cuando, finalmente, ingresamos el comandofg, bash muestra el comando que se est ejecutando en el shell, es decir, la lista de comandos, que felizmente sigue imprimiendo la hora cada dos segundos.

Una vez que se logra colocar el trabajo en primer plano, es posible finalizarlo (oeliminarlo), o bien realizar otra accin. En este caso, usamos Ctrl-c para finalizar nuestro "reloj". E/S estndar y procesos de segundo plano En el ejemplo anterior, los datos de salida del comandodateestn intercalados entre los caracteres repetidos del comandofgque pretendamos escribir. Esto plantea una cuestin interesante. Qu sucede si un proceso requiere datos de entrada de stdin? El proceso de terminal con el cual se inicia una aplicacin de segundo plano se llamaterminal de control. Salvo que sean redirigidos hacia otro lugar, los flujos stdout y stderr del proceso de segundo plano se dirigen a la terminal de control. De esta manera, la tarea de segundo plano espera datos de entrada de la terminal de control, pero esta no puede dirigir los caracteres que se escriben al flujo stdin de un proceso de segundo plano. En ese caso, el Bash shell suspende el proceso, que deja de ejecutarse. Es posible traerlo a primer plano y proporcionar los datos de entrada necesarios. El listado 88 ejemplifica un sencillo caso en donde se puede colocar una lista de comandos en segundo plano. Despus de un instante, presione Entrar y el proceso se detendr. Trigalo a primer plano y proporcione una lnea de entrada seguida de Ctrl-d para sealar el fin del archivo de entrada. De esta manera, se completa la lista de comandos y se visualiza el archivo creado. Listado 88. En espera de stdin
[ian@echidna ian]$ (date; cat - >bginput.txt; date)& [1] 18648 [ian@echidna ian]$ Fri Nov 11 00:03:28 EST 2005 [1]+ Stopped ( date; cat - >bginput.txt; date ) [ian@echidna ian]$ fg ( date; cat - >ginput.txt; date ) input data Fri Nov 11 00:03:53 EST 2005 [ian@echidna ian]$ cat bginput.txt input data

Volver arriba Trabajos sin terminales En la prctica, es probable que usted desee redirigir flujos de E/S estndar de procesos de segundo plano desde o hacia un archivo. Pero qu sucede con el proceso si la terminal de control se cierra o el usuario cierra sesin? La respuesta

depender del shell que est en uso. Si el shell enva una seal SIGHUP (o de detencin imprevista), es probable que la aplicacin se cierre. Si bien en breve analizaremos las seales, veamos otra solucin para este problema. nohup El comandonohupse usa para iniciar un comando que omitir las seales de detencin imprevista y anexara stdout y stderr a un archivo. El archivo predeterminado es nohup.out o $HOME/nohup.out. Si el archivo no se puede escribir, el comando no se ejecutar. Si desea que los datos de salida se dirijan a otro lugar, redirija stdout, o stderr, de la manera indicada en la seccin anterior de este tutorial. Otro aspecto denohupes que no ejecutar una canalizacin o una lista de comandos. En el tema Redireccin de E/S estndar, se demostr cmo se puede guardar un grupo de comandos en un script shell y cmo se lo puede originar. Es posible guardar una canalizacin o una lista en un archivo y luego ejecutarla usando el comandosh(shell predeterminado) obash, aunque no se puede usar el comando . orsourcecomo en el ejemplo anterior. El prximo tutorial de esta serie (tema 104, Dispositivos, sistemas de archivos Linux y Estndar de Jerarqua de Sistemas de Archivos) muestra cmo hacer para que el archivo de script sea ejecutable, pero por ahora seguiremos con scripts en ejecucin, originndolos o usando el comandoshobash. El listado 89 muestra como podramos hacer esto con el reloj digital alternativo. No es necesario decir que tener la hora escrita en un archivo no es de gran utilidad; el archivo seguir creciendo. Por eso, debemos establecer que el reloj se actualice cada 30 segundos, y no una vez por segundo. Listado 89. Uso de nohup con una lista de comandos en un script
[ian@echidna ian]$ echo "while sleep 30; do date;done">pmc.sh [ian@echidna ian]$ nohup . pmc.sh& [1] 21700 [ian@echidna ian]$ nohup: appending output to `nohup.out' [1]+ Exit 126 nohup . pmc.sh [ian@echidna ian]$ nohup sh pmc.sh& [1] 21709 [ian@echidna ian]$ nohup: appending output to `nohup.out' [ian@echidna ian]$ nohup bash pmc.sh& [2] 21719 [ian@echidna ian]$ nohup: appending output to `nohup.out'

Al visualizar el contenido de nohup.out, observamos que la primera lnea indica por qu aparece el cdigo de salida 126 en el primer intento. Las siguientes lneas representan los datos de salida de las dos versiones de pmc.sh que se ejecutan en segundo plano. Esto queda ilustrado en el listado 90.

Listado 90. Datos de salida de los procesos nohup


[ian@echidna ian]$ cat nohup.out /bin/nice: .: Permission denied Fri Nov 11 15:30:03 EST 2005 Fri Nov 11 15:30:15 EST 2005 Fri Nov 11 15:30:33 EST 2005 Fri Nov 11 15:30:45 EST 2005 Fri Nov 11 15:31:03 EST 2005

Ahora dirijamos nuestra atencin al estado de los procesos. Si usted tiene planeado tomarse un descanso a estas alturas, siga leyendo un poco ms, ya que hay dos trabajos que estn creando archivos ms grandes en el sistema de archivos. Es posible usar el comandofgpara traerlos a primer plano y luego usar Ctrl-c para finalizarlos; sin embargo, si los deja en ejecucin, aprenderemos otras maneras de supervisarlos e interactuar con ellos. Volver arriba Estado de los procesos En la parte anterior de esta seccin, vimos una breve introduccin al comandojobsy aprendimos a usarlo para listar las id. de proceso (o PID) de los trabajos. ps Existe otro comando, el comandops, que se usa para visualizar informacin de estado de los procesos. Tenga en cuenta que "ps" es la sigla de "process status" ("estado de proceso"). El comandopsacepta cero o ms PID como argumento y muestra el estado del proceso pertinente. Si el comandojobsse usa con la opcin-p, los datos de salida representarn la PID dellder de grupo de procesosde cada trabajo. Usaremos estos datos de salida como argumentos del comandops, como se muestra en el listado 91. Listado 91. Estado de los procesos de segundo plano
[ian@echidna ian]$ jobs [1]- Running nohup sh pmc.sh & [2]+ Running nohup bash pmc.sh & [ian@echidna ian]$ jobs -p 21709 21719 [ian@echidna ian]$ ps `jobs -p` PID TTY STAT TIME COMMAND 21709 pts/3 SN 0:00 sh pmc.sh 21719 pts/3 SN 0:00 bash pmc.sh

Si usamospssin opciones, aparecer una lista de procesos que usan nuestra terminal como su terminal de control, tal como se puede ver en el listado 92. Listado 92. Visualizacin de estado con ps
[ian@echidna ian]$ ps PID TTY TIME CMD 20475 pts/3 00:00:00 bash 21709 pts/3 00:00:00 sh 21719 pts/3 00:00:00 bash 21922 pts/3 00:00:00 sleep 21930 pts/3 00:00:00 sleep 21937 pts/3 00:00:00 ps

Hay diversas opciones, como-f(full),-j(jobs) y-l(long), que controlan la cantidad de informacin que se visualiza. Si no se especifica ninguna PID, otra opcin til es-forest, que muestra los comandos en una jerarqua de rbol. De esta manera, se puede visualizar cul proceso tiene a cul otro como proceso principal. En particular, observamos que los comandossleepdel listado anterior son procesos secundarios de los scripts que ejecutamos en segundo plano. Si los comandos se ejecutaran en un instante diferente, podramos ver el comandodatelistado en el estado de procesos, pero las posibilidades son muy escasas con este script. En el listado 93 se pueden ver algunos ejemplos pertinentes. Listado 93. Informacin adicional de estado
[ian@echidna ian]$ ps -f UID PID PPID C STIME TTY TIME CMD ian 20475 20474 0 15:02 pts/3 00:00:00 -bash ian 21709 20475 0 15:29 pts/3 00:00:00 sh pmc.sh ian 21719 20475 0 15:29 pts/3 00:00:00 bash pmc.sh ian 21945 21709 0 15:34 pts/3 00:00:00 sleep 30 ian 21953 21719 0 15:34 pts/3 00:00:00 sleep 30 ian 21954 20475 0 15:34 pts/3 00:00:00 ps -f [ian@echidna ian]$ ps -j --forest PID PGID SID TTY TIME CMD 20475 20475 20475 pts/3 00:00:00 bash 21709 21709 20475 pts/3 00:00:00 sh 21945 21709 20475 pts/3 00:00:00 \_ sleep 21719 21719 20475 pts/3 00:00:00 bash 21953 21719 20475 pts/3 00:00:00 \_ sleep 21961 21961 20475 pts/3 00:00:00 ps

Listado de otros procesos Los comandospsutilizados hasta ahora solo listan procesos que fueron iniciados desde su sesin de terminal (observe la columna SID en el segundo ejemplo del listado 93). Para ver todos los procesos con terminales de control, use la opcin-a. La opcin-xmuestra procesos sin terminal de control y la opcin-emuestra

informacin de todos los procesos. El listado 94 muestra el formato completo de todos los procesos con una terminal de control. Listado 94. Visualizacin de otros procesos
[ian@echidna ian]$ ps -af UID PID PPID C STIME TTY ian 4234 32537 0 Nov10 pts/0 ian 5659 32537 0 Nov10 pts/0 ian 21709 20475 0 15:29 pts/3 ian 21719 20475 0 15:29 pts/3 ian 21969 21709 0 15:35 pts/3 ian 21977 21719 0 15:35 pts/3 ian 21978 20475 0 15:35 pts/3 TIME CMD 00:00:00 xclock -d -update 1 00:00:00 xclock -bg wheat -hd red -update 00:00:00 sh pmc.sh 00:00:00 bash pmc.sh 00:00:00 sleep 30 00:00:00 sleep 30 00:00:00 ps -af

Observe que este listado incluye los dos procesos xclock iniciados desde la terminal grfica principal de este sistema (pts/0); los otros procesos que se muestran estn asociados a una conexin ssh (Secure Shell) (pts/3 en este caso). Existen muchas ms opciones paraps, como algunas que proporcionan un control significativo sobre los campos que se visualizan y la manera en que se visualizan. Otras opciones proporcionan control sobre la seleccin de procesos para visualizar, por ejemplo, mediante la seleccin de esos procesos para un usuario determinado. Consulte las pginas man depspara obtener ms informacin, o lea un breve resumen usandops --help. top Si usted ejecutapsvarias veces seguidas para ver los cambios que se producen, probablemente necesitar el comandotop. Este comando muestra una lista de procesos permanentemente actualizada, adems de tiles resmenes. Consulte las pginas man detoppara obtener informacin detallada acerca de las opciones, como la manera de ordenar segn el uso de memoria u otros criterios. El listado 95 muestra las primeras lneas de una visualizacin detop. Listado 95. Visualizacin de otros procesos
3:37pm up 46 days, 5:11, 2 users, load average: 0.01, 0.17, 0.19 96 processes: 94 sleeping, 1 running, 0 zombie, 1 stopped CPU states: 0.1% user, 1.0% system, 0.0% nice, 0.9% idle Mem: 1030268K av, 933956K used, 96312K free, 0K shrd, 119428K buff Swap: 1052216K av, 1176K used, 1051040K free 355156K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 22069 ian 17 0 1104 1104 848 R 0.9 0.1 0:00 top 1 root 8 0 500 480 444 S 0.0 0.0 0:04 init 2 root 9 0 0 0 0 SW 0.0 0.0 0:00 keventd 3 root 9 0 0 0 0 SW 0.0 0.0 0:00 kapmd

4 root 5 root

19 19 0 0 0 SWN 0.0 0.0 0:00 ksoftirqd_CPU0 9 0 0 0 0 SW 0.0 0.0 0:00 kswapd

Volver arriba Seales Observemos ahora lassealesLinux, que constituyen una forma asincrnica de comunicarse con los procesos. Ya hemos mencionado la seal SIGHUP y hemos usado tanto Ctrl-c como Ctrl-z, que representan otra manera de enviar una seal a los procesos. La manera ms habitual de enviar una seal es a travs del comandokill. Envo de seales con kill El comandokillenva una seal a un determinado trabajo o proceso. El listado 96 muestra el uso de las seales SIGTSTP y SIGCONT para detener y reanudar un trabajo de segundo plano. Usar la seal SIGTSTP es equivalente a usar el comandofgpara traer el trabajo a primer plano y luego Ctrl-z para suspenderlo. El uso de SIGCONT es similar al uso del comandobg. Listado 96. Detencin y reinicio de trabajos de segundo plano
[ian@echidna ian]$ kill -s SIGTSTP %1 [ian@echidna ian]$ jobs -l [1]+ 21709 Stopped nohup sh pmc.sh [2]- 21719 Running nohup bash pmc.sh & [ian@echidna ian]$ kill -s SIGCONT %1 [ian@echidna ian]$ jobs -l [1]+ 21709 Running nohup sh pmc.sh & [2]- 21719 Running nohup bash pmc.sh &

En este ejemplo se us la especificacin de trabajo (%1), pero tambin es posible enviar seales a una id. de proceso (como 21709, que es la PID del trabajo %1). Si se usa el comandotailmientras el trabajo %1 est detenido, solamente un proceso actualizar el archivo nohup.out. Existen otras seales que se pueden visualizar en el sistema usandokill -l. Algunas se usan para notificar errores tales como cdigos de operacin ilegales, excepciones de punto flotante o intentos de acceder a una memoria a la que el proceso no tiene acceso. Tenga en cuenta que las seales tienen un nmero, como p. ej., 20, y un nombre, como SIGTSTP. Es posible usar tanto el nmero como el nombre con la opcin-s. Se aconseja comprobar los nmeros de las seales en el sistema antes de asumir que un determinado nmero corresponde a una determinada seal.

Controladores de seales y terminacin de procesos Ya hemos visto que Ctrl-c sirve para terminar un proceso. De hecho, enva una seal SIGINT (o interrumpir) al proceso. Si kill se usa sin nombre de seal, enviar una seal SIGTERM. En la mayora de los casos, estas dos seales son equivalentes. Como se explic anteriormente, el comandonohuphace que un determinado proceso sea inmune a la seal SIGHUP. Por lo general, un proceso puede implementar uncontrolador de sealesparacapturarseales. As, un proceso podra implementar un controlador de seales para capturar tanto SIGINT como SIGTERM. Como el controlador de seales sabe qu seal se envi, puede, por ejemplo, optar por omitir SIGINT y realizar la terminacin nicamente cuando recibe SIGTERM. El listado 97 muestra cmo enviar la seal SIGTERM al trabajo %1. Observe que el estado del proceso pasa a ser "Terminated" ("Terminado") una vez enviada la seal. Si, por el contrario, se usara SIGINT, el estado sera "Interrupt" ("Interrumpir"). Transcurridos unos instantes, se produce la limpieza de los procesos y el trabajo deja de aparecer en la lista de trabajos. Listado 97. Terminacin de un proceso con SIGTERM
[ian@echidna ian]$ kill -s SIGTERM %1 [ian@echidna ian]$ jobs -l [1] 21709 Terminated nohup sh pmc.sh [2]- 21719 Running nohup bash pmc.sh & [ian@echidna ian]$ jobs -l [2]+ 21719 Running nohup bash pmc.sh &

Los controladores de seales le otorgan al proceso una gran flexibilidad en el sentido de que un proceso puede realizar su trabajo normal y ser interrumpido por una seal por algn motivo particular. Adems de permitir que los procesos capturen solicitudes de terminacin y realicen una determinada accin, como cerrar archivos o establecer puntos de comprobacin de las transacciones en curso, las seales se suelen utilizar para ordenarle a un proceso daemon que vuelva a leer su archivo de configuracin y, posiblemente, que reinicie la operacin. Esto se puede hacer con el proceso inetd, cuando se cargan los parmetros de red, o con line printer daemon (lpd), cuando se agrega una nueva impresora. Terminacin incondicional de procesos Algunas seales no pueden ser capturadas, como es el caso de ciertas excepciones de hardware. SIGKILL, la seal que ms probablemente se usar, no puede ser capturada por un controlador de seales y termina los procesos incondicionalmente. Por lo general, se aconseja utilizar esta opcin nicamente si fallaron todos los dems mtodos de terminacin de procesos.

Volver arriba Cierre de sesin y nohup Ya hemos dicho que el uso denohuppermite que los procesos se sigan ejecutando despus de cerrar sesin. Bueno, hagamos eso y luego volvamos a iniciar sesin. Una vez iniciada la sesin, verifiquemos el proceso del reloj alternativo usandojobsypscomo se hizo anteriormente. Los datos de salida se muestran en el listado 98. Listado 98. Nuevo inicio de sesin
[ian@echidna ian]$ jobs [ian@echidna ian]$ ps -a PID TTY TIME CMD 4234 pts/0 00:00:00 xclock 5659 pts/0 00:00:00 xclock 27217 pts/4 00:00:00 ps

Como se puede observar, esta vez la ejecucin es en pts/4, si bien no hay signos de nuestros trabajos, solamente el comandopsy los dos procesos xclock iniciados desde la terminal grfica (pts/0). Tal vez no es lo que esperbamos. Sin embargo, no est todo perdido. En el listado 99 se muestra una forma de encontrar el trabajo perdido usando la opcin-spara id. de sesin, junto con la id. de sesin de 20475 que vimos en el listado 93. De qu otra forma se los habra podido encontrar si la id. de sesin no hubiera estado disponible? Listado 99. Nuevo inicio de sesin
[ian@echidna ian]$ ps -js 20475 PID PGID SID TTY TIME CMD 21719 21719 20475 ? 00:00:00 bash 27335 21719 20475 ? 00:00:00 sleep

Con todo lo que hemos aprendido sobre la eliminacin de procesos, usted debera poder eliminar estos procesos usando su PID y el comandokill. Prioridades de ejecucin de procesos Esta seccin abarca el material del tema 1.103.6 del examen 101 para Junior Level Administration (LPIC-1). El valor de ponderacin de este tema es 3. En esta seccin, usted aprender los siguientes temas:
y y y

Prioridades de ejecucin de procesos Establecimiento de prioridades Cambio de prioridades

Prioridades Como vimos en la seccin anterior, Linux, como la mayora de los sistemas operativos modernos, puede ejecutar mltiples procesos. Lo hace compartiendo la CPU y otros recursos entre los diferentes procesos. Si algunos procesos pueden usar el 100% de la CPU, es posible que otros procesos no respondan. Cuando analizamos el estado de los procesos en la seccin anterior, pudimos observar que, de manera predeterminada, el comandotoplistaba los procesos en orden descendente segn el uso de CPU. Si ejecutramos el comando top con el script del reloj alternativo, es probable que ese proceso no aparezca en la lista porque el proceso pasa la mayor parte del tiempo sin usar la CPU. Es posible que su sistema tenga numerosos comandos capaces de usar grandes cantidades de CPU. Algunos ejemplos son las herramientas de edicin de pelculas y los programas que convierten diferentes tipos de imgenes o diferentes codificaciones de sonido, p. ej., de mp3 a ogg. A continuacin crearemos un pequeo script que usa CPU y no mucho ms. Este script tiene dos datos de entrada, un contador y una etiqueta. Imprime la etiqueta y la fecha y la hora actuales, luego disminuye el contador hasta que llegue a 0 y luego imprime la etiqueta y la fecha una vez ms. Este script no tiene comprobacin de errores y no es demasiado slido, pero sirve como ejemplo. Listado 100. Script de gran consumo de CPU
[ian@echidna ian]$ echo 'x="$1"'>count1.sh [ian@echidna ian]$ echo 'echo "$2" $(date)'>>count1.sh [ian@echidna ian]$ echo 'while [ $x -gt 0 ]; do let x=$x-1;done'>>count1.sh [ian@echidna ian]$ echo 'echo "$2" $(date)'>>count1.sh [ian@echidna ian]$ cat count1.sh x="$1" echo "$2" $(date) while [ $x -gt 0 ]; do let x=$x-1;done echo "$2" $(date)

Si usted ejecuta el script en su sistema, es posible que los datos de salida sean similares a los del listado 101. Este script usa grandes cantidades de CPU, como se ver a continuacin. Si no est trabajando en su estacin de trabajo, asegrese de que no haya ningn problema en usar grandes cantidades de CPU antes de ejecutar el script. Listado 101. Ejecucin de count1.sh
[ian@echidna ian]$ sh count1.sh 10000 A A Mon Nov 14 07:14:04 EST 2005 A Mon Nov 14 07:14:05 EST 2005 [ian@echidna ian]$ sh count1.sh 99000 A A Mon Nov 14 07:14:26 EST 2005 A Mon Nov 14 07:14:32 EST 2005

Hasta aqu no hay ningn problema. Ahora apliquemos algunas de las cosas que aprendimos en este tutorial para crear una lista de comandos a fin de ejecutar el script en segundo plano e iniciar el comandotoppara verificar qu cantidad de CPU usa el script. La lista de comandos se muestra en el listado 102 y los datos de salida detop, en el listado 103. Listado 102. Ejecucin de count1.sh y top
[ian@echidna ian]$ (sh count1.sh 99000 A&);top

Listado 103. Uso de grandes cantidades de CPU


7:20am up 48 days, 20:54, 2 users, load average: 0.05, 0.05, 0.00 91 processes: 88 sleeping, 3 running, 0 zombie, 0 stopped CPU states: 0.1% user, 0.0% system, 0.0% nice, 0.9% idle Mem: 1030268K av, 1002864K used, 27404K free, 0K shrd, 240336K buff Swap: 1052216K av, 118500K used, 933716K free 605152K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 8684 ian 20 0 1044 1044 932 R 98.4 0.1 0:01 sh

Nada mal. Estamos usando un 98,4% de la CPU con un simple script. Volver arriba Visualizacin y establecimiento de prioridades Si estuviramos en presencia de un trabajo de ejecucin prolongada como el del ejemplo, podramos observar que ese trabajo dificulta la posibilidad de realizar otros trabajos en el sistema. Los sistemas Linux y UNIX usan un sistema de prioridades con 40 prioridades, que abarca desde -20 (la prioridad ms alta) hasta 19 (la prioridad ms baja). nice Los procesos iniciados por usuarios regulares tienen prioridad 0. El comandonicemuestra la prioridad predeterminada. El comandopstambin muestra la prioridad [nivel nice (amable), o NI], por ejemplo, usando la opcin-l. Esto se puede apreciar en el listado 104, donde se ha resaltado el valor nice 0. Listado 104. Visualizacin de informacin de prioridades
[ian@echidna ian]$ nice 0 [ian@echidna ian]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 000 S 500 7283 7282 0 70 0 - 1103 wait4 pts/2 00:00:00 bash

000 R 500 9578 7283 0 72 0

- 784 -

pts/2

00:00:00 ps

El comandonicetambin se puede usar para iniciar un proceso con una prioridad diferente. Use la opcin-no (--adjustment) con un valor positivo para aumentar el valor de la prioridad y con un valor negativo para disminuirlo. Tenga en cuenta que los procesos con el valor de prioridad ms bajo se ejecutan con la prioridad de programacin ms alta. Por eso, considere el incremento del valor de prioridad como una manera de seramablecon los otros procesos. Tenga presente que, por lo general, es necesario ser un superusuario (root) para especificar ajustes de prioridad negativos. En otras palabras, los usuarios regulares nicamente pueden hacer que sus procesos sean ms amables. En el listado 105, se ejecutaron dos copias del script count1.sh en segundo plano con diferentes prioridades de programacin. Observe que hay un intervalo de unos 5 segundos entre los tiempos de finalizacin. Experimente con diferentes valores amables, o ejecutando el primer proceso con un ajuste de prioridad en vez del segundo para comprobar las diferentes posibilidades. Listado 105. Uso de nice para establecer prioridades
[ian@echidna ian]$ (sh count1.sh 99000 A&);\ > (nice -n 19 sh count1.sh 99000 B&);\ > sleep 2;ps -l;sleep 20 B Mon Nov 14 08:17:36 EST 2005 A Mon Nov 14 08:17:36 EST 2005 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 000 S 500 7283 7282 0 70 0 - 1104 wait4 pts/2 00:00:00 bash 000 R 500 10765 1 84 80 0 - 1033 pts/2 00:00:01 sh 000 R 500 10767 1 14 79 19 - 1033 pts/2 00:00:00 sh 000 R 500 10771 7283 0 72 0 - 784 pts/2 00:00:00 ps A Mon Nov 14 08:17:43 EST 2005 B Mon Nov 14 08:17:48 EST 2005

Observe que, al igual que con el comandonohup, no es posible usar una lista de comandos o una canalizacin como argumento denice. Volver arriba Cambio de prioridades renice Si, al iniciar un proceso, usted advierte que ese proceso debera ejecutarse con una prioridad diferente, existe una manera de cambiarlo una vez iniciado, usando el comandorenice. Se especifica una prioridad absoluta (no un ajuste) para que el o los procesos cambien como se indica en el listado 106.

Listado 106. Uso de renice para cambiar prioridades


[ian@echidna ian]$ sh count1.sh 299000 A& [1] 11322 [ian@echidna ian]$ A Mon Nov 14 08:30:29 EST 2005 [ian@echidna ian]$ renice +1 11322;ps -l 11322: old priority 0, new priority 1 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 000 S 500 7283 7282 0 75 0 - 1104 wait4 pts/2 00:00:00 bash 000 R 500 11322 7283 96 77 1 - 1032 pts/2 00:00:11 sh 000 R 500 11331 7283 0 76 0 - 786 pts/2 00:00:00 ps [ian@echidna ian]$ renice +3 11322;ps -l 11322: old priority 1, new priority 3 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 000 S 500 7283 7282 0 75 0 - 1104 wait4 pts/2 00:00:00 bash 000 R 500 11322 7283 93 76 3 - 1032 pts/2 00:00:16 sh 000 R 500 11339 7283 0 76 0 - 785 pts/2 00:00:00 ps

Usted puede encontrar mayor informacin ennicey enreniceen las pginas man. Bsqueda con expresiones regulares Esta seccin abarca el material del tema 1.103.7 del examen 101 para Junior Level Administration (LPIC-1). El valor de ponderacin de este tema es 3. En esta seccin, usted aprender sobre los siguientes temas:
y y y

Expresiones regulares Bsqueda de archivos y de sistemas de archivos usando expresiones regulares Uso de expresiones regulares con sed

Expresiones regulares Las expresiones regulares tienen sus races en la teora del lenguaje de computacin. La mayora de los estudiantes de ciencias de la computacin aprenden que los lenguajes que se pueden denotar por medio de expresiones regulares son precisamente los mismos que aquellos aceptados por los autmatas finitos. Las expresiones regulares que se discuten en esta seccin son capaces de expresar ms complejidad y, por lo tanto, no son iguales a aquellas sobre las que usted puede haber llegado a aprender algo en sus clases de ciencias de la computacin, aunque la herencia es clara. Una expresin regular (tambin denominada "regex" o "regexp") es una forma de describir una cadena o unpatrnde texto de manera tal que un programa puedacompararel patrn con las cadenas de texto arbitrarias, lo que ofrece una

capacidad de bsqueda extremadamente poderosa. Elgrep(que significageneralizedregularexpressionprocessor o procesador de expresin regular generalizada) es una parte estndar de las herramientas de todos los programadores o administradores de Linux o UNIX, lo que permite que las expresiones regulares se usen para buscar archivos, o de los datos de salida de un comando. En la seccin sobre filtros y flujos de texto, introdujimossed(elstreameditor o editor de flujos), que es otra herramienta estndar que usa expresiones regulares extensivamente para buscar y remplazar textos en archivos o en flujos de texto. Esta seccin lo ayudar a comprender mejor las expresiones regulares que usan tantogrepcomosed. Otro programa que usa expresiones regulares extensivamente esawk, que forma parte del material para el examen 201 para la certificacin LPIC-2. Al igual que con otras partes de este tutorial, se han escrito libros enteros sobre expresiones regulares y la teora del lenguaje de computacin. Vea la seccin denominada Resources (Recursos) para conocer algunas sugerencias. A medida que se vaya informando sobre las expresiones regulares, podr observar similitudes entre la sintaxis de las expresiones regulares y la sintaxis del comodn (o globbing) que se discute en la seccin intitulada Comodines y globbing. Esta similitud es slo superficial. Volver arriba Bloques de construccin bsicos Se usan dos formas de sintaxis de expresiones regulares con el programa grep de GNU que forma parte de la mayora de los sistemas Linux:bsicayextendida. Con el grep de GNU, no existe ninguna diferencia de funcionalidad. Aqu se describe la sintaxis bsica junto con las diferencias existentes entre ella y la sintaxis extendida. Las expresiones regulares se crean a partir decaracteresyoperadores, aumentados pormetacaracteres. La mayora de los caracteres muestran una correspondencia entre s. Por otra parte, la mayora de los metacaracteres se deben escapar usando la barra invertida (\). Las operaciones fundamentales son las siguientes: Concatenacin Al concatenar dos expresiones regulares se crea una expresin ms larga. Por ejemplo, la expresin regular a se corresponder con la cadena abcdcba dos veces (en la primera y en la ltima a) y lo mismo ocurrir con la expresin regular b. Sin embargo, ab slo se corresponder con ab cdcba, mientras que ba slo se corresponder con abcdc ba. Repeticin El operador de repeticin o el * Kleene se corresponder con cero o ms ocurrencias de la expresin regular anterior. Por lo tanto, una expresin

regular como a*b se corresponder con cualquier cadena de a terminada en b, incluyendo slo a b en s misma. No es necesario escapar el * Kleene. Por lo tanto, aquellas expresiones en las que usted desee que exista correspondencia con un asterisco literal (*) debern tener el asterisco escapado. Alternacin El operador de alternacin (|) se corresponde con la expresin anterior o siguiente. Se lo debe escapar en una sintaxis bsica. Por ejemplo, la expresin a*\|b*c se corresponder con una cadena que contenga cualquier cantidad de letras a o cualquier cantidad de letras b (pero no ambas) terminadas por una sola c. Una vez ms, el carcter nico c mostrar una correspondencia. Generalmente, usted deber citar sus expresiones regulares para evitar la expansin de shell. Usaremos los archivos de texto que creamos con anterioridad en el directorio lpi103 a modo de ejemplo. Estudie los ejemplos simples que figuran en el Listado 107. Tenga en cuenta quegreptoma una expresin regular como un parmetro requerido y una lista de cero o ms archivos para buscar. Si no aparece ningn archivo, grep busca stdin, lo que lo transforma en un filtro que se puede usar en canalizaciones. Si no hay correspondencia entre ninguna lnea, no se producen datos de salida desdegrep, aunque su cdigo de salida se puede probar. Listado 107. Expresiones regulares simples
[ian@echidna lpi103]$ grep p text1 1 apple 2 pear [ian@echidna lpi103]$ grep pea text1 2 pear [ian@echidna lpi103]$ grep "p*" text1 1 apple 2 pear 3 banana [ian@echidna lpi103]$ grep "pp*" text1 1 apple 2 pear [ian@echidna lpi103]$ grep "x" text1 [ian@echidna lpi103]$ grep "x*" text1 1 apple 2 pear 3 banana [ian@echidna lpi103]$ cat text1 | grep "l\|n" 1 apple 3 banana [ian@echidna lpi103]$ echo -e "find an\n* here" | grep "\*" * here

Como puede observar en estos ejemplos, a veces usted puede obtener resultados sorprendentes, especialmente con repeticin. Usted podra haber esperado que p* o al menos pp* se correspondiesen con un par de letras p, pero p* y x* tambin se corresponden con todas las lneas del archivo porque el operador * se corresponde con cero o ms de las expresiones regulares anteriores. Primeros atajos Ahora que ya conoce los bloques de construccin bsicos de las expresiones regulares, analicemos algunos atajos que le resultarn convenientes. + El operador + es como el operador *, excepto porque se corresponde con una o ms ocurrencias de la expresin regular anterior. Se lo debe escapar en el caso de las expresiones regulares. ? El ? indica que la expresin anterior es opcional. Por lo tanto, representa cero o una ocurrencia de ella. Esto no es lo mismo que el ? usado en globbing. . El . (punto) es un metacarcter que representa a cualquier carcter. Uno de los parmetros ms usados es .*, que se corresponde con una cadena de longitud arbitraria que contiene cualquier cantidad de caracteres (o ningn carcter). No es necesario aclarar que usted ver que esto se usa como parte de una expresin ms larga. Compare un nico punto con el ? que se usa en globbing y .* con el * que se usa en globbing. Listado 108. Ms expresiones regulares
[ian@echidna lpi103]$ grep "pp\+" text1 # at least two p's 1 apple [ian@echidna lpi103]$ grep "pl\?e" text1 1 apple 2 pear [ian@echidna lpi103]$ grep "pl\?e" text1 # pe with optional l between 1 apple 2 pear [ian@echidna lpi103]$ grep "p.*r" text1 # p, some string then r 2 pear [ian@echidna lpi103]$ grep "a.." text1 # a followed by two other letters 1 apple 3 banana

Correspondencia con el principio o el final de la lnea El ^ (caret) se corresponde con el comienzo de una lnea, mientras que el $ (signo pesos) se corresponde con el final de una lnea. Por lo tanto, ^..b se corresponde con dos caracteres al principio de una lnea seguida por una b, mientras que ar$

se corresponde con una lnea que finaliza en ar. La expresin regular ^$ se corresponde con una lnea vaca. Expresiones ms complejas Hasta ahora, hemos visto a la repeticin aplicada a un slo carcter. Si desease buscar una o ms ocurrencias de una cadena con mltiples caracteres como la an que ocurre dos veces en banana, use parntesis (los que se debern escapar en sintaxis bsica). De manera similar, es posible que usted desee buscar algunos caracteres, sin usar algo tan general como el . o algo tan detallado como la alternacin. Tambin es posible hacer esto encerrando las alternativas entre corchetes ([]), los que no necesariamente se deben escapar con una sintaxis regular. Las expresiones entre corchetes constituyen unaclase de carcter. Salvo por las pocas excepciones que se discuten ms adelante, el uso de corchetes tambin elimina la necesidad de escapar los caracteres especiales como . y *. Listado 109. Parntesis y clases de carcter
[ian@echidna lpi103]$ grep "\(an\)\+" text1 # find at least 1 an 3 banana [ian@echidna lpi103]$ grep "an\(an\)\+" text1 # find at least 2 an's 3 banana [ian@echidna lpi103]$ grep "[3p]" text1 # find p or 3 1 apple 2 pear 3 banana [ian@echidna lpi103]$ echo -e "find an\n* here\nsomewhere." | grep "[.*]" * here somewhere.

Existen otras posibilidades interesantes para las clases de carcter. Expresin de rango Una expresin de rango es dos caracteres separados por un - (guin), como 0-9, en el caso de dgitos, o 0-9a-fA-F, en el caso de dgitos hexadecimales. Tenga en cuenta que los rangos dependen de su ubicacin. Clases nombradas Varias clases nombradas ofrecen una forma rpida y conveniente de las clases ms comnmente usadas. Las clases nombradas comienzan con [: y terminan con :]. A continuacin, incluimos algunos ejemplos de esto: [:alnum:] Caracteres alfanumricos [:blank:] Caracteres de espacio y de tabulacin [:digit:] Los dgitos 0 a 9 (lo que equivale a 0-9) [:upper:] y [:lower:]

Letras en minscula y en mayscula respectivamente. ^ (negacin) Cuando se lo usa como el primer carcter entre corchetes, el ^ (caret) niega el sentido de los restantes caracteres. Por lo tanto, la correspondencia slo ocurre si un carcter (excepto el ^ inicial) no est en la clase. Segn los significados especiales que figuran con anterioridad, si desea lograr la correspondencia con un - (guin) literal entre una clase de carcter, usted debe ponerlo en primer o en ltimo lugar. Si desea lograr la correspondencia con un ^ (caret) literal, no debe ser el primer carcter. Adems, un ] (corchete derecho) cierra la clase, a menos que se lo coloque en primer lugar. Las clases de carcter son un rea en la que las expresiones regulares y globbing son similares, aunque la negacin difiere (^ vs. !). El Listado 108 le muestra algunos ejemplos de las clases de carcter. Listado 110. Ms clases de carcter
[ian@echidna lpi103]$ # Match on range 3 through 7 [ian@echidna lpi103]$ echo -e "123\n456\n789\n0" | grep "[3-7]" 123 456 789 [ian@echidna lpi103]$ # Find digit followed by no n or r till end of line [ian@echidna lpi103]$ grep "[[:digit:]][^nr]*$" text1 1 apple

Volver arriba Uso de expresiones regulares con sed La breve introduccin a Sed mencion que sed usa expresiones regulares. Regexps se puede usar en expresiones de direccin y en expresiones de sustitucin. Por lo tanto, la expresin/abc/s/xyz/XYZ/gsignifica que se aplica el comando de sustitucin que reemplazar XYZ en cada ocurrencia de xyz slo en las tolines que contengan abc. El Listado 1111 le muestra dos ejemplos con nuestro archivo text1 y un ejemplo en el que modificamos la ltima palabra antes de un punto (.) por la cadena LAST WORD. Tenga en cuenta que la cadena First no se modific, ya que no estaba precedida por un espacio en blanco. Listado 111. Expresiones regulares en sed
[ian@echidna lpi103]$ sed -e '/\(a.*a\)\|\(p.*p\)/s/a/A/g' text1 1 Apple 2 pear 3 bAnAnA [ian@echidna lpi103]$ sed -e '/^[^lmnXYZ]*$/s/ear/each/g' text1

1 apple 2 peach 3 banana [ian@echidna lpi103]$ echo "First. A phrase. This is a sentence." |\ > sed -e 's/ [^ ]*\./ LAST WORD./g' First. A LAST WORD. This is a LAST WORD.

Volver arriba Expresiones regulares extendidas La sintaxis de las expresiones regulares extendidas elimina la necesidad de escapar varios caracteres cuando se los usa como los usamos en la sintaxis bsica (incluyendo los parntesis, "?", "+", "|" y "{"). Esto significa que se los debe escapar slo si usted desea que se los interprete como caracteres. Usted puede usar la opcin-E(o--extended-regexp) de grep para indicar que est usando sintaxis de expresiones regulares. De manera alternativa, el comandoegrephace esto por usted. Algunas versiones anteriores desedno soportan las expresiones regulares extendidas. Si su versin desedsoporta las regexps extendidas, use la opcin-rpara indicarle asedque usted est usando sintaxis extendida. El Listado 112 le muestra un ejemplo que se us con anterioridad en esta seccin junto con la expresin extendida correspondiente usada conegrep. Listado 112. Expresiones regulares extendidas
[ian@echidna lpi103]$ grep "an\(an\)\+" text1 # find at least 2 an's 3 banana [ian@echidna lpi103]$ egrep "an(an)+" text1 # find at least 2 an's 3 banana

Volver arriba Bsqueda de cosas en los archivos Esta seccin concluye el presente permitindole observar el poder degrepy defindpara encontrar cosas en su sistema de archivos. Una vez ms, los ejemplos que se ofrecen son relativamente simples y usan los archivos creados en el directorio lpi103 y en sus hijos. En primer lugar,greppuede buscar mltiples archivos a la vez. Si usted agrega la opcin-n, sta le indica con qu nmeros de lnea hubo correspondencia. Si usted slo desea saber con cuntas lneas hubo correspondencia, use la opcin-c. Por otra parte, si slo desea obtener una lista de los archivos con los que hubo correspondencia, use la opcin-l. El Listado 113 le muestra algunos ejemplos de esto.

Listado 113. Grepping de mltiples archivos


[ian@echidna lpi103]$ grep plum * text2:9 plum text6:9 plum text6:9 plum yaa:9 plum [ian@echidna lpi103]$ grep -n banana text[1-4] text1:3:3 banana text2:2:3 banana [ian@echidna lpi103]$ grep -c banana text[1-4] text1:1 text2:1 text3:0 text4:0 [ian@echidna lpi103]$ grep -l pear * ex-here.sh nohup.out text1 text5 text6 xaa

El ejemplo final usafindpara encontrar todos los archivos regulares en el directorio actual y en sus hijos y, luego de esto, usaxargspara transferir la lista de archivos agrepcon el objetivo de determinar la cantidad de ocurrencias de banana en cada archivo. Por ltimo, estos datos de salida se filtran mediante otra invocacin degrep(esta vez con la opcin-vpara buscar todos los archivos que no tienen cero ocurrencias de la cadena de bsqueda). Listado 114. Bsqueda de archivos con al menos una banana
[ian@echidna lpi103]$ find . -type f -print0| xargs -0 grep -c banana| grep -v ":0$" ./text1:1 ./text2:1 ./xab:1 ./yaa:1 ./text5:1 ./text6:4 ./backup/text1.bkp.2:1 ./backup/text1.bkp.1:1

Esta seccin slo ha analizado muy superficialmente todo lo que usted puede hacer con la lnea de comandos de Linux y las expresiones regulares. Vea las pginas man para obtener mayor informacin sobre estas valiossimas herramientas. Edicin de archivos con vi

Esta seccin abarca el material del tema 1.103.8 del examen 101 para Junior Level Administration (LPIC-1). El valor de ponderacin de este tema es 1. En esta seccin, usted aprender sobre el siguiente tema:
y

Edicin de textos con vi

Uso de vi El editor vi est casi en todos los sistemas Linux y UNIX. De hecho, en el caso de aquellos sistemas que tienen slo un editor, es muy probable que ste sea el vi. Por lo tanto, le conviene informarse sobre cmo usarlo. Esta seccin lo introduce a algunos comandos bsicos de edicin con vi. Para acceder a un tutorial completo sobre vi, vea nuestra "Introduccin a vi: El mtodo machete" en la seccin denominada Resources (Recursos) o consulte las pginas man o uno de los tantos excelentes libros que se encuentran disponibles. Inicio de vi En la actualidad, la mayora de las distribuciones Linux incluyen el editor vim (que significa V i IM proved o vi mejorado) en vez del editor vi clsico. Vim es compatible con vi y dispone de un modo grfico (gvim) y de la interfaz estndar de modo de texto de vi. El comandovise suele usar como un alias o como un vnculo simblico hacia el programa vim. Vuelva a ver el tema "Dnde shell encuentra los comandos?" para aprender exactamente qu comando se usa. Si recuerda la seccin sobre modificacin de prioridades, quisimos modificar la prioridad de nuestro shell script count1.sh ejecutado. Quiz usted intent hacer lo mismo y se dio cuenta de que el comando se ejecut tan rpido que usted no tuvo suficiente tiempo para realizar el cambio de prioridad conrenice. Por lo tanto, comencemos usando el editor vi para agregar una lnea al comienzo del archivo para que dispongamos de 20 segundos de tiempo como para cambiar las prioridades. Para iniciar el editor vi, use el comandovicon un nombre de archivo como parmetro. Usted puede elegir entre muchas opciones. Por lo tanto, vea las pginas man para mayor informacin. Use el comando
vi count1.sh

Debera poder ver una pantalla similar a la que se puede observar en el Listado 115. Si est usando vim, algunas de las palabras pueden estar en otros colores. Vim tiene un modo que resalta la sintaxis (que no formaba parte del editor vi original) y se puede encender de manera predeterminada en su sistema. Listado 115. Edicin de count1.sh usando vi

x="$1"echo "$2" $(date) while [ $x -gt 0 ]; do let x=$x-1;done echo "$2" $(date) ~ ~ ~ ~ ~ ~ "count1.sh" 4L, 82C

Modos de vi El editor vi tiene dos modos de operacin: Modo comando En el modo comando, usted accede al archivo y realiza todas las operaciones de edicin (como, por ejemplo, la bsqueda de textos, el borrado de textos, la modificacin de textos, etc.). Generalmente, usted comienza en el modo comando. Modo insertar En el modo insertar, usted ingresa el texto nuevo en el archivo desde el punto de insercin. Para volver al modo comando, presione la tecla Esc (Escape). Estos dos modos determinan la forma en la que el editor se comporta. Vi surgi en un momento en el que no todos los teclados de las terminales tenan teclas de direccin. Por lo tanto, todo lo que usted puede hacer en vi se puede realizar con las teclas que suelen formar parte de las mquinas de escribir comunes y corrientes ms algunas teclas adicionales (como, por ejemplo, Esc e Insert. Sin embargo, usted puede configurar vi para que use teclas adicionales si stas estn disponibles. La mayora de las teclas de su teclado cumplen una funcin til en vi. Debido a este legado y a la naturaleza lenta de las primeras conexiones de terminal, vi tiene una merecida excelente reputacin por usar comandos muy breves y crpticos. Cmo salir de vi? Una de las primeras cosas que debe aprender sobre el nuevo editor es cmo salir de ste antes de hacer algo que no debera haber hecho. Las siguientes formas para salir de vi incluyen el guardado o el descarte de los cambios realizados o volver a comenzar desde el principio. Si estos comandos no le sirven, es probable que se encuentre en el modo insertar. En tal caso, presione Esc para abandonar el modo insertar y volver al modo comando. :q! Dejar de editar el archivo y descartar todas las modificaciones. Esto es algo muy comn para evitar tener problemas. :w! Escribir el archivo (modificado o no). Es un intento de sobrescribir los archivos existentes o los archivos de solo lectura o los archivos protegidos contra escritura. Usted podr elegir un nombre de archivo como un parmetro y dicho archivo se escribir en vez del archivo con el que

comenz a trabajar. Generalmente, suele ser ms seguro evitar el uso de !, a menos que sepa lo que est haciendo. ZZ Escribir el archivo si se lo modific. Luego de esto, salir. Esto es algo muy comn para salir normalmente de vi. :e! Editar la copia de disco actual del archivo. Esto recargar el archivo y descartar todos los cambios que haya realizado. Tambin podr usar esto si la copia de disco se modific por alguna otra razn y prefiere conservar la versin anterior. :! Ejecute un comando shell. Ingrese el comando y presione Enter. Cuando el comando se complete, usted podr observar los datos de salida y un prompt para regresar al editor vi. Notas: 1. Cuando ingresa los dos puntos (:), su cursor pasar a la ltima lnea en la pantalla, donde usted podr ingresar el comando y los parmetros que desee. 2. Si omite el signo de exclamacin en los comandos anteriores, es posible que reciba un mensaje de error como, por ejemplo, uno que le indique que los cambios no se guardaron o que el archivo de salida no se puede escribir (por ejemplo, si usted est editando un archivo de slo lectura). 3. Los comandos : tienen formas ms larga (:quit, :write, :edit), pero no se las suele usar con frecuencia. Navegacin Los siguientes comandos lo ayudarn a navegar por el archivo: h Desplazarse un carcter hacia la izquierda en la lnea actual. j Pasar a la siguiente lnea. k Volver a la lnea anterior. l Desplazarse un carcter hacia la derecha en la lnea actual. w Pasar a la siguiente palabra en la lnea actual. e Pasar al siguiente fin de palabra en la lnea actual. b Pasar al comienzo de palabra anterior en la lnea actual. Ctrl-f Avanzar una pgina.

Ctrl-b Retroceder una pgina. Si ingresa un nmero antes de cualquiera de estos comandos, el comando se ejecutar las veces que indique dicho nmero. A este nmero se lo denominacantidad de repeticionesor simplementecantidad. Por ejemplo, 5h desplazar el cursor cinco caracteres hacia la izquierda. Usted puede usar las cantidades de repeticiones con muchos comandos de vi. Cmo pasar a las lneas especficas de su archivo? Los siguientes comandos lo ayudarn a pasar a las lneas especficas de su archivo: G Lo lleva a una lnea especfica de su archivo. Por ejemplo, 3G lo lleva a la lnea 3. Si no se ingresa ningn parmetro, G lo lleva a la ltima lnea del archivo. H Lo transporta en relacin a la lnea superior de la pantalla. Por ejemplo, 3H lo transporta a la tercera lnea debajo de la primera lnea de su pantalla. L Es como H, excepto porque el desplazamiento es en relacin a la ltima lnea de la pantalla. Por lo tanto, 2L lo lleva a la segunda lnea anterior a la ltima lnea de su pantalla. Bsqueda Usted puede buscar textos en su archivo usando expresiones regulares: / Use / seguida por una expresin regular para buscar en lo que sigue de su archivo. ? Use ? seguido por una expresin regular para buscar en lo que antecede de su archivo. n Use n para repetir la ltima bsqueda en cualquiera de las dos direcciones ya mencionadas. Usted puede colocar un nmero antes de cualquiera de los comandos que se mencionan con anterioridad para indicar la cantidad de repeticiones. Por lo tanto, 3/x buscar la tercer ocurrencia de x desde el punto actual, de la misma forma que lo har /x seguida por 2n. Modificacin de textos

Use los siguientes comandos si necesita insertar, borrar o modificar textos: i Ingrese al modo insertar antes del carcter en la posicin actual. Ingrese su texto y presione Esc para volver al modo comando. Use I para insertar texto al comienzo de la lnea actual. a Ingrese al modo insertar luego del carcter en la posicin actual. Ingrese su texto y presione Esc para volver al modo comando. Use A para insertar texto al final de la lnea actual. c Use c para modificar el carcter actual e ingrese al modo insertar para ingresar los caracteres de reemplazo. o Abra una lnea nueva para insertar texto debajo de la lnea actual. Use O para abrir una lnea arriba de la lnea actual. cw Borre el resto de la palabra actual e ingrese al modo insertar para reemplazarla. Use una cantidad de repeticin para reemplazar varias palabras. Use c$ para reemplazar todo hasta el final de la lnea. dw Igual que en cw (y en c$), excepto porque no se ingresa al modo insertar. dd Borre la lnea actual. Use una cantidad de repeticin para borrar varias lneas. x Borre el carcter donde se encuentra el cursor. Use una cantidad de repeticin para borrar varios caracteres. p Coloque el ltimo texto borrado luego del carcter actual. Use P para colocarlo antes del carcter actual. xp Esta combinacin de x y p resulta muy til. Esto reemplaza el carcter donde se encuentra el cursor por el que se encuentra a su derecha.