Académique Documents
Professionnel Documents
Culture Documents
LPI
TEMA 103
IBM
http://www.ibm.com/developerworks/ssa/linux/e
du/l-lpic1103/index.html
Valor de
ponderacin del
objetivo
1.103.1
Trabajo en la lnea de
comandos
Valor: 5
1.103.2
Procesamiento de flujos de
texto usando filtros
Valor: 6
1.103.3
Gestin de archivos bsica
Valor: 3
1.103.4
Uso de flujos,
canalizaciones y
redireccionamientos
Valor: 5
1.103.5
Procesos de creacin,
monitoreo y eliminacin
Valor: 5
1.103.6
Modificacin de las
prioridades de ejecucin de
procesos
Valor: 3
1.103.7
Bsqueda de archivos de
texto usando expresiones
regulares
Valor: 3
1.103.8
Operaciones de edicin de
archivos bsicas usando vi
Valor: 1 punto
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, 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.
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 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
Word
[ian@echidna
A phrase
[ian@echidna
Where are my
[ian@echidna
Here
are
are
my
spaces?
are
my
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
Secuencia
de 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 line
No new line[ian@echidna ian]$ echo -e "No new line\c"
No new line[ian@echidna ian]$ echo "A line with a typed
> return"
A line with a typed
return
[ian@echidna ian]$ echo -e "A line with an escaped\nreturn"
A line with an escaped
return
[ian@echidna ian]$ echo "A line with an escaped\nreturn but no -e option"
A line with an escaped\nreturn but no -e option
[ian@echidna ian]$ echo -e Doubly escaped\\n\\tmetacharacters
Doubly escaped
metacharacters
[ian@echidna ian]$ echo Backslash \
> followed by newline \
> serves as line continuation.
Backslash followed by newline serves as line continuation.
Obsrvese que bash muestra un prompt especial (>) cuando se ingresa una lnea con comillas sin cerrar.
El flujo de entrada contina en una segunda lnea incluye el carcter de nueva lnea.
Metacaracteres y operadores de control del shell bash
Bash tiene varios metacaracteres, que, cuando no aparecen entre comillas, sirven para separar los datos
de entrada en palabras. Adems del espacio en blanco, estos son '|', '&', ';', '(', ')', '<' y '>'. Explicaremos
algunos de estos caracteres con mayor profundidad en otras secciones de este tutorial. Por el momento,
considere que si desea incluir un metacarcter como parte del texto, ste deber aparecer o bien entre
comillas o como carcter de escape, usando una barra invertida (\), como muestra el Listado 4.
La nueva lnea y ciertos metacaracteres o pares de metacaracteres tambin pueden usarse como
operadores de control. Estos son '||', '&&', '&', ';', ';;', '|'' '(' y ')'. Algunos de estos operadores de control
permiten crear secuencias o listas de comandos.
La secuencia de comandos ms sencilla se compone de tan solo dos comandos separados por un punto
y coma (;). Cada comando se ejecuta en secuencia. En entornos programables, los comandos devuelven
una indicacin de xito o falla. Los comandos Linux suelen devolver un valor cero en casos de xito y
un valor distinto a cero en casos de fallas. Puede ingresar algn tipo de procesamiento condicional en
su lista usando los operadores de control && y ||. Si separa dos comandos con el operador de control
&&, el segundo se ejecutar si y slo si el primero devuelve un valor de salida de cero. Si separa los
comandos con ||, el segundo se ejecutar slo si el primero devuelve un cdigo de salida distinto a cero.
El Listado 5 muestra algunas secuencias de comandos que usan el comando echo. Estas primeras no
son demasiado interesantes porque, en ellas, echo devuelve 0. Ms adelante mostraremos otros
ejemplos que permiten usar una mayor variedad de comandos.
Listado 5. Secuencias de comandos
[ian@echidna ian]$ echo line 1;echo line 2; echo line 3
line 1 line 2 line 3 [ian@echidna ian]$ echo line 1&&echo line
2&&echo line 3 line 1 line 2 line 3 [ian@echidna ian]$ echo
line
1||echo line 2; echo line 3 line 1 line 3
Exit
Un shell puede cerrarse usando el 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 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
PWD
SHELL
$
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 comando
chsh -s /bin/bash
para cambiar el shell predeterminado. La
nueva forma predeterminada se aplicar la
prxima vez que inicie sesin.
Use el comando
su - $USER -s /bin/bash
para crear otro proceso como proceso
secundario de su shell actual. El proceso
nuevo ser un shell de inicio de sesin que
usa bash.
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]$ 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 -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 $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 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
22985
[ian@echidna
[ian@echidna
25063
[ian@echidna
$ echo $$
25063
$ exit
[ian@echidna
22985
ian]$ echo $$
ian]$ bash
ian]$ echo $$
ian]$ exec ksh
ian]$ echo $$
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 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:
history
Muestra todo el historial
history N
Muestra las ltimas lneas N de su historial
history -d N
Elimina una lnea N de 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 posicin N
!-N
Muestra 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
!string
Muestra 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]$ !ec
echo $$
22985
[ian@echidna ian]$ !en:s/$$/$PPID/
env -i bash -c 'echo $PPID'
22985
[ian@echidna ian]$ history 6
1097 echo $$
-c 'echo $$'
-c 'echo $$'
-c 'echo $PPID'
history -d1100
M-d
Alt-d
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 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 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 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.
home]$ cd /;pwd
/]$ cd /usr/X11R6;pwd
X11R6]$ cd ;pwd
ian]$ cd -;pwd
X11R6]$ cd ~ian/..;pwd
home]$ cd ~;pwd
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 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`;done
p7 RH73
p8 SUSE81
p9 IMAGES
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 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 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 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
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.
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 command2
command1 |
command2
Ambos comandos pueden tener opciones o argumentos, lo cual abordaremos ms adelante en esta
seccin. | tambin puede usarse para redirigir los datos de salida de command2 de esta canalizacin
hacia otro comando adicional, command3. La construccin de canalizaciones extensas de comandos
con capacidades individuales limitadas es una forma comn de completar tareas en Linux y UNIX.
Tambin es frecuente el uso de un guin (-) en lugar de un nombre de archivo como argumento de un
comando, lo cual significa que los datos de entrada provendrn de stdin y no de un archivo.
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.
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]$
0000000 004471 066160
0000020 030061 060411
0000031
[ian@echidna lpi103]$
0000000
9 \t
p
0000016
1
0 \t
0000025
[ian@echidna lpi103]$
9 ht
p
l
u
1
0 ht
a
p
od text2
066565 031412 061011 067141 067141 005141
070160 062554 000012
od -A d -t c text2
l
u
m \n
3 \t
a
p
p
l
e \n
od -A n -t a text2
m nl
3 ht
b
p
l
e nl
\n
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 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 usramos cat para visualizarlo.
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 | 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 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 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 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 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 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 fmt
El 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
1 apple
2 pear
text1
Page 1
3 banana
[ian@echidna lpi103]$ nl text2 | pr -m - text1 | head
2005-09-26 11:48
1
2
3
9
3
10
Page 1
plum
banana
apple
1 apple
2 pear
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-$>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.
Sort y uniq
El 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 - 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 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.
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 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.
Sed
Sed 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/' 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 -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 '}' 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 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 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.
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
9
10
11
12
2 pear
3 banana
9
plum
3
banana
10 apple
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 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]$
/home/ian/lpi103
[ian@echidna lpi103]$
/home/ian/lpi103
[ian@echidna lpi103]$
sedtab text2 text4
text1
text3 text5
[ian@echidna lpi103]$
sedtab text2 text4
text1
text3 text5
[ian@echidna lpi103]$
sedtab text2 text4
text1
text3 text5
pwd
echo $PWD
ls
text6 xab yab
xaa
yaa
ls "$PWD"
text6 xab yab
xaa
yaa
ls /home/ian/lpi103
text6 xab yab
xaa
yaa
Como puede observar, usted puede hacer que el nombre del directorio sea como un parmetro del
4096
8192
8
24
25
84
26
24
98
15
9
18
7
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
Sep
30
27
26
23
23
25
25
26
26
23
23
23
23
15:01
12:57
15:24
12:27
13:39
17:47
22:28
12:46
16:09
14:11
14:11
14:11
14:11
.
..
sedtab
text1
text2
text3
text4
text5
text6
xaa
xab
yaa
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 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, 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 tamao (de la ms
grande a la ms pequea). Si agregamos -r, se invierte el orden. Por ejemplo, use ls -lrt para
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.
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 comando cp copia un archivo sobre una copia ya existente (si el archivo existente se
puede escribir). Por otro lado, el comando mv no mover ni cambiar el nombre de un archivo si el
destino ya existe. Existen varias opciones muy tiles relacionadas con el comportamiento de cp y mv.
-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
[ian@echidna
[ian@echidna
text1.bkp.1
[ian@echidna
[ian@echidna
text1.bkp.1
lpi103]$ cp
lpi103]$ cp
lpi103]$ ls
text1.bkp.2
lpi103]$ rm
lpi103]$ ls
text1.bkp.2
text2 backup
--backup=t text2 backup
backup
text2 text2.~1~
backup/text2 backup/text2.~1~
backup
Tenga en cuenta que el comando rm tambin acepta las opciones -i (interactive) y -f(force).
Luego de eliminar un archivo usando rm, el sistema de archivos ya no tiene ms acceso a l. Algunos
sistemas, de manera predeterminada, configuran un alias alias 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 comando cp, 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 -p para 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.
Mkdir y rmdir
Ya discutimos cmo crear un directorio con mkdir. 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 comando mkdir, 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 usar echo $? 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 -p para
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 comando rmdir es lo opuesto a crearlos. Una vez ms, existe la
opcin -p para tambin eliminar los directorios principales. Slo puede eliminar un directorio con el
comando rmdir si 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 usar rmdir en 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 comando rmdir para eliminar todos los directorios que
creamos con mkdir. 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 de rmdir -p.
Listado 50. Eliminacin de directorios
[ian@echidna lpi103]$ cp text1 d1/d2
Manipulacin recursiva
En las partes restantes de esta seccin, analizaremos las diversas operaciones para ocuparse de
mltiples archivos y para realizar la manipulacin recursiva de parte de un rbol de directorio.
Listado recursivo
El comando ls tiene la opcin -R(tenga en cuenta que se usa la letra mayscula "R") para mostrar
un listado de un directorio y todos sus subdirectorios. Esta opcin recursiva slo aplica en el caso de
los nombre de directorios. No sirve para encontrar todos los archivos denominados "text1", por
ejemplo, en un rbol de directorio. Usted puede usar otras de las opciones que ya hemos discutido junto
con -R. El Listado 51 muestra un listado recursivo de nuestro directorio lpi103, incluyendo los
nmeros de inode.
Listado 51. Listado de directorio recursivo
[ian@echidna lpi103]$ ls -iR ~/lpi103
/home/ian/lpi103:
1564496 backup 2128985 text2 2128982 text5
2128991 sedtab 2128990 text3 2128995 text6
2128984 text1
2128992 text4 2128986 xaa
2128987 xab
2128988 yaa
2128989 yab
/home/ian/lpi103/backup:
2129019 text1.bkp.1 1564497 text1.bkp.2
Copia recursiva
Usted puede usar la opcin -r (o-Ro--recursive) para que el comando cp se dirija hacia los
directorios originales y copie los contenidos de manera recursiva. Para evitar una recursin infinita, el
directorio original no se puede copiar. El Listado 52 le muestra cmo copiar todo lo que se encuentra
en nuestro directorio lpi103 en un subdirectorio denominado copy1. Usamos ls -R para mostrar el
rbol de directorio resultante.
Listado 52. Copia recursiva
[ian@echidna lpi103]$ cp -pR . copy1
cp: cannot copy a directory, `.', into itself, `copy1'
[ian@echidna lpi103]$ ls -R
.:
backup
copy1
sedtab
text1
./backup:
text1.bkp.1
text2
text3
text4
text5
text6
xaa
xab
yaa
yab
./copy1:
backup text1
sedtab text2
text1.bkp.2
text3
text4
text5
text6
xaa
xab
yaa
yab
./copy1/backup:
text1.bkp.1 text1.bkp.2
Borrado recursivo
Ya mencionamos que rmdir slo elimina directorios vacos. Podemos usar la opcin -r (o-Ro-recursive) para que el comando rm elimine ambos archivos y directorios como se puede observar
en el Listado 53, donde eliminamos el directorio copy1 que acabamos de crear junto con todos sus
contenidos, incluyendo el subdirectorio de backup y todos sus contenidos.
Listado 53. Borrado recursivo
[ian@echidna lpi103]$
[ian@echidna lpi103]$
.:
backup text1 text3
sedtab text2 text4
./backup:
text1.bkp.1
rm -r copy1
ls -R
text5
text6
xaa
xab
yaa
yab
text1.bkp.2
Si tiene archivos que usted no puede escribir, es probable que tenga que agregar la opcin -f para
forzar la eliminacin. Esto lo suele hacer el usuario raz cuando realiza una limpieza. Pero tenga mucho
cuidado porque puede llegar a perder datos valiosos.
Comodines y globbing
Generalmente, es posible que usted necesite realizar una sola operacin sobre muchos objetos del
sistema de archivos sin afectar a todo el rbol (como lo acabamos de hacer con las operaciones
recursivas). Por ejemplo, es posible que usted desee encontrar las horas de modificacin de todos los
archivos de texto que creamos en lpi103 sin que se muestre un listado de los archivos divididos.
Aunque esto es fcil de lograr debido a que nuestro directorio es muy pequeo, suele ser mucho ms
difcil en el caso de los sistemas de archivos ms grandes.
Para resolver este problema, use el soporte de comodines que forma parte del shell bash. Este soporte,
al que se lo suele denominar "globbing" (porque originalmente se lo implement como un programa
denominado /etc/glob), le permite especificar mltiples archivos usando el patrn de comodines.
Una cadena que contiene cualquiera de estos caracteres "?", "*" o "[", es un patrn de comodines.
Globbing es el proceso por medio del que el shell (o posiblemente otro programa) expande estos
patrones en una lista de nombres de ruta que se corresponden con el patrn. Esta correspondencia se
text1
text2
text3 text5
text[*?!1] text[2*?!] text4 text6
[ian@echidna lpi103]$ ls *[y\!]*
text[*?!1] text[2*?!] yaa yab
[ian@echidna lpi103]$ ls tex?[[]*
text[*?!1] text[2*?!]
[ian@echidna lpi103]$ rm tex?[[]*
[ian@echidna lpi103]$ ls *b*
sedtab xab yab
xaa
xab
backup:
text1.bkp.1 text1.bkp.2
[ian@echidna lpi103]$ ls backup/*2
backup/text1.bkp.2
[ian@echidna lpi103]$ ls -d .*
. ..
Notas:
1.La complementacin en conjunto con "*" puede causar algunas sorpresas. El patrn "*[!2-4]"
se corresponde con la parte ms larga de un nombre que no tiene 2, 3 4 a continuacin, lo que
se corresponde tanto con text[*?!1] como con text[2*?!]. Entonces, ambas sorpresas deberan
quedar en claro ahora.
2.Como en el caso de los ejemplos anteriores de ls, si la expansin del patrn resulta en un
nombre que es un nombre de directorio y no se especifica la opcin -d, los contenidos de dicho
directorio aparecern en una lista (como en nuestro ejemplo anterior para el caso del patrn
"*b*").
3.Si el nombre de un archivo comienza con un punto (.), dicho carcter se debe corresponder de
manera explcita. Tenga en cuenta que slo el ltimo comandolsincluy en la lista las dos
entradas de directorio especiales (. y ..).
Recuerde que el shell puede expandir todos los caracteres de comodines en un comando, lo que puede
ocasionar resultados inesperados. Adems, si usted especifica un patrn que no se corresponde con
ningn objeto del sistema de archivos, POSIX requiere que la cadena del patrn original se transfiera al
comando. Ilustramos esto en el Listado 55. Algunas implementaciones anteriores transfirieron una lista
nula al comando. Por lo tanto, usted se puede encontrar con scripts viejos que tengan un
comportamiento inusual. Ilustramos estos puntos en el Listado 55.
Listado 55. Sorpresas con el patrn de comodines
[ian@echidna lpi103]$ echo text*
text1 text2 text3 text4 text5 text6
[ian[ian@echidna lpi103]$ echo "text*"
text*
@echidna lpi103]$ echo text[[\!?]z??
text[[!?]z??
Para mayor informacin sobre globbing, ingrese a man 7 glob . Usted necesitar el nmero de
seccin, ya que tambin hay informacin sobre glob en la seccin 3. La mejor forma de comprender
todas las interacciones de shell es por medio de la prctica. Por lo tanto, experimente con estos
comodines siempre que pueda. Recuerde experimentar con ls para verificar su patrn de comodines
antes de usarlo con cp, mv, o lo que es incluso peor, con rm y tener que enfrentar diversos resultados
inesperados.
Archivos touch
Ahora, analizaremos el comando touch, que puede actualizar el acceso al archivo y las horas de
modificacin o crear archivos vacos. En la prxima parte, veremos cmo usar esta informacin para
encontrar archivos y directorios. Usaremos el directorio lpi103 que creamos con anterioridad en este
tutorial. Tambin analizaremos el comando
touch
El comando touch sin opciones toma uno o ms nombres de archivos como parmetros y actualiza
la hora de modificacin de los archivos. sta es la misma fecha y hora que generalmente se visualiza
con un listado de directorio largo. En el Listado 56, usamos el ya conocido comando echo para crear
un archivo pequeo denominado f1 y, luego de esto, usamos un listado de directorio largo para
visualizar la hora de modificacin (omtime). En este caso, tambin es la hora en la que se cre el
archivo. Luego de esto, usamos el comando sleep para esperar 60 segundos y ejecutar ls una vez
ms. Tenga en cuenta que la fecha y hora correspondiente al archivo se modific en un minuto.
Listado 56. Actualizacin de la hora de modificacin con touch
[ian@echidna lpi103]$ echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1
-rw-rw-r-1 ian
ian
4 Nov 4 15:57 f1
-rw-rw-r-1 ian
ian
4 Nov 4 15:58 f1
Si usted especifica un nombre de archivo para un archivo que no existe, el comando touch crear un
archivo vaco, a menos que usted especifique las opciones -c o --no-create. El Listado 57 ilustra
ambos comandos. Tenga en cuenta que slo se crea f2.
Listado 57. Creacin de archivos vacos con touch
[ian@echidna lpi103]$ touch f2; touch -c f3; ls -l f*
-rw-rw-r-1 ian
ian
4 Nov 4 15:58 f1
-rw-rw-r-1 ian
ian
0 Nov 4 16:12 f2
El comando touch tambin puede configurar la mtime de un archivo para una fecha y hora
especfica usando las opciones -d o -t. La opcin -d es muy flexible en lo que hace a los formatos
de fecha y hora que aceptar, mientras que la opcin -t necesita por lo menos una hora con el
formato MMDDhhmm con valores opcionales relativos al ao y a los segundos. El Listado 58 le
muestra algunos ejemplos.
[ian@echidna
[ian@echidna
[ian@echidna
[ian@echidna
[ian@echidna
[ian@echidna
-rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--
lpi103]$
lpi103]$
lpi103]$
lpi103]$
lpi103]$
lpi103]$
1 ian
1 ian
1 ian
1 ian
1 ian
1 ian
1 ian
1 ian
1 ian
f5
f1
f2
f9
f7
f3
f6
f4
f8
Si no est seguro de qu fecha una expresin de fecha puede llegar a determinar, puede usar el
comando date para enterarse de ello. ste tambin acepta el uso de la opcin -d y puede
determinar el mismo tipo de formatos de fecha que touch.
Usted puede usar la opcin -r(o--reference) junto con unn ombre de archivo de referencia para
indicar que touch (o date) debera usar la fecha y hora de un archivo existente. El Listado 59 le
muestra algunos ejemplos.
Listado 59. Fechas y horas de los archivos de referencia
[ian@echidna lpi103]$ date
Mon Nov 7 12:40:11 EST 2005
[ian@echidna lpi103]$ date -r f1
Fri Nov 4 15:58:27 EST 2005
[ian@echidna lpi103]$ touch -r f1 f1a
[ian@echidna lpi103]$ ls -l f1*
-rw-rw-r-1 ian
ian
-rw-rw-r-1 ian
ian
4 Nov
0 Nov
4 15:58 f1
4 15:58 f1a
Un sistema Linux registra tanto la hora de modificacin de un archivo y la hora de acceso al archivo.
Ambas fechas y horas estn configuradas con los mismos valores que aquellos que figuran en un
archivo cuando se lo crea. Adems, ambas se reconfiguran cuando se modifica el archivo en cuestin.
Cuando se accede a un archivo, se actualiza la hora (incluso si no se realiza ninguna modificacin).
Para el caso de nuestro ltimo ejemplo con touch, analizaremos las horas de acceso. Las opciones
-a (otime=atime,--time=access o--time=use) especifican que la hora de acceso se
debera actualizar. El Listado 60 usa el comando cat para acceder al archivo f1 y visualizar sus
contenidos. Luego de esto, usamos ls -l y ls -lu para visualizar la modificacin y acceder a
las horas correspondientes a f1 y a f1a, que creamos usando f1 como archivo de referencia. Luego de
esto, reconfiguramos la hora de acceso de f1 para que sea la de f1a usando touch -a.
xxx
[ian@echidna
-rw-rw-r--rw-rw-r-[ian@echidna
-rw-rw-r--rw-rw-r-[ian@echidna
xxx
[ian@echidna
-rw-rw-r--rw-rw-r-[ian@echidna
-rw-rw-r--rw-rw-r-[ian@echidna
[ian@echidna
-rw-rw-r--rw-rw-r--
4 Nov
0 Nov
7 14:13 f1
4 15:58 f1a
4 Nov
0 Nov
4 15:58 f1
4 15:58 f1a
ls -l f1*
ian
4 Nov
ian
0 Nov
ls -lu f1*
ian
4 Nov
ian
0 Nov
touch -a -r f1a f1
ls -lu f1*
ian
4 Nov
ian
0 Nov
4 15:58 f1
4 15:58 f1a
7 14:13 f1
4 15:58 f1a
4 15:58 f1
4 15:58 f1a
Para mayor informacin sobre todas las especificaciones posibles de fecha y hora, vea las pginas man
o de informacin para adentrarse en los comandos touch y date.
Notas:
1.Los patrones que usted puede usar son patrones de comodines shell como aquellos que
analizamos con anterioridad en la seccin Comodines y globbing.
2.Puede usar -path en vez de -name para realizar la correspondencia con rutas completas
en vez de slo con los nombres base del archivo. En este caso, el patrn puede abarcar los
componentes de la ruta.
3.Si desea realizar una bsqueda que no distinga entre maysculas y minsculas, como se puede
observar en el uso de ipath que figura con anterioridad, antes de las opciones de find que
buscan en una cadena o en un patrn, coloque una "i".
4.Si desea encontrar un archivo o un directorio cuyo nombre comienza con un punto (como, por
ejemplo, .bashrc o el directorio actual (.)), debe especificar un punto inicial como parte del
patrn. Si no hace esto, las bsquedas de nombre ignorarn estos archivos o directorios.
En el primer ejemplo que figura con anterioridad, encontramos ambos archivos y un directorio
(./backup). Use el parmetro -type junto con un tipo de una letra para restringir la bsqueda. Use
"f" para buscar los archivos regulares, "d" para buscar directorios y "l" para buscar vnculos simblicos.
Vea la pgina man para usar find y encontrar otros tipos posibles. El Listado 62 le muestra el
resultado de la bsqueda de directorios (-type d).
Listado 62. Bsqueda de archivos por tipo
[ian@echidna lpi103]$ find . -type d
. ./backup [ian@echidna lpi103]$ find . -type d -name "*"
./backup
Tenga en cuenta que la especificacin -type d, sin especificar ningn tipo de nombre, visualiza
directorios que tienen un punto inicial en sus nombres (slo el directorio actual en este caso).
Tambin podemos realizar la bsqueda por tamao de archivo. Dicha bsqueda puede ser por un
tamao especfico (n) o por archivos que tengan un tamao superior (+n) o inferior (-n) a un valor
determinado. Al usar el lmite superior y el lmite inferior, podemos buscar archivos cuyo tamao se
encuentre dentro de un rango determinado. De manera predeterminada, la opcin-sizedefindasume
una unidad de "b" para bloques de 512 bytes. Entre las otras opciones disponibles, especifique "c" para
indicar bytes o "k" para indicar kilobytes. En el Listado 63, primero buscamos todos los archivos con
un tamao de 0 y, luego de esto, todos aquellos que tienen un tamao de 24 o 25 bytes. Tenga en cuenta
que al especificar-emptyen vez de-size 0tambin se encuentran los archivos vacos.
Listado 63. Bsqueda de archivos por tamao
[ian@echidna lpi103]$ find . -size 0
./f2
./f3
./f4
./f5
./f6
./f7
./f8
./f9
./f1a
[ian@echidna lpi103]$ find . -size -26c -size +23c -print
./text1
./text2
./text5
./backup/text1.bkp.2
./backup/text1.bkp.1
El Listado 63 introduce la opcin -print, que es un ejemplo de una accin que se puede tomar
sobre los resultados que arroja la bsqueda. En el shell bash, sta es la accin predeterminada si no se
especifica ninguna otra accin. En algunos sistemas y en algunos shells, es necesario indicar una
accin. En caso contrario, no existir ningn dato de salida.
Entre las dems acciones, podemos incluir las siguientes:-ls, que imprime la informacin del archivo
equivalente a la del comando ls -lids , o -exec, que ejecuta un comando para cada archivo.exec debe concluir con un punto y coma, que debe ser escapado para evitar que el shell lo interprete
primero. Adems, especifique {} donde desee que el archivo resultante se use en el comando. Como se
describe con anterioridad, las llaves tambin tienen un significado para el shell y se las debera escapar
(o colocar entre comillas). El Listado 64 le muestra cmo las opciones-lsy-execse pueden usar para
realizar una lista de la informacin del archivo.
Listado 64. Bsqueda e influencia sobre los archivos
[ian@echidna
2128984
4
2128985
4
2128982
4
1564497
4
2129019
4
[ian@echidna
-rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--
La opcin -exec se puede usar con tantos propsitos como se le ocurra. Por ejemplo:
find . -empty -exec rm '{}' \;
elimina todos los archivos vacos en un rbol de directorio, mientras que
find . -name "*.htm" -exec mv '{}' '{}l' \;
cambia el nombre de todos los archivos .htm para que pasen a ser archivos .html.
En el caso de nuestros ltimos ejemplos, usamos las fechas y horas que se describen con anterioridad
con el comando touch para localizar aquellos archivos que tengan una fecha y hora particular. El
Listado 65 le muestra tres ejemplos:
1.Cuando se lo usa con -mtime -2, el comando find busca todos los archivos
modificados en los ltimos dos das. En este caso, un da es un perodo de 24 horas relativo a la
fecha y a la hora actual. Tenga en cuenta que usted usara -atime si desease buscar archivos
basndose en la hora de acceso en vez de en la hora de modificacin.
2.Al agregar la opcin -daystart, buscamos considerar los das como das calendario
(comenzando desde la medianoche). Ahora, el archivo f3 se excluye de la lista.
3.Por ltimo, le mostramos cmo usar un rango de tiempo en minutos en vez de en das para
buscar los archivos modificados entre la ltima hora (60 minutos) y las ltimas 10 horas (600
minutos).
Listado 65. Bsqueda de archivos por fecha y hora
[ian@echidna lpi103]$ date
Mon Nov 7 14:59:02 EST 2005
[ian@echidna lpi103]$ find . -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r-1 ian
ian
0 Nov 5 15:10 ./f3
-rw-rw-r-1 ian
ian
0 Nov 7 11:00 ./f4
-rw-rw-r-1 ian
ian
0 Nov 6 06:00 ./f6
-rw-rw-r-1 ian
ian
0 Nov 8 2005 ./f8
[ian@echidna lpi103]$ find . -daystart -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r-1 ian
ian
0 Nov 7 11:00 ./f4
-rw-rw-r-1 ian
ian
0 Nov 6 06:00 ./f6
-rw-rw-r-1 ian
ian
0 Nov 8 2005 ./f8
[ian@echidna lpi103]$ find . -mmin -600 -mmin +60 -type f -exec ls -l '{}' \;
-rw-rw-r-1 ian
ian
0 Nov 7 11:00 ./f4
Las pginas man, en relacin al comando find, lo pueden ayudar a interiorizarse sobre la gran
variedad de opciones que no podemos explicar en esta breve introduccin.
Como ya lo explicamos, el redireccionamiento de los datos de salida usando n> suele sobrescribir los
archivos ya existentes. Usted puede controlar esto con la opcin noclobber del builtin set. Si se
lo configur, usted lo puede desactivar usando n>| (como se puede observar en el Listado 67).
Listado 67. Redireccionamiento de los datos de salida con noclobber
[ian@echidna lpi103]$ set -o noclobber
[ian@echidna lpi103]$ ls x* z* >stdout.txt 2>stderr.txt
-bash: stdout.txt: cannot overwrite existing file
[ian@echidna lpi103]$ ls x* z* >|stdout.txt 2>|stderr.txt
[ian@echidna lpi103]$ cat stdout.txt
xaa
xab
[ian@echidna lpi103]$ cat stderr.txt
ls: z*: No such file or directory
[ian@echidna lpi103]$ set +o noclobber #restore original noclobber setting
A veces, es posible que usted desee redireccionar los datos de salida estndar y el error estndar hacia
un archivo. Esto se suele hacer en el caso de los procesos automatizados o los trabajos de segundo
plano con el objetivo de que usted pueda revisar los datos de salida ms adelante. Use &> o &>> para
redireccionar los datos de salida estndar y el error estndar hacia el mismo lugar. Otra forma de hacer
esto consiste en redireccionar el descriptor de archivo n y, luego de esto, redireccionar el descriptor de
archivo m hacia el mismo lugar usando la construccin m>&n o m>>&n. El orden en el que los datos
de salida se redireccionan es importante. Por ejemplo:
command 2>&1 >output.txt
no es lo mismo que
command >output.txt 2>&1
Ilustramos estos redireccionamientos en el Listado 68. Tenga en cuenta que, en el ltimo comando, los
datos de salida estndar se redireccionaron luego del error estndar. Por lo tanto, los datos de salida del
error estndar todava van hacia la ventana de terminal.
Listado 68. Redireccionamiento de dos flujos hacia un mismo archivo
[ian@echidna lpi103]$ ls x* z*
&>output.txt [ian@echidna lpi103]$ cat output.txt ls: z*: No such file
or
directory xaa xab [ian@echidna lpi103]$ ls x* z* >output.txt 2>&1
[ian@echidna lpi103]$ cat output.txt ls: z*: No such file or directory
xaa xab
[ian@echidna lpi103]$ ls x* z* 2>&1 >output.txt ls: z*: No such
file or directory [ian@echidna lpi103]$ cat output.txt xaa xab
En otras ocasiones, es posible que usted desee ignorar por completo los datos de salida estndar o el
error estndar. Para hacer esto, redireccione el flujo adecuado hacia /dev/null. En el Listado 69, le
mostramos cmo ignorar los datos de salida del error del comandols.
Listado 69. Cmo ignorar los datos de salida usando /dev/null?
[ian@echidna lpi103]$ ls x* z* 2>/dev/null
xaa xab [ian@echidna lpi103]$ cat /dev/null
Los shells, incluyendo a bash, tambin tienen el concepto de un documento here, que es otra forma de
redireccionar los datos de entrada. Esta forma usa << junto con una palabra (como, por ejemplo, END)
para un marcador o un centinela para indicar el final de los datos de entrada. Ilustramos esto en el
Listado 71.
Listado 71. Redireccionamiento de los datos de entrada con un documento here
[ian@echidna lpi103]$ sort -k2
<<END > 1 apple > 2 pear > 3 banana > END 1
apple 3 banana 2 pear
Se acuerda de cmo creamos el archivo text2 en el Listado 23? Seguramente se est preguntando por
qu no ingres sort -k2 y sus datos y luego presion Ctrl-d para indicar el final de los datos de
entrada. Y la respuesta corta a esto es que usted lo podra haber hecho, pero no habra aprendido nada
sobre los documentos here. La respuesta real es que los documentos here se usan mucho ms a menudo
en los shell scripts (que se detallan en el tutorial correspondiente al tema 109 sobre shells, scripting,
programacin y compilacin). Un script no tiene ninguna otra forma de sealar qu lneas del script se
deberan considerar datos de entrada. Como los shell scripts usan mucho la tabulacin para que la
sangra sea la correcta y as facilitar la lectura, esto no es todo en relacin a los documentos here. Si
usted usa <<- en vez de <<, los tabuladores iniciales desaparecern. En el Listado 72, usamos la misma
tcnica para crear un carcter de tabulacin cautivo que usamos en el Listado 42. Luego de esto,
creamos un shell script muy pequeo que contiene dos comandos cat(cada uno de ellos lee de un
documento here). Por ltimo, usamos el comando.(punto) para originar el script, lo que significa
ejecutarlo en el contexto shell actual.
Listado 72. Redireccin de entrada con un documento here
[ian@echidna lpi103]$ ht=$(echo -en "\t") [ian@echidna
lpi103]$ cat<<END>ex-here.sh > cat <<-EOF
> apple > EOF > ${ht}cat <<-EOF > ${ht}pear
> ${ht}EOF > END [ian@echidna lpi103]$ cat ex-here.sh cat
<<-EOF apple EOF cat <<-EOF pear EOF [ian@echidna lpi103]$ .
ex-here.sh apple pear
Canalizaciones
En la seccin Flujos y filtros de texto, se defini el filtrado de texto como el proceso de tomar un flujo
de texto de entrada y convertir el texto antes de enviarlo a un flujo de salida. Tambin se dijo que el
filtrado se suele realizar construyendo una canalizacin de comandos cuando los datos de salida de un
comando son canalizados o redirigidos para su uso como datos de entrada para el siguiente. Este uso
de canalizaciones no se limita a los flujos de texto, aunque es cierto que es en esos flujos donde se
suelen usar.
Canalizacin de stdout a stdin
Como ya se analiz, el operador | (canalizacin) se usa entre dos comandos para dirigir el stdout del
primer comando hasta el stdin del segundo. Para construir canalizaciones ms largas, es necesario
agregar ms comandos y ms operadores, como se muestra en el listado 73.
Listado 73. Canalizacin de datos de salida a travs de varios comandos
command1 | command2 | command3
Es importante mencionar que las canalizaciones solamente canalizan stdout hasta stdin. No es posible
usar 2 | para canalizar stderr nicamente; por lo menos, no con las herramientas analizadas hasta el
momento. Si stderr ha sido redirigido hasta stdout, ambos flujos sern canalizados. Esto se ilustra en el
listado 74, donde se emplea una canalizacin para ordenar los mensajes de salida normales y de error a
partir de un improbable comandolscon cuatro argumentos comodn que no estn en orden alfabtico.
2>&1 |sort
Los comandos pueden presentar opciones o argumentos. Muchos de ellos, en lugar de un nombre de
archivo, usan un guin (-) como argumento para indicar que la entrada debera provenir de stdin, y no
de un archivo. Verifique las pginas man del comando para estar seguro. Construir largas
canalizaciones de diversos comandos con capacidad limitada es una forma habitual de realizar tareas en
Linux y UNIX.
Una de las ventajas que presentan las canalizaciones en los sistemas Linux y UNIX es que, a diferencia
de otros populares sistemas operativos, no hay ningn archivo intermedio involucrado en la
canalizacin. El stdout del primer comando no es escrito en un archivo y luego ledo por el segundo
comando. Si su versin de tar no soporta la descompresin de archivos comprimidos con bzip2,
no se preocupe. Como se analiz en el tutorial del tema 102, es posible usar una canalizacin como.
bunzip2 -c drgeo-1.1.0.tar.bz2 | tar -xvf para realizar la tarea.
Hasta ahora, los mtodos explicados no presentan complicaciones; sin embargo, tienen algunas
limitaciones. Analicemos el caso de un nombre de archivo que contiene un espacio en blanco (vaco en
este caso). Observe el listado 76 y vea si puede comprender qu sucede con cada uno de los comandos
antes de leer las explicaciones pertinentes.
Listado 76. Uso de datos de salida como argumentos con sustitucin de comandos y find -exec
[ian@echidna lpi103]$ echo grapes>"text sample2"
[ian@echidna lpi103]$ cat `ls text*le2`
cat: text: No such file or directory
cat: sample2: No such file or directory
[ian@echidna lpi103]$ cat "`ls text*le2`"
grapes
[ian@echidna lpi103]$ cat "`ls text*2`"
cat: text2
text sample2: No such file or directory
xargs
La mayora de las veces se busca procesar listas de archivos; por eso, es fundamental encontrar una
manera de buscarlas y luego procesarlas. Afortunadamente, el comando find cuenta con una opcin,
-print0, que separa nombres de archivo de salida con un carcter nulo en vez de una nueva lnea.
Algunos comandos, como tar y xargs, tienen una opcin -0 null que les permite
comprender este tipo de parmetros. Ya hemos visto el comando tar. El comando xargs funciona
de una manera similar a la opcin -exec de find, aunque presenta algunas diferencias
importantes que se analizarn ms adelante. Antes, veamos un ejemplo.
Listado 78. Uso de xargs con -0
[ian@echidna lpi103]$ find . -name "text*2" -print0 |xargs -0 cat 9 plum
3 banana 10 apple 1 apple 2 pear 3 banana grapes
Observe que ahora los datos de salida se canalizan desde find hasta xargs. El punto y coma
delimitado al final del comando no resulta necesario; de manera predeterminada, xargs anexa los
argumentos a la cadena de comandos. Sin embargo, parece haber siete lneas de salida, y no las cuatro
esperadas. Qu sali mal?
Otra vez find
Es posible usar el comando wc para comprobar que hay solamente cuatro lneas de salida en los dos
archivos que se pensaba imprimir. Este problema radica en que find busca en el directorio de copia
de seguridad y tambin encuentra backup/text1.bkp.2, que coincide con nuestro patrn de comodines.
Para solucionar esta cuestin, se utiliza la opcin -maxdepth de find, que restringe la bsqueda
a la profundidad de un solo directorio, el actual. Adems, con la opcin -mindepth
correspondiente, es posible especificar en gran medida la ubicacin de la bsqueda. El listado 79
ejemplifica la solucin final.
Listado 79. Restriccin de find a las cuatro lneas deseadas
[ian@echidna lpi103]$ ls text*2
text2 text sample2
[ian@echidna lpi103]$ wc text*2
3
6
25 text2
1
1
7 text sample2
4
7
32 total
[ian@echidna lpi103]$ find . -name "text*2" -maxdepth 1 -print0 |xargs -0 cat
9
plum
3
banana
10
apple
grapes
Ms sobre xargs
Existen otras diferencias entre xargs y find -exec.
De manera predeterminada, el comando xargs le pasa al comando tantos argumentos como
fuera posible. Es posible limitar el nmero de lneas de entrada que se usarn con -l
max-lines y un nmero. Otra alternativa consiste en usar -nomax-args para
limitar el nmero de argumentos pasados, o bien -s o max-chars para limitar el nmero
mximo de caracteres que se utilizan en la cadena de argumentos. Si el comando puede procesar
mltiples argumentos, generalmente conviene procesar la mxima cantidad posible a la misma
vez.
Se puede usar '{}' del mismo modo que con find -exec si se especifica la opcin -i o
--replace. Es posible cambiar el valor predeterminado de '{}' de la cadena que indica
dnde se debe sustituir el parmetro de entrada especificando un valor para -i. Esto implica
-l.
Los ejemplos finales de xargs pueden verse en el listado 80.
Listado 80. Otros ejemplos de xargs
[ian@echidna lpi103]$ # pass all arguments at once
[ian@echidna lpi103]$ find . -name "text*2" |xargs echo
./text2 ./backup/text1.bkp.2 ./text sample2
[ian@echidna lpi103]$ # show the files we created earlier with the touch command
[ian@echidna lpi103]$ ls f[0-n]*|xargs echo
f1 f1a f2 f3 f4 f5 f6 f7 f8 f9
[ian@echidna lpi103]$ # remove them in one stroke
[ian@echidna lpi103]$ ls f[0-n]*|xargs rm
[ian@echidna lpi103]$ # Use a replace string
[ian@echidna lpi103]$ find . -name "text*2" |xargs -i echo - '{}' - ./text2 - ./backup/text1.bkp.2 - ./text sample2 [ian@echidna lpi103]$ # Limit of one input line per invocation
[ian@echidna lpi103]$ find . -name "text*2" |xargs -l1 echo
./text2
./backup/text1.bkp.2
./text sample2
[ian@echidna lpi103]$ # Limit of one argument per invocation
[ian@echidna lpi103]$ find . -name "text*2" |xargs -n1 echo
./text2
./backup/text1.bkp.2
./text
sample2
Observe que en este caso no se us -print0. Esto explica el ejemplo final del listado 80?
tail -fn1 para seguir los datos de salida en otra pantalla, es ms fcil usar el comando tee.
El comando tee se utiliza con una canalizacin. Los argumentos son un archivo (o mltiples
archivos) para datos de salida estndar. La opcin -a anexa en lugar de sobrescribir archivos. Como
se analiz anteriormente al discutir las canalizaciones, es necesario redirigir stderr hasta stdout antes de
canalizar hasta tee si se quiere guardar ambas opciones. El listado 81 muestra el uso deteepara
guardar los datos de salida en dos archivos, f1 y f2.
Listado 81. Divisin de stdout con tee
[ian@echidna lpi103]$ ls text[1-3]|tee f1 f2
text1
text2
text3
[ian@echidna lpi103]$ cat f1
text1
text2
text3
[ian@echidna lpi103]$ cat f2
text1
text2
text3
El reloj sigue estando en el escritorio, pero ha dejado de ejecutarse. Esto es precisamente lo que genera
una suspensin. De hecho, si se arrastra otra ventana sobre una parte del reloj, esa parte no se vuelve a
dibujar. Tambin se puede visualizar un mensaje de salida de terminal que indica "[1]+Stopped". El 1
representa un nmero de trabajo. El reloj se puede reiniciar escribiendo fg %1. Tambin es posible
usar el nombre del comando, o una parte de l, escribiendo fg%xclockofg%?clo. Finalmente, si
solamente se utiliza fg sin parmetros, es posible reiniciar el trabajo que se detuvo en ltimo lugar, el
trabajo 1 en este caso. Si se lo reinicia con fg, el trabajo pasar a primer plano, y ya no habr un shell
prompt. Es necesario colocar el trabajo ensegundo plano; el comando bg tiene el mismo tipo de
especificacin de trabajo que el comando fg y eso es precisamente lo que hace. El listado 84 muestra
cmo traer el trabajo de xclock al primer plano y suspenderlo usando dos formas del comando fg. Es
posible suspenderlo una vez ms y colocarlo en segundo plano; el reloj se sigue ejecutando mientras se
realiza otro trabajo en la terminal.
Listado 84. Colocacin de xclock en segundo plano
[ian@echidna ian]$ fg %1
xclock -d -update 1
[1]+ Stopped
[ian@echidna ian]$ fg %?clo
xclock -d -update 1
xclock -d -update 1
[1]+ Stopped
[ian@echidna ian]$ bg
[1]+ xclock -d -update 1 &
[ian@echidna ian]$
xclock -d -update 1
Uso de "&"
Habr observado que cuando se coloc el trabajo de xclock en segundo plano, el mensaje ya no deca
"Stopped" y terminaba con el smbolo et (&). En realidad, no es necesario suspender el proceso para
colocarlo en segundo plano. Al anexar el smbolo et al comando, el shell iniciar el comando (o lista de
comandos) en segundo plano. Usando este mtodo, iniciemos un reloj analgico con fondo color trigo
y agujas rojas.
Listado 85. Inicio de xclock en segundo plano con &
[ian@echidna ian]$ xclock -bg wheat -hd
red -update 1& [2] 5659
Observe que esta vez el mensaje es ligeramente diferente. Representa un nmero de trabajo y una id. de
proceso (PID). Ya analizaremos las PID y ms temas de estado ms adelante. Por ahora, usemos el
comandojobspara determinar qu trabajos se estn ejecutando. Agregue la opcin -l para listar las
PID, y notar que el trabajo 2 tiene la PID 5659, tal como se muestra en el listado 86. Observe adems
que el trabajo 2 tiene el smbolo ms (+) al lado del nmero de trabajo, lo que indica que este es el
trabajo actual. El trabajo pasar a primer plano si no se da ninguna especificacin con el comando fg.
Listado 86. Visualizacin de informacin de trabajos y procesos
[ian@echidna ian]$ jobs -l [1]4234 Running xclock -d -update 1 & [2]+ 5659 Running xclock -bg
wheat
-hd red -update 1 &
Antes de abordar otras cuestiones relativas a los trabajos de segundo plano, creemos un reloj digital
alternativo. Use el comando sleep para generar un retraso de dos segundos y use el comando
date para imprimir la fecha y la hora actuales. Ajuste estos comandos en un bucle while con un
bloque do/done para crear un bucle infinito. Por ltimo, encierre todos estos elementos entre
parntesis para formar una lista de comandos y coloque toda la lista en segundo plano usando el
smbolo et.
Listado 87. Reloj digital alternativo
[ian@echidna ian]$ (while sleep 2; do date;done) &
[1] 16291
[ian@echidna ian]$ Thu Nov 10 22:58:02 EST 2005
Thu Nov 10 22:58:04 EST 2005
Thu Nov 10 22:58:06 EST 2005
Thu Nov 10 22:58:08 EST 2005
Thu Nov 10 22:58:10 EST 2005
Thu Nov 10 22:58:12 EST 2005
Thu Nov 10 22:58:14 EST 2005
fg
( while sleep 2; do
date;
done )
Thu Nov 10 22:58:16 EST 2005
Thu Nov 10 22:58:18 EST 2005
Tal como se esperaba, la lista se ejecuta como trabajo 1 con PID 16291. Cada dos segundos se ejecuta
el comando date y se imprimen en la terminal una fecha y una hora determinadas. Los datos de entrada
que se ingresen sern resaltados. Si usted es lento para escribir, los caracteres quedarn intercalados
entre las lneas de salida hasta que logre escribir el comando completo. Observe que la "f" y la "g" que
escribimos para traer la lista de comandos a primer plano estn separadas. Cuando, finalmente,
ingresamos el comando fg, bash muestra el comando que se est ejecutando en el shell, es decir, la
lista de comandos, que felizmente sigue imprimiendo la hora cada dos segundos.
Una vez que se logra colocar el trabajo en primer plano, es posible finalizarlo (o eliminarlo), o bien
realizar otra accin. En este caso, usamos Ctrl-c para finalizar nuestro "reloj".
E/S estndar y procesos de segundo plano
En el ejemplo anterior, los datos de salida del comando date estn intercalados entre los caracteres
repetidos del comando fg que pretendamos escribir. Esto plantea una cuestin interesante. Qu
sucede si un proceso requiere datos de entrada de stdin?
El proceso de terminal con el cual se inicia una aplicacin de segundo plano se llama terminal de
control. Salvo que sean redirigidos hacia otro lugar, los flujos stdout y stderr del proceso de segundo
plano se dirigen a la terminal de control. De esta manera, la tarea de segundo plano espera datos de
entrada de la terminal de control, pero esta no puede dirigir los caracteres que se escriben al flujo stdin
de un proceso de segundo plano. En ese caso, el Bash shell suspende el proceso, que deja de ejecutarse.
Es posible traerlo a primer plano y proporcionar los datos de entrada necesarios. El listado 88
ejemplifica un sencillo caso en donde se puede colocar una lista de comandos en segundo plano.
Despus de un instante, presione Entrar y el proceso se detendr. Trigalo a primer plano y
proporcione una lnea de entrada seguida de Ctrl-d para sealar el fin del archivo de entrada. De esta
manera, se completa la lista de comandos y se visualiza el archivo creado.
Listado 88. En espera de stdin
[ian@echidna ian]$ (date; cat - >bginput.txt; date)&
[1] 18648
[ian@echidna ian]$ Fri Nov 11 00:03:28 EST 2005
[1]+ Stopped
( date; cat - >bginput.txt; date )
[ian@echidna ian]$ fg
( date; cat - >ginput.txt; date )
input data
Fri Nov 11 00:03:53 EST 2005
[ian@echidna ian]$ cat bginput.txt
input data
originndolos o usando el comando sh o bash. El listado 89 muestra como podramos hacer esto
con el reloj digital alternativo. No es necesario decir que tener la hora escrita en un archivo no es de
gran utilidad; el archivo seguir creciendo. Por eso, debemos establecer que el reloj se actualice cada
30 segundos, y no una vez por segundo.
Listado 89. Uso de nohup con una lista de comandos en un script
[ian@echidna ian]$ echo "while sleep 30; do date;done">pmc.sh
[ian@echidna ian]$ nohup . pmc.sh&
[1] 21700
[ian@echidna ian]$ nohup: appending output to `nohup.out'
[1]+ Exit 126
nohup . pmc.sh
[ian@echidna ian]$ nohup sh pmc.sh&
[1] 21709
[ian@echidna ian]$ nohup: appending output to `nohup.out'
[ian@echidna ian]$ nohup bash pmc.sh&
[2] 21719
[ian@echidna ian]$ nohup: appending output to `nohup.out'
Al visualizar el contenido de nohup.out, observamos que la primera lnea indica por qu aparece el
cdigo de salida 126 en el primer intento. Las siguientes lneas representan los datos de salida de las
dos versiones de pmc.sh que se ejecutan en segundo plano. Esto queda ilustrado en el listado 90.
Listado 90. Datos de salida de los procesos nohup
[ian@echidna ian]$ cat nohup.out
/bin/nice: .: Permission denied
Fri Nov 11 15:30:03 EST 2005
Fri Nov 11 15:30:15 EST 2005
Fri Nov 11 15:30:33 EST 2005
Fri Nov 11 15:30:45 EST 2005
Fri Nov 11 15:31:03 EST 2005
Ahora dirijamos nuestra atencin al estado de los procesos. Si usted tiene planeado tomarse un
descanso a estas alturas, siga leyendo un poco ms, ya que hay dos trabajos que estn creando archivos
ms grandes en el sistema de archivos. Es posible usar el comando fg para traerlos a primer plano y
luego usar Ctrl-c para finalizarlos; sin embargo, si los deja en ejecucin, aprenderemos otras maneras
de supervisarlos e interactuar con ellos.
cero o ms PID como argumento y muestra el estado del proceso pertinente. Si el comando jobs se
usa con la opcin -p, los datos de salida representarn la PID del lder de grupo de procesos de cada
trabajo. Usaremos estos datos de salida como argumentos del comando ps, como se muestra en el
listado 91.
Listado 91. Estado de los procesos de segundo plano
[ian@echidna ian]$ jobs
[1]- Running
nohup sh pmc.sh &
[2]+ Running
nohup bash pmc.sh &
[ian@echidna ian]$ jobs -p
21709
21719
[ian@echidna ian]$ ps `jobs -p`
PID TTY
STAT
TIME COMMAND
21709 pts/3
SN
0:00 sh pmc.sh
21719 pts/3
SN
0:00 bash pmc.sh
Si usamos ps sin opciones, aparecer una lista de procesos que usan nuestra terminal como su
terminal de control, tal como se puede ver en el listado 92.
Listado 92. Visualizacin de estado con ps
[ian@echidna ian]$ ps
PID TTY
TIME CMD
20475 pts/3
00:00:00 bash
21709 pts/3
00:00:00 sh
21719 pts/3
00:00:00 bash
21922 pts/3
00:00:00 sleep
21930 pts/3
00:00:00 sleep
21937 pts/3
00:00:00 ps
Hay diversas opciones, como -f(full), -j(jobs) y -l(long), que controlan la cantidad de informacin
que se visualiza. Si no se especifica ninguna PID, otra opcin til es --forest, que muestra los
comandos en una jerarqua de rbol. De esta manera, se puede visualizar cul proceso tiene a cul otro
como proceso principal. En particular, observamos que los comandossleepdel listado anterior son
procesos secundarios de los scripts que ejecutamos en segundo plano. Si los comandos se ejecutaran en
un instante diferente, podramos ver el comando date listado en el estado de procesos, pero las
posibilidades son muy escasas con este script. En el listado 93 se pueden ver algunos ejemplos
pertinentes.
Listado 93. Informacin adicional de estado
[ian@echidna ian]$ ps
UID
PID PPID
ian
20475 20474
ian
21709 20475
ian
21719 20475
ian
21945 21709
ian
21953 21719
ian
21954 20475
-f
C STIME
0 15:02
0 15:29
0 15:29
0 15:34
0 15:34
0 15:34
TTY
pts/3
pts/3
pts/3
pts/3
pts/3
pts/3
TIME
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
CMD
-bash
sh pmc.sh
bash pmc.sh
sleep 30
sleep 30
ps -f
CMD
bash
sh
\_ sleep
bash
\_ sleep
ps
-af
C STIME
0 Nov10
0 Nov10
0 15:29
0 15:29
0 15:35
0 15:35
0 15:35
TTY
pts/0
pts/0
pts/3
pts/3
pts/3
pts/3
pts/3
TIME
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
CMD
xclock -d -update 1
xclock -bg wheat -hd red -update
sh pmc.sh
bash pmc.sh
sleep 30
sleep 30
ps -af
Observe que este listado incluye los dos procesos xclock iniciados desde la terminal grfica principal
de este sistema (pts/0); los otros procesos que se muestran estn asociados a una conexin ssh (Secure
Shell) (pts/3 en este caso).
Existen muchas ms opciones para ps, como algunas que proporcionan un control significativo sobre
los campos que se visualizan y la manera en que se visualizan. Otras opciones proporcionan control
sobre la seleccin de procesos para visualizar, por ejemplo, mediante la seleccin de esos procesos para
un usuario determinado. Consulte las pginas man depspara obtener ms informacin, o lea un breve
resumen usando ps --help.
top
Si usted ejecuta ps varias veces seguidas para ver los cambios que se producen, probablemente
necesitar el comando top. Este comando muestra una lista de procesos permanentemente
actualizada, adems de tiles resmenes. Consulte las pginas man de top para obtener informacin
detallada acerca de las opciones, como la manera de ordenar segn el uso de memoria u otros criterios.
El listado 95 muestra las primeras lneas de una visualizacin de top.
Listado 95. Visualizacin de otros procesos
3:37pm up 46 days, 5:11, 2 users, load average: 0.01, 0.17, 0.19
96 processes: 94 sleeping, 1 running, 0 zombie, 1 stopped
USER
ian
root
root
root
root
root
PRI
17
8
9
9
19
9
NI
0
0
0
0
19
0
0.9% idle
0K shrd,
TIME
0:00
0:04
0:00
0:00
0:00
0:00
119428K buff
355156K cached
COMMAND
top
init
keventd
kapmd
ksoftirqd_CPU0
kswapd
Seales
Observemos ahora las seales Linux, que constituyen una forma asincrnica de comunicarse con los
procesos. Ya hemos mencionado la seal SIGHUP y hemos usado tanto Ctrl-c como Ctrl-z, que
representan otra manera de enviar una seal a los procesos. La manera ms habitual de enviar una seal
es a travs del comando kill.
Envo de seales con kill
El comando kill enva una seal a un determinado trabajo o proceso. El listado 96 muestra el uso
de las seales SIGTSTP y SIGCONT para detener y reanudar un trabajo de segundo plano. Usar la
seal SIGTSTP es equivalente a usar el comando fg para traer el trabajo a primer plano y luego Ctrlz para suspenderlo. El uso de SIGCONT es similar al uso del comando bg.
Listado 96. Detencin y reinicio de trabajos de segundo plano
[ian@echidna ian]$
[ian@echidna ian]$
[1]+ 21709 Stopped
[2]- 21719 Running
[ian@echidna ian]$
[ian@echidna ian]$
[1]+ 21709 Running
[2]- 21719 Running
kill -s SIGTSTP %1
jobs -l
nohup
nohup
kill -s SIGCONT %1
jobs -l
nohup
nohup
sh pmc.sh
bash pmc.sh &
sh pmc.sh &
bash pmc.sh &
En este ejemplo se us la especificacin de trabajo (%1), pero tambin es posible enviar seales a una
id. de proceso (como 21709, que es la PID del trabajo %1). Si se usa el comandotailmientras el
trabajo %1 est detenido, solamente un proceso actualizar el archivo nohup.out.
Existen otras seales que se pueden visualizar en el sistema usando kill -l. Algunas se usan para
notificar errores tales como cdigos de operacin ilegales, excepciones de punto flotante o intentos de
acceder a una memoria a la que el proceso no tiene acceso. Tenga en cuenta que las seales tienen un
nmero, como p. ej., 20, y un nombre, como SIGTSTP. Es posible usar tanto el nmero como el
nombre con la opcin -s. Se aconseja comprobar los nmeros de las seales en el sistema antes de
asumir que un determinado nmero corresponde a una determinada seal.
Los controladores de seales le otorgan al proceso una gran flexibilidad en el sentido de que un proceso
puede realizar su trabajo normal y ser interrumpido por una seal por algn motivo particular. Adems
de permitir que los procesos capturen solicitudes de terminacin y realicen una determinada accin,
como cerrar archivos o establecer puntos de comprobacin de las transacciones en curso, las seales se
suelen utilizar para ordenarle a un proceso daemon que vuelva a leer su archivo de configuracin y,
posiblemente, que reinicie la operacin. Esto se puede hacer con el proceso inetd, cuando se cargan los
parmetros de red, o con line printer daemon (lpd), cuando se agrega una nueva impresora.
Terminacin incondicional de procesos
Algunas seales no pueden ser capturadas, como es el caso de ciertas excepciones de hardware.
SIGKILL, la seal que ms probablemente se usar, no puede ser capturada por un controlador de
seales y termina los procesos incondicionalmente. Por lo general, se aconseja utilizar esta opcin
nicamente si fallaron todos los dems mtodos de terminacin de procesos.
Cierre de sesin y nohup
Ya hemos dicho que el uso de nohup permite que los procesos se sigan ejecutando despus de cerrar
sesin. Bueno, hagamos eso y luego volvamos a iniciar sesin. Una vez iniciada la sesin,
verifiquemos el proceso del reloj alternativo usando jobs y ps como se hizo anteriormente. Los
datos de salida se muestran en el listado 98.
Listado 98. Nuevo inicio de sesin
Como se puede observar, esta vez la ejecucin es en pts/4, si bien no hay signos de nuestros trabajos,
solamente el comandopsy los dos procesos xclock iniciados desde la terminal grfica (pts/0). Tal vez
no es lo que esperbamos. Sin embargo, no est todo perdido. En el listado 99 se muestra una forma de
encontrar el trabajo perdido usando la opcin-spara id. de sesin, junto con la id. de sesin de 20475
que vimos en el listado 93. De qu otra forma se los habra podido encontrar si la id. de sesin no
hubiera estado disponible?
Listado 99. Nuevo inicio de sesin
[ian@echidna ian]$ ps -js 20475 PID PGID SID TTY TIME CMD
21719 21719 20475 ? 00:00:00 bash 27335 21719 20475 ? 00:00:00
sleep
Con todo lo que hemos aprendido sobre la eliminacin de procesos, usted debera poder eliminar estos
procesos usando su PID y el comandokill.
Si usted ejecuta el script en su sistema, es posible que los datos de salida sean similares a los del listado
101. Este script usa grandes cantidades de CPU, como se ver a continuacin. Si no est trabajando en
su estacin de trabajo, asegrese de que no haya ningn problema en usar grandes cantidades de CPU
antes de ejecutar el script.
Listado 101. Ejecucin de count1.sh
[ian@echidna
A Mon Nov 14
A Mon Nov 14
[ian@echidna
A Mon Nov 14
A Mon Nov 14
ian]$ sh
07:14:04
07:14:05
ian]$ sh
07:14:26
07:14:32
count1.sh 10000 A
EST 2005
EST 2005
count1.sh 99000 A
EST 2005
EST 2005
Hasta aqu no hay ningn problema. Ahora apliquemos algunas de las cosas que aprendimos en este
tutorial para crear una lista de comandos a fin de ejecutar el script en segundo plano e iniciar el
comando top para verificar qu cantidad de CPU usa el script. La lista de comandos se muestra en el
listado 102 y los datos de salida detop, en el listado 103.
Listado 102. Ejecucin de count1.sh y top
[ian@echidna ian]$ (sh count1.sh 99000 A&);top
PRI
20
NI
0
TIME COMMAND
0:01 sh
ian]$ nice
ian]$
PID
7283
9578
ps -l
PPID C PRI
7282 0 70
7283 0 72
NI ADDR
0
0
-
SZ WCHAN
1103 wait4
784 -
TTY
pts/2
pts/2
TIME CMD
00:00:00 bash
00:00:00 ps
El comando nice tambin se puede usar para iniciar un proceso con una prioridad diferente. Use la
opcin -n o (--adjustment) con un valor positivo para aumentar el valor de la prioridad y con un
valor negativo para disminuirlo. Tenga en cuenta que los procesos con el valor de prioridad ms bajo se
ejecutan con la prioridad de programacin ms alta. Por eso, considere el incremento del valor de
prioridad como una manera de ser amable con los otros procesos. Tenga presente que, por lo general, es
necesario ser un superusuario (root) para especificar ajustes de prioridad negativos. En otras palabras,
los usuarios regulares nicamente pueden hacer que sus procesos sean ms amables. En el listado 105,
se ejecutaron dos copias del script count1.sh en segundo plano con diferentes prioridades de
programacin. Observe que hay un intervalo de unos 5 segundos entre los tiempos de finalizacin.
Experimente con diferentes valores amables, o ejecutando el primer proceso con un ajuste de prioridad
en vez del segundo para comprobar las diferentes posibilidades.
Listado 105. Uso de nice para establecer prioridades
[ian@echidna ian]$ (sh count1.sh 99000 A&);\
> (nice -n 19 sh count1.sh 99000 B&);\
> sleep 2;ps -l;sleep 20
B Mon Nov 14 08:17:36 EST 2005
A Mon Nov 14 08:17:36 EST 2005
F S
UID
PID PPID C PRI NI ADDR
SZ
000 S
500 7283 7282 0 70
0
- 1104
000 R
500 10765
1 84 80
0
- 1033
000 R
500 10767
1 14 79 19
- 1033
000 R
500 10771 7283 0 72
0
784
A Mon Nov 14 08:17:43 EST 2005
B Mon Nov 14 08:17:48 EST 2005
WCHAN
wait4
-
TTY
pts/2
pts/2
pts/2
pts/2
TIME
00:00:00
00:00:01
00:00:00
00:00:00
CMD
bash
sh
sh
ps
Observe que, al igual que con el comando nohup, no es posible usar una lista de comandos o una
canalizacin como argumento de nice.
Cambio de prioridades
renice
Si, al iniciar un proceso, usted advierte que ese proceso debera ejecutarse con una prioridad diferente,
existe una manera de cambiarlo una vez iniciado, usando el comando renice. Se especifica una
prioridad absoluta (no un ajuste) para que el o los procesos cambien como se indica en el listado 106.
Listado 106. Uso de renice para cambiar prioridades
[ian@echidna ian]$ sh count1.sh 299000 A&
[1] 11322
[ian@echidna ian]$ A Mon Nov 14 08:30:29 EST 2005
[ian@echidna ian]$ renice +1 11322;ps -l
11322: old priority 0, new priority 1
F S
UID
PID PPID C PRI NI ADDR
SZ
000 S
500 7283 7282 0 75
0
- 1104
000 R
500 11322 7283 96 77
1
- 1032
000 R
500 11331 7283 0 76
0
786
[ian@echidna ian]$ renice +3 11322;ps -l
11322: old priority 1, new priority 3
F S
UID
PID PPID C PRI NI ADDR
SZ
000 S
500 7283 7282 0 75
0
- 1104
WCHAN
wait4
-
TTY
pts/2
pts/2
pts/2
TIME
00:00:00
00:00:11
00:00:00
CMD
bash
sh
ps
WCHAN
wait4
TTY
pts/2
TIME CMD
00:00:00 bash
000 R
000 R
500 11322
500 11339
7283 93
7283 0
76
76
3
0
1032 785 -
pts/2
pts/2
00:00:16 sh
00:00:00 ps
Usted puede encontrar mayor informacin en nice y en renice en las pginas man.
Concatenacin
Al concatenar dos expresiones regulares se crea una expresin ms larga. Por ejemplo, la
expresin regular a se corresponder con la cadena abcdcba dos veces (en la primera y en la
ltima a) y lo mismo ocurrir con la expresin regular b. Sin embargo, ab slo se corresponder
con ab cdcba, mientras que ba slo se corresponder con abcdc ba.
Repeticin
El operador de repeticin o el * Kleene se corresponder con cero o ms ocurrencias de la
expresin regular anterior. Por lo tanto, una expresin regular como a*b se corresponder con
cualquier cadena de a terminada en b, incluyendo slo a b en s misma. No es necesario escapar
el * Kleene. Por lo tanto, aquellas expresiones en las que usted desee que exista correspondencia
con un asterisco literal (*) debern tener el asterisco escapado.
Alternacin
El operador de alternacin (|) se corresponde con la expresin anterior o siguiente. Se lo debe
escapar en una sintaxis bsica. Por ejemplo, la expresin a*\|b*c se corresponder con una
cadena que contenga cualquier cantidad de letras a o cualquier cantidad de letras b (pero no
ambas) terminadas por una sola c. Una vez ms, el carcter nico c mostrar una
correspondencia.
Generalmente, usted deber citar sus expresiones regulares para evitar la expansin de shell.
Usaremos los archivos de texto que creamos con anterioridad en el directorio lpi103 a modo de
ejemplo. Estudie los ejemplos simples que figuran en el Listado 107. Tenga en cuenta quegreptoma
una expresin regular como un parmetro requerido y una lista de cero o ms archivos para buscar. Si
no aparece ningn archivo, grep busca stdin, lo que lo transforma en un filtro que se puede usar en
canalizaciones. Si no hay correspondencia entre ninguna lnea, no se producen datos de salida desde
grep, aunque su cdigo de salida se puede probar.
Listado 107. Expresiones regulares simples
[ian@echidna
1 apple
2 pear
[ian@echidna
2 pear
[ian@echidna
1 apple
2 pear
3 banana
[ian@echidna
1 apple
2 pear
[ian@echidna
[ian@echidna
1 apple
2 pear
3 banana
[ian@echidna
1 apple
3 banana
[ian@echidna
* here
Como puede observar en estos ejemplos, a veces usted puede obtener resultados sorprendentes,
especialmente con repeticin. Usted podra haber esperado que p* o al menos pp* se correspondiesen
con un par de letras p, pero p* y x* tambin se corresponden con todas las lneas del archivo porque el
operador * se corresponde con cero o ms de las expresiones regulares anteriores.
Primeros atajos
Ahora que ya conoce los bloques de construccin bsicos de las expresiones regulares, analicemos
algunos atajos que le resultarn convenientes.
+
El operador + es como el operador *, excepto porque se corresponde con una o ms ocurrencias
de la expresin regular anterior. Se lo debe escapar en el caso de las expresiones regulares.
?
El ? indica que la expresin anterior es opcional. Por lo tanto, representa cero o una ocurrencia de
ella. Esto no es lo mismo que el ? usado en globbing.
.
El . (punto) es un metacarcter que representa a cualquier carcter. Uno de los parmetros ms
usados es .*, que se corresponde con una cadena de longitud arbitraria que contiene cualquier
cantidad de caracteres (o ningn carcter). No es necesario aclarar que usted ver que esto se usa
como parte de una expresin ms larga. Compare un nico punto con el ? que se usa en globbing
y .* con el * que se usa en globbing.
Listado 108. Ms expresiones regulares
[ian@echidna
1 apple
[ian@echidna
1 apple
2 pear
[ian@echidna
1 apple
2 pear
[ian@echidna
2 pear
[ian@echidna
1 apple
3 banana
Expresiones ms complejas
Hasta ahora, hemos visto a la repeticin aplicada a un slo carcter. Si desease buscar una o ms
ocurrencias de una cadena con mltiples caracteres como la an que ocurre dos veces en banana, use
parntesis (los que se debern escapar en sintaxis bsica). De manera similar, es posible que usted
desee buscar algunos caracteres, sin usar algo tan general como el . o algo tan detallado como la
alternacin. Tambin es posible hacer esto encerrando las alternativas entre corchetes ([]), los que no
necesariamente se deben escapar con una sintaxis regular. Las expresiones entre corchetes constituyen
una clase de carcter. Salvo por las pocas excepciones que se discuten ms adelante, el uso de
corchetes tambin elimina la necesidad de escapar los caracteres especiales como . y *.
Listado 109. Parntesis y clases de carcter
[ian@echidna
3 banana
[ian@echidna
3 banana
[ian@echidna
1 apple
2 pear
3 banana
[ian@echidna
* here
somewhere.
Segn los significados especiales que figuran con anterioridad, si desea lograr la correspondencia con
un - (guin) literal entre una clase de carcter, usted debe ponerlo en primer o en ltimo lugar. Si desea
lograr la correspondencia con un ^ (caret) literal, no debe ser el primer carcter. Adems, un ] (corchete
derecho) cierra la clase, a menos que se lo coloque en primer lugar.
Las clases de carcter son un rea en la que las expresiones regulares y globbing son similares, aunque
la negacin difiere (^ vs. !). El Listado 108 le muestra algunos ejemplos de las clases de carcter.
Listado 110. Ms clases de carcter
[ian@echidna
[ian@echidna
123
456
789
[ian@echidna
[ian@echidna
1 apple
versiones anteriores de sed no soportan las expresiones regulares extendidas. Si su versin de sed
soporta las regexps extendidas, use la opcin-rpara indicarle asedque usted est usando sintaxis
extendida. El Listado 112 le muestra un ejemplo que se us con anterioridad en esta seccin junto con
la expresin extendida correspondiente usada con egrep.
Listado 112. Expresiones regulares extendidas
[ian@echidna lpi103]$ grep "an\(an\)\+" text1 # find at least 2 an's
3 banana
[ian@echidna lpi103]$ egrep "an(an)+" text1 # find at least 2 an's
3 banana
plum *
-n banana text[1-4]
-c banana text[1-4]
-l pear *
El ejemplo final usafindpara encontrar todos los archivos regulares en el directorio actual y en sus
hijos y, luego de esto, usa xargs para transferir la lista de archivos a grep con el objetivo de
determinar la cantidad de ocurrencias de banana en cada archivo. Por ltimo, estos datos de salida se
filtran mediante otra invocacin de grep (esta vez con la opcin -v para buscar todos los archivos
Esta seccin slo ha analizado muy superficialmente todo lo que usted puede hacer con la lnea de
comandos de Linux y las expresiones regulares. Vea las pginas man para obtener mayor informacin
sobre estas valiossimas herramientas.
Modos de vi
El editor vi tiene dos modos de operacin:
Modo comando
En el modo comando, usted accede al archivo y realiza todas las operaciones de edicin (como,
3. Los comandos : tienen formas ms larga (:quit, :write, :edit), pero no se las suele usar con
frecuencia.
Navegacin
Los siguientes comandos lo ayudarn a navegar por el archivo:
h
Desplazarse un carcter hacia la izquierda en la lnea actual.
j
Pasar a la siguiente lnea.
k
Volver a la lnea anterior.
l
Desplazarse un carcter hacia la derecha en la lnea actual.
w
Pasar a la siguiente palabra en la lnea actual.
e
Pasar al siguiente fin de palabra en la lnea actual.
b
Pasar al comienzo de palabra anterior en la lnea actual.
Ctrl-f
Avanzar una pgina.
Ctrl-b
Retroceder una pgina.
Si ingresa un nmero antes de cualquiera de estos comandos, el comando se ejecutar las veces que
indique dicho nmero. A este nmero se lo denomina cantidad de repeticiones o simplemente cantidad.
Por ejemplo, 5h desplazar el cursor cinco caracteres hacia la izquierda. Usted puede usar las
cantidades de repeticiones con muchos comandos de vi.
Cmo pasar a las lneas especficas de su archivo?
Los siguientes comandos lo ayudarn a pasar a las lneas especficas de su archivo:
G
Lo lleva a una lnea especfica de su archivo. Por ejemplo, 3G lo lleva a la lnea 3. Si no se
ingresa ningn parmetro, G lo lleva a la ltima lnea del archivo.
H
Lo transporta en relacin a la lnea superior de la pantalla. Por ejemplo, 3H lo transporta a la
tercera lnea debajo de la primera lnea de su pantalla.
L
Es como H, excepto porque el desplazamiento es en relacin a la ltima lnea de la pantalla. Por
lo tanto, 2L lo lleva a la segunda lnea anterior a la ltima lnea de su pantalla.
Bsqueda
Usted puede buscar textos en su archivo usando expresiones regulares:
/
Use / seguida por una expresin regular para buscar en lo que sigue de su archivo.
?
Use ? seguido por una expresin regular para buscar en lo que antecede de su archivo.
n
Use n para repetir la ltima bsqueda en cualquiera de las dos direcciones ya mencionadas.
Usted puede colocar un nmero antes de cualquiera de los comandos que se mencionan con
anterioridad para indicar la cantidad de repeticiones. Por lo tanto, 3/x buscar la tercer ocurrencia de x
desde el punto actual, de la misma forma que lo har /x seguida por 2n.
Modificacin de textos
Use los siguientes comandos si necesita insertar, borrar o modificar textos:
i
Ingrese al modo insertar antes del carcter en la posicin actual. Ingrese su texto y presione Esc
para volver al modo comando. Use I para insertar texto al comienzo de la lnea actual.
a
Ingrese al modo insertar luego del carcter en la posicin actual. Ingrese su texto y presione Esc
para volver al modo comando. Use A para insertar texto al final de la lnea actual.
c
Use c para modificar el carcter actual e ingrese al modo insertar para ingresar los caracteres de
reemplazo.
o
Abra una lnea nueva para insertar texto debajo de la lnea actual. Use O para abrir una lnea
arriba de la lnea actual.
cw
Borre el resto de la palabra actual e ingrese al modo insertar para reemplazarla. Use una cantidad
de repeticin para reemplazar varias palabras. Use c$ para reemplazar todo hasta el final de la
lnea.
dw
Igual que en cw (y en c$), excepto porque no se ingresa al modo insertar.
dd
Borre la lnea actual. Use una cantidad de repeticin para borrar varias lneas.
x
Borre el carcter donde se encuentra el cursor. Use una cantidad de repeticin para borrar varios
caracteres.
p
Coloque el ltimo texto borrado luego del carcter actual. Use P para colocarlo antes del carcter
actual.
xp
Esta combinacin de x y p resulta muy til. Esto reemplaza el carcter donde se encuentra el
cursor por el que se encuentra a su derecha.
En resumen
Nos embarcamos en la tarea de agregar una lnea a nuestro archivo count1.sh. Para conservar el
original y guardar la versin modificada como count2.sh, podramos usar estos comandos vi una vez
que abramos el archivo con vi. Tenga en cuenta que <Esc> significa presionar la tecla Esc.
Listado 116. Comandos del editor para agregar una lnea a count1.sh
1GOsleep 20<Esc> :w! count2.sh
:q