Uso de la línea de comandos

  • Upload
    airot77

  • View
    181

  • Download
    0

Embed Size (px)

Citation preview

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 '|', '&', ';', '(', ')', ''. 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 comandochsh -s /bin/bash

y

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

y

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 command2command1 | 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 tailCatytacvisualizan 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

y

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/