101 tema 103 comandos gnu y unix

84
PREPARACIÓN PARA EL EXAMEN 101 DE LPI TEMA 103 COMANDOS GNU Y UNIX By: @FrankSanabria IBM http://www.ibm.com/developerworks/ssa/linux/e du/l-lpic1103/index.html

Upload: nilson-gongora-perez

Post on 11-Nov-2015

52 views

Category:

Documents


1 download

DESCRIPTION

Comandos Gnu y Unix

TRANSCRIPT

  • PREPARACIN PARA EL EXAMEN 101 DE LPI

    TEMA 103

    COMANDOS GNU Y UNIX

    By: @FrankSanabria

    IBMhttp://www.ibm.com/developerworks/ssa/linux/e

    du/l-lpic1103/index.html

  • Objetivo del examen de LPI

    Valor de ponderacin del

    objetivo Resumen del objetivo

    1.103.1Trabajo en la lnea de

    comandos

    Valor: 5 Interaccin con shells y comandos usando la lnea de comandos. Este objetivo incluye el ingreso de comandos y secuencias de comandos vlidos; la definicin, referenciacin y exportacin de variables de entorno; el uso del historial de comandos y la edicin de facilidades, la invocacin de comandos dentro y fuera de la ruta; el uso de la sustitucin de comandos; la aplicacin recursiva de comandos a travs de un rbol de directorios y el uso de man para aprender acerca de comandos.

    1.103.2Procesamiento de flujos de

    texto usando filtros

    Valor: 6 Aplicacin de filtros a flujos de texto. Este objetivo incluye el envo de archivos de texto y flujos de salida a travs de filtros de utilidades de texto para modificar los datos de salida usando comandos UNIX estndar del paquete textutils de GNU.

    1.103.3Gestin de archivos bsica

    Valor: 3 Uso de los comandos UNIX bsicos para copiar, mover y quitar archivos y directorios. Algunas tareas son: operaciones de gestin de archivos avanzadas como copiar mltiples archivos recursivamente, quitar directorios recursivamente y mover archivos que cumplan con un patrn de comodines. Este objetivo incluye el uso de especificaciones de comodines simples y avanzadas para referirse a archivos, as como tambin el uso de find para ubicar archivos y accionar sobre ellos en base a su tipo, tamao o antigedad.

    1.103.4Uso de flujos,

    canalizaciones y redireccionamientos

    Valor: 5 Redireccionamiento y conexin de flujos para el procesamiento eficiente de datos de texto. Algunas tareas son: redireccionamiento de datos de entrada estndar, datos de salida estndar y errores estndar, canalizacin de los datos de salida de un comando a los datos de entrada de otro comando, uso de los datos de salida de un comando como argumentos de otro comando y envo de datos de salida a stdout y a un archivo.

    1.103.5Procesos de creacin,

    monitoreo y eliminacin

    Valor: 5 Gestin de procesos. Este objetivo incluye las siguientes tareas: ejecutar trabajos en primer y segundo plano, llevar un trabajo del segundo plano al primer plano y viceversa, iniciar un proceso que se ejecute sin estar conectado con una terminal y sealar un programa para que siga ejecutndose luego del cierre de sesin. Otras tareas son: monitoreo de procesos activos, seleccin y ordenamiento de procesos para su visualizacin, envo de seales a procesos, eliminacin de procesos, e identificacin y eliminacin de aplicaciones X no concluidas despus del cierre de sesin de X.

    1.103.6Modificacin de las

    prioridades de ejecucin de procesos

    Valor: 3 Gestin de prioridades de ejecucin de procesos. Algunas tareas son: ejecutar un programa con mayor o menor prioridad, determinar el nivel de prioridad de un proceso y cambiar la prioridad de un proceso en ejecucin.

  • 1.103.7Bsqueda de archivos de texto usando expresiones

    regulares

    Valor: 3 Manipulacin de archivos y datos de texto usando expresiones regulares. Este objetivo incluye la creacin de expresiones regulares simples que contengan varios elementos notacionales. Tambin incluye el uso de herramientas de expresiones regulares para efectuar bsquedas en un sistema de archivos o en el contenido de los archivos.

    1.103.8Operaciones de edicin de archivos bsicas usando vi

    Valor: 1 punto Edicin de archivos de texto usando vi. Este objetivo incluye: navegacin vi; nodos vi bsicos; e insercin, edicin, eliminacin, copia y bsqueda de texto.

  • 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:

    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 bashEl 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 , break y exec . Otros comandos son externos.

    Los shells tambin usan tres flujos de entrada/salida estndar:

    stdin es el flujo de entrada estndar y proporciona los datos de entrada a los comandos.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.

    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.

    Convenciones de este tutorialEstos tutoriales de developerWorks acerca de los exmenes 101 y 102 de LPI incluyen ejemplos de cdigo copiados y pegados de sistemas Linux reales que usan los prompts predeterminados de dichos sistemas. Nuestros prompts root tienen un # aadido y los prompts de usuarios comunes tienen un $ aadido. Esta convencin se utiliza en muchos manuales acerca de este tema. Observe con atencin los prompts de ejemplo.

    Comandos y secuenciasAhora 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 comando echo imprime sus argumentos (o hace eco de ellos) a la terminal, como muestra el Listado 3.

    Listado 3. Ejemplos de Echo[ian@echidna ian]$ echo WordWord[ian@echidna ian]$ echo A phraseA phrase[ian@echidna ian]$ echo Where are my spaces?Where are my spaces?[ian@echidna ian]$ echo "Here are my spaces." # plus commentHere 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 -n para suprimirlo. Use la opcin -e para 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

    Secuenciade escape Funcin

    \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 comando echo (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 lineNo 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 typedreturn[ian@echidna ian]$ echo -e "A line with an escaped\nreturn"A line with an escapedreturn[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\\tmetacharactersDoubly 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 comando exit . 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 tecla Ctrl junto 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

    Variables de entornoCuando 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 FuncinUSER Nombre del usuario que inici sesinUID Identificador de usuario numrico del usuario que inici sesin

  • HOME Directorio principal del usuarioPWD Directorio en funcionamientoSHELL Nombre del shell$ Identificador de proceso (o PID) del proceso de shell bash (u

    otro) en ejecucinPPID Identificador de proceso del proceso que inici este proceso

    (es decir, el identificador del proceso primario)? Cdigo de salida del ltimo comandoEl 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 $UIDian 500[ian@echidna ian]$ echo $SHELL $HOME $PWD/bin/bash /home/ian /home/ian[ian@echidna ian]$ (exit 0);echo $?;(exit 4);echo $?04[ian@echidna ian]$ echo $$ $PPID30576 30575

    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 comando export . 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 comando ps para visualizar informacin acerca del comando que se encuentra en ejecucin. Ampliaremos nuestros conocimientos de ps cuando expliquemos el estado de procesos ms adelante en este tutorial.

    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:

    Use el comandochsh -s /bin/bashpara cambiar el shell predeterminado. La nueva forma predeterminada se aplicar la prxima vez que inicie sesin.

    Use el comandosu - $USER -s /bin/bashpara 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.

  • Listado 8. Ms variables de entorno y shell[ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD30576 30575 -bash[ian@echidna ian]$ bash[ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD16353 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 $VAR3var1 var2 var3[ian@echidna ian]$ echo $VAR1 $VAR2 $VAR3 $SHELLvar1 var2 var3 /bin/bash[ian@echidna ian]$ ksh$ ps -p $$ -o "pid ppid cmd" PID PPID CMD16448 16353 ksh$ export VAR4=var4$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELLvar2 var3 var4 /bin/bash$ exit$ [ian@echidna ian]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELLvar1 var2 var3 /bin/bash[ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD16353 30576 bash[ian@echidna ian]$ exit[ian@echidna ian]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD30576 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 ( ), 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 comando env 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 -u desactiva las variables de entorno que usted no desee pasar.

    El Listado 11 muestra datos de salida parciales del comando env 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]$ envHOSTNAME=echidna

  • TERM=xtermSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=9.27.89.137 4339 22SSH_TTY=/dev/pts/2USER=ian..._=/bin/envOLDPWD=/usr/src[ian@echidna ian]$ env -i bash -c 'echo $SHELL; env'/bin/bashPWD=/home/ianSHLVL=1_=/bin/env[ian@echidna ian]$ env -i ksh -c 'echo $SHELL; env'

    _=/bin/envPATH=/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 -i no eran shells de inicio de sesin. Pruebe pasar la opcin -l al 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.4.

    Puede usar el comando unset para 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 comando set para 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 -u hace 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 de set con -y desactivarlas con + . Para visualizar las opciones activadas, use echo $- .

    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 $VAR1bash: VAR1: unbound variable[ian@echidna ian]$ VAR1=v1[ian@echidna ian]$ VAR1=v1;echo $VAR1v1[ian@echidna ian]$ unset VAR1;echo $VAR1bash: VAR1: unbound variable[ian@echidna ian]$ set +u;echo $VAR1;echo $-

    himBH

    Si usa el comando set sin 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 de set y del comando declare mediante las pginas man.

    Exec

    El ltimo comando que explicaremos en esta seccin es exec . Puede usar el comando exec para ejecutar otro programa que reemplace al shell actual. En el Listado 13 se inicia un shell bash secundario y luego se usa exec para 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

  • Historial de comandosSi 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 comando set +o history y volverlo a activar usando set -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:

    historyMuestra todo el historial

    history NMuestra las ltimas lneas N de su historial

    history -d NElimina una lnea N de su historial; puede usar este comando cuando, por ejemplo, una lnea contiene una contrasea

    !!Muestra el comando ms reciente

    !NMuestra el comando del historial en la posicin N

    !-NMuestra el comando que se encuentra N comandos atrs en el historial (!-1 es equivalente a !!)

    !#Muestra el comando actual que est ingresando en el momento

    !stringMuestra el comando ms reciente que comienza con string

    !?string?Muestra el comando ms reciente que contiene string

    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]$ !ececho $$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 actual2.Se ejecuta un comando echo en un nuevo shell y se hace eco del PID de dicho shell3.Se vuelve a ejecutar el ltimo comando4.Se vuelve a ejecutar el ltimo comando que comienza con 'ec'; esto vuelve a ejecutar el primer comando de este ejemplo5.Se vuelve a ejecutar el ultimo comando que comienza con 'en'; pero, al sustituir '$PPID' por '$$', se visualiza el PID primario6.Se visualizan los ltimos 6 comandos del historial7.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 Ctr funciona como la tecla Control de Emacs y la tecla AltFunciona 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

    ComandoTecla comn

    de PC DescripcinC-f Flecha derecha Mueve el cursor un espacio hacia la derechaC-b Flecha

    izquierdaMueve el cursor un espacio hacia la izquierda

    M-f Alt-f Mover el cursor al comienzo de la siguiente palabra; los entornos GUI generalmente usan esta combinacin de teclas para abrir el men File de la ventana

    M-b Alt-b Mover el cursor al comienzo de la siguiente palabraC-a Home Mover el cursor al comienzo de la lneaC-e End Mover el cursor al fin de la lneaBackspace Backspace Borrar el carcter anterior al cursorC-d Del Borrar el carcter posterior al cursor (Las funciones Del y Backspace

    pueden configurarse de manera inversa)C-k Ctrl-k Borrar (kill) hasta el final de la lnea y guardar el texto eliminado

    para su uso posterior

  • M-d Alt-d Borrar (kill) hasta el final de la palabra y guardar el texto eliminado para su uso posterior

    C-y Ctrl-y Volver a insertar el texto eliminado con un comando killSi prefiere manipular el historial usando un modo de edicin de tipo vi, use el comando set -o vi para pasar a modo vi. Para volver al modo emacs, use set -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.

    RutasAlgunos 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 su ruta, 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 comando which o type . 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 lsalias 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/bin:/home/ian/bin)[ian@echidna ian]$ type bash env zip xclock echo set lsbash is /bin/bashenv is /bin/envzip is /usr/bin/zipxclock is /usr/X11R6/bin/xclockecho is a shell builtinset is a shell builtinls 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 comando which inform que el comando ls es un alias y que no se pudo encontrar el comando set . En este caso, interpretamos que, o bien el comando no existe, o se trata de un comando incorporado. El comando type informa que el comando ls es un alias pero identifica al comando set como un comando incorporado a shell. Tambin informa que existe un comando echo incorporado adems del que which encontr en /bin. Los dos comandos tambin producen datos de salida en diferentes rdenes.

    Vimos que el comando ls , usado para listar el contenido de directorios, es un alias. 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=tty hace que los listados de directorios aparezcan codificados por colores en base al tipo de archivo o directorio. Pruebe ejecutar dircolors print-database para 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 usar which cuando estoy casi seguro de que encontrar el ejecutable y solamente necesito obtener su especificacin de ruta completa. Creo que type proporciona informacin ms precisa, que puede ser necesaria en un shell script.

    Ejecucin de otros comandosVimos 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:

    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 comando pwd . 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 como mytestbin/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 ~username para referirse al directorio principal del usuario llamado username. El Listado 16 muestra algunos ejemplos.

    Listado 16. Rutas absolutas y relativas[ian@echidna ian]$ /bin/echo Use echo command rather than builtinUse echo command rather than builtin

  • [ian@echidna ian]$ /usr/../bin/echo Include parent dir in pathInclude parent dir in path[ian@echidna ian]$ /bin/././echo Add a couple of useless path componentsAdd 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 echoUse 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 dotsHello World![ian@echidna ian]$ ./hello # Run program in current directoryHello 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 funcionamientoAs como puede ejecutar programas de distintos directorios de su sistema, tambin es posible modificar el directorio en funcionamiento mediante el comando cd . El argumento de cd debe ser una ruta absoluta o relativa a un directorio. Con respecto a los comandos, puede usar ., .., ~ y ~username en las rutas. Si usa cd sin 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, cd slo es equivalente a cd $HOME y cd - es equivalente a cd $OLDPWD . Cuando digamos cambiar 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, cd imprimir 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

    Aplicacin recursiva de comandosMuchos comandos Linux pueden aplicarse recursivamente a todos los archivos que se encuentran en un rbol de directorio. Por ejemplo, el comando ls tiene una opcin -R para listar directorios recursivamente y los comandos cp , mv , rm y diff tienen una opcin -r para su aplicacin recursiva. La seccin Gestin bsica de archivos explica en profundidad la aplicacin recursiva de comandos.

    Sustitucin de comandosEl shell bash tiene una capacidad muy potente que permite usar los resultados de un comando como datos de entrada de otro comando; esto se denomina sustitucin 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 comando rpm poda 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 comando seq para 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`;donep7 RH73p8 SUSE81p9 IMAGES

  • Pginas manEl 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 las pginas manuales, a las cuales se puede acceder usando el comando man . Use el comando man man para visualizar esta informacin.

    Los elementos tpicos de las pginas man:

    Un encabezado con el nombre del comando seguido por su correspondiente nmero de seccin entre parntesisEl nombre del comando y de todos los comandos relacionados que se describen en esta pgina manUna sinopsis de las opciones y los parmetros aplicables al comandoUna breve descripcin del comandoInformacin 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 de man nos 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.Comandos de usuario (env, ls, echo, mkdir, tty)2.Llamadas al sistema o funciones kernel (link, sethostname, mkdir)3.Rutinas de bibliotecas (acosh, asctime, btree, locale, XML::Parser)4.Informacin relacionada con dispositivos (isdn_audio, mouse, tty, zero)5.Descripciones de formatos de archivos (keymaps, motd, wvdial.conf)6.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 y l, 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 tty o man 2 mkdir, o especificar la opcin -a para listar todas las secciones manuales pertinentes.

    Al observar la figura anterior, probablemente haya notado que man tiene 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 con man.

    See also

    Dos comandos importantes relacionados con man son whatis y apropos . El comando whatis busca pginas man con el nombre por usted ingresado y muestra la informacin de nombres de las pginas manuales pertinentes. El comando apropos realiza 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 manman (1) - format and display the on-line manual pagesman (7) - macros to format man pagesman [manpath] (1) - format and display the on-line manual pagesman.conf [man] (5) - configuration data for man[ian@lyrebird ian]$ whatis mkdirmkdir (1) - make directoriesmkdir (2) - create a directory[ian@lyrebird ian]$ apropos mkdirmkdir (1) - make directoriesmkdir (2) - create a directorymkdirhier (1x) - makes a directory hierarchy

    Por cierto, si no logra encontrar la pgina manual de man.conf, intntelo ejecutando man man.config .

    Los datos de salida de las pginas del comando man se visualizan usando un programa de paginacin. En la mayora de los sistemas Linux, suele ser el programa less . Otra posibilidad es un programa ms antiguo llamado more . Si desea imprimir la pgina, especifique la opcin -t para dar formato de impresin a la pgina usando el programa groff o troff .

    El paginador less tiene varios comandos para buscar cadenas dentro de los datos de salida mostrados. Use man less para 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 archivos info que se procesan con el programa info. Estos archivos proporcionan una gran variedad de facilidades de navegacin, como la capacidad de saltar a otras secciones. Ingrese man info o info info para 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, como xman(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.

  • 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:

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

    Filtrado de textos

    Se denomina filtrado de 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 una canalizacin de comandos en la que los datos de salida de un comando se canalizan o redirigen para 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 tres flujos de entrada/salida estndar:

    stdin es el flujo de entrada estndar y proporciona los datos de entrada a los comandos.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.

    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 comando echo a 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.

    Cat, tac, od y splitRevisemos el contenido del archivo test1 creado anteriormente. Use el comando cat (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 comando cat toma 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, cat sigue 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 denomina tac (que es cat al 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, debemos volcar el archivo en un formato que le permita encontrar e interpretar estos caracteres especiales. Las utilidades de texto de GNU incluyen un comando od (uOctalDump) para esto.

    Existen varias opciones para od , como por ejemplo la opcin -A para controlar la raz de las compensaciones del archivo y -t para 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 text20000000 004471 066160 066565 031412 061011 067141 067141 0051410000020 030061 060411 070160 062554 0000120000031[ian@echidna lpi103]$ od -A d -t c text20000000 9 \t p l u m \n 3 \t b a n a n a \n0000016 1 0 \t a p p l e \n0000025[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 -A de cat le 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 comando split har esto de tal forma que el comando cat se podr

  • usar para recrear el archivo con gran facilidad. De manera predeterminada, los archivos que resultan del comando split tienen 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, usamos cat para visualizar algunas de las partes de manera individual y para visualizar un archivo completo usando globbing, 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 yaa9 plum3 banana10[ian@echidna lpi103]$ cat yab apple[ian@echidna lpi103]$ cat y*9 plum3 banana10 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 usramos cat para visualizarlo.

    Wc, head y tailCat y tac visualizan 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 comando wc (WordCount) para ver el tamao real del archivo. El comando wc visualiza la cantidad de lneas, palabras y bytes que tiene un archivo. Tambin puede visualizar la cantidad de bytes usando ls -l . El Listado 27 le muestra el listado de directorios de formato largo para nuestros dos archivos de texto y el resultado del comando wc .

    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 comando wc o 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: head y tail . 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 comando dmesg para visualizar los mensajes de arranque, junto con wc , tail , y head para 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 | taili810: 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 0ac97_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 41319Attached scsi CD-ROM sr0 at scsi0, channel 0, id 0, lun 0sr0: scsi3-mmc drive: 0x/32x writer cd/rw xa/form2 cdda trayUniform CD-ROM driver Revision: 3.12[ian@echidna lpi103]$ dmesg | tail -n15 | head -n 6agpgart: Maximum main memory to use for agp memory: 941Magpgart: Detected Intel i845 chipsetagpgart: AGP aperture is 64M @ 0xf4000000Intel 810 + AC97 Audio, version 0.24, 13:01:43 Dec 18 2003PCI: Setting latency timer of device 00:1f.5 to 64i810: Intel ICH2 found at IO 0x1880 and 0x1c00, MEM 0x0000 and ...

    Otro uso comn de tail consiste en seguir un 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, tail se ejecutar hasta que usted lo cancele (usando Ctrl-c) y visualizar las lneas a medida que se van escribiendo en el archivo.

    Expand, unexpand y trCuando 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 comandos expand y unexpand se encargan de hacer esto. La opcin -t que 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 de expand y unexpand que alinea el texto que figura en text2.

    Listado 29. Uso de expand y unexpand[ian@echidna lpi103]$ expand -t 1 text2

  • 9 plum3 banana10 apple[ian@echidna lpi103]$ expand -t8 text2|unexpand -a -t2|expand -t39 plum3 banana10 apple

    Desafortunadamente, usted no puede usar unexpand para reemplazar los espacios que figuran en text1 por tabuladores, ya que unexpand requiere dos espacios por lo menos para realizar la conversin a tabuladores. Sin embargo, usted puede usar el comando tr , que convierte los caracteres en un conjunto (set1) en los caracteres correspondientes en otro conjunto (set2). El Listado 30 le muestra cmo usar el comando tr para convertir espacios en tabuladores. Como el comando tr es slo un filtro, usted genera datos de entrada para l usando el comando cat . Este ejemplo tambin ilustra el uso de - para indicar los datos de entrada estndar para cat .

    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 comando od para terminar cada etapa de la canalizacin en cuestin. Por ejemplo:cat text1 |tr ' ' '\t' | od -tc

    Pr, nl y fmtEl comando pr se 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 comando nl enumera las lneas, lo que puede resultar bastante conveniente al momento de imprimir los archivos. Usted tambin puede enumerar las lneas con la opcin -n del comando cat . 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 text1 Page 1

    1 apple2 pear

  • 3 banana

    [ian@echidna lpi103]$ nl text2 | pr -m - text1 | head

    2005-09-26 11:48 Page 1

    1 9 plum 1 apple 2 3 banana 2 pear 3 10 apple 3 banana

    Otro comando muy til para formatear textos es fmt , 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 comando cat para visualizar todo esto sin ningn formato, incluyendo un carcter "$" visualizado para mostrar el final de las lneas. Por ltimo, usamos el comando fmt para 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-$>text3echo "This is a sentence. " "This is a sentence. " "This is a sentence. " "This is a sentence. ">text3[ian@echidna lpi103]$ echo -e "This\nis\nanother\nsentence.">text4[ian@echidna lpi103]$ cat -et text3 text4This is a sentence. This is a sentence. This is a sentence. This is a sentence. $This$is$another$sentence.$[ian@echidna lpi103]$ fmt -w 60 text3 text4This is a sentence. This is a sentence. This is asentence. This is a sentence.This is another sentence.

    Sort y uniqEl comando sort ordena los datos de entrada usando la secuencia de intercalacin para el lugar (LC_COLLATE) del sistema. El comando sort tambin puede fusionar archivos ya ordenados y verificar si un archivo est ordenado o no.

    El Listado 33 ilustra el uso del comando sort para 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 comando sort puede ordenar por valores numricos y por caracteres. Usted puede especificar esta opcin para todo el

  • registro o para cada campo. 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 -u para 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 - text210 apple1 apple2 pear3 banana3 banana9 plum[ian@echidna lpi103]$ cat text1|tr ' ' '\t'|sort -u -k1n -k2 - text21 apple2 pear3 banana9 plum10 apple

    Tenga en cuenta que todava tendremos dos lneas con la fruta "manzana". Otro comando denominado uniq nos ofrece control adicional sobre la eliminacin de lneas duplicadas. El comando uniq generalmente opera sobre los archivos ordenados, pero remueve lneas idnticas consecutivas desde cualquier archivo (ordenado o no). El comando uniq tambin 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, uniq nos 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.

    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 comando cut , que extrae campos de los archivos de texto. El delimitador de campo predeterminado es el carcter de tabulacin. El Listado 35 usa el comando cut para 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 comando paste pega las lneas de dos o ms archivos una al lado de la otra de manera similar a la forma en la que el comando pr fusiona 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 comando paste puede pegar datos de uno o ms archivos de diversas formas. Vea la pgina man para mayor informacin.

    Nuestro ltimo comando para manipular campos es join , 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 10banana 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.

    SedSed es el streameditor (editor de flujo). Varios artculos de developer Works, al igual que muchos libros y captulos de libros, estn disponibles en relacin a sed. 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 el espacio 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 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. Un hold buffer ofrece 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 denominar script sed.

    El Listado 38 le muestra tres scripts sed simples. En el primero, usamos el comando s (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 comando d (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/' text11 Apple2 peAr3 bAnana[ian@echidna lpi103]$ sed 's/a/A/g' text11 Apple2 peAr3 bAnAnA[ian@echidna lpi103]$ sed '2d;$s/a/A/g' text11 apple3 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 -e para 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 '}' text11 apple2 peAr3 bAnAnA[ian@echidna lpi103]$ sed -e '/pear/,/bana/{' -e 's/a/A/g' -e '}' text11 apple2 peAr3 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 comando tr para cambiar los espacios en blanco en text1 por tabuladores. Ahora, hagamos eso con un script sed almacenado en un archivo. Usaremos el comando echo para 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 sedtabs/ / /g[ian@echidna lpi103]$ sed -f sedtab text11 apple2 pear3 banana

    Existen muchos one-liner sed como los que figuran en el Listado 40.

    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 comando nl para enumerar lneas. El Listado 41 usa el comando = para imprimir nmeros de lnea y, luego de esto, usa el comando N para 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, usamos cat para 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 comando echo para 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 formato info y contiene muchos ejemplos excelentes. Estos no figuran en la versin anterior (3.02). Sed GNU aceptar el uso de sed version para visualizar la versin.

  • GESTIN BSICA DE ARCHIVOSEsta 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:

    Listado de los contenidos del directorioCopiar, mover y eliminar archivos y directoriosManipular mltiples archivos y directorios de manera recursivaUso de patrones de comodines para manipular archivosUso del comando find para encontrar y actuar sobre archivos basndose en su tipo, tamao u hora

    Listado de directoriosComo 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 son absolutos, lo que significa que comienzan con una /, o son relativos al directorio 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 comando ls para 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]$ lssedtab text2 text4 text6 xab yabtext1 text3 text5 xaa yaa[ian@echidna lpi103]$ ls "$PWD"sedtab text2 text4 text6 xab yabtext1 text3 text5 xaa yaa[ian@echidna lpi103]$ ls /home/ian/lpi103sedtab text2 text4 text6 xab yabtext1 text3 text5 xaa yaa

    Como puede observar, usted puede hacer que el nombre del directorio sea como un parmetro del

  • comando ls y 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 de bloques. La informacin sobre el archivo figura en un inode que 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 el nmero de serie del archivo y 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 comando ls no 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 -l y -a para 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 -altotal 56drwxrwxr-x 2 ian ian 4096 Sep 30 15:01 .drwxr-xr-x 94 ian ian 8192 Sep 27 12:57 ..-rw-rw-r-- 1 ian ian 8 Sep 26 15:24 sedtab-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 84 Sep 25 17:47 text3-rw-rw-r-- 1 ian ian 26 Sep 25 22:28 text4-rw-rw-r-- 1 ian ian 24 Sep 26 12:46 text5-rw-rw-r-- 1 ian ian 98 Sep 26 16:09 text6-rw-rw-r-- 1 ian ian 15 Sep 23 14:11 xaa-rw-rw-r-- 1 ian ian 9 Sep 23 14:11 xab-rw-rw-r-- 1 ian ian 18 Sep 23 14:11 yaa-rw-rw-r-- 1 ian ian 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.

    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 de vnculos **** fsicos que 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 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 -i del comando ls visualizar 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 comando ls , donde cada nombre sea el de un archivo o el de un directorio. Si el nombre es el de un directorio, el comando ls muestra 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 comando ls -l ../lpi103 nos mostrara un listado como el del ejemplo anterior. El Listado 45 le muestra cmo usar ls -ld y 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 xaadrwxrwxr-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, ls nos muestra una lista por orden alfabtico. Hay varias opciones para ordenar los datos de salida. Por ejemplo, ls -t ordena por hora de modificacin (de la ms reciente a la ms antigua), mientras que ls -lS produce una larga lista ordenada por