Está en la página 1de 7

103.4.

Flujos, tuberías, y redireccionamiento


de salida.

Peso en el examen de certificación: 4 puntos.


Objetivo: Redirigir flujos de datos y conectarlos con el fin de procesarlos eficientemente.
Redirigir la entrada estandar, salida estandar y salida de errores, canalizándo la salida de un
comando hacia la entrada de otro. Utilizar la salida de un comando como argumento de
entrada de otro, enviando el resultado hacia la salida estandar y a un fichero
simultaneamente.
Conceptos y áreas de conocimiento:
• Redireccionamiento de entrada estandar, salida estandar y salida de errores.
• Canalizar la salida de un comando hacia la entrada de otro comando.
• Utilizar la salida de un comando como argumentos de otro.
• Enviar los resultados de un comando hacia la salida estandar y un fichero.
Términos y utilidades
• tee
• xargs

103.4. Flujos, tuberías, y


redireccionamiento de salida.
El objetivo de este apartado es el de explicar las distintas formas de redireccionamiento de
salida existentes en LINUX. Redireccionar significa modificar la dirección de los datos de un
comando. El redirecionamiento de salida modifica en concreto la dirección de los
resultados de un comando.

Los flujos, la redirección, y los pipes son algunas de las herramientas más potentes de la
línea de comandos. Linux trata lo que entra y lo que sale de los programas como un flujo,
que es una entidad de datos que se pueden manipular. Generalmente, la entrada viene del
teclado y la salida va hacia la pantalla. No obstante, puede redirigir estos flujos de entrada
y salida para que vengan de otras fuentes (como ficheros) o se dirijan a éstas. De igual
manera, pueden canalizar (pipe) la salida de un programa hacia otro programa. Estos
recursos pueden suponer una magnifica herramienta de conexión entre varios programas.

103.4.1. Tipos de flujos.


Para empezar a entender el redireccionamiento y los pipes, primero debe conocer los
distintos tipos de flujos de entrada y salida, de entre los que destacan tres:

•Entrada estándar: Los programas aceptan la entrada de datos a través de la


entrada estándar, o stdin, que en la mayoría de los casos es la información que
llega al ordenador desde el teclado.
•Salida estándar: Los programas de modo texto envían a sus usuarios la mayoría
de los resultados a través de la salida estándar, o stdout,que se suele mostrar en
modo texto a pantalla completa o bien en una ventana GUI, como pueden
ser xterm (los programas que son totalmente GUI, como los procesadores de texto
GUI, no emplean la salida estándar para sus interacciones normales, aunque
pueden emplear la salida estándar para mostrar mensajes en el xterm desde el que
fueron iniciados, La salida de los GUI no se gestiona a través de un flujo de salida en
el sentido aquí descrito).

•Error estándar: Linux proporciona un segundo tipo de flujo de salida, conocido


como error estándar o stderr. Este flujo de salida está pensado para llevar
información de alta prioridad, como los mensajes de error.

Normalmente, los mensajes de error se envían al mismo dispositivo de salida que la salida
estándar, por lo que cuesta diferenciarlos, aunque algunos se pueden redirigir
independientemente, lo cual puede resultar muy útil. Por ejemplo, puede redirigir el error
estándar a un fichero a la par que la salida estándar se sigue mostrando en la pantalla, de
manera que puede interactuar con el programa y estudiar los mensajes de error mucho
más adelante.

Internamente, los programas tratan estos flujos como simples ficheros de datos; los abren,
leen los ficheros o escriben en ellos y los cierran cuando terminan. Dicho de otro modo, los
ficheros normales son flujos desde el punto de vista de los programas. Lo que ocurre es
que estos flujos son los que se utilizan para interactuar con los usuarios.

103.4.2. Redireccionamiento de salida.


Los símbolos de redireccionamiento de salida son los siguientes:

> Redirecciona la salida estándar, que es la pantalla. Al direccionar la salida a un


fichero, si éste existiera perdería la información que poseyera. Si el fichero no existe lo
crea.

Ejemplo: $ls >memorias/aeg.txt

Creamos el fichero aeg.txt en el directorio memorias del directorio activo, cuyo


contenido será la lista de ficheros del directorio activo.

>> Redirecciona la salida standard. En este caso si se redirecciona a un fichero y éste


ya existe. lo redireccionado se añada al final del fichero, sin borrar el contenido anterior.

Ejemplo: $ls / >>memorias/aeg.txt

Añade la lista de ficheros y directorios de la raíz al fichero aeg.txt del


directorio memorias del directorio activo. Si ejecutamos estos dos comandos en este
orden el contenido del fichero aeg.txt será la lista de ficheros y directorios del directorio
activo y después la lista de ficheros y directorios de la raíz.

2> Redirecciona el error estándar, que es la pantalla. Crea un nuevo fichero que
contiene el error estándar. Si el fichero existe lo sobrescribe.

Ejemplo: $cat texto.txt 2>aeg.txt

Creamos el fichero aeg.txt en el directorio activo, cuyo contenido será el error si el


fichero texto.txt no existe. Si el fichero texto.txt existe el fichero aeg.txt se crea vacío.
2>> Redirecciona el error estándar, que es la pantalla. Si el fichero existe añada el error
al fichero indicado, sino lo crea.

Ejemplo: $cat texto.txt 2>>aeg.txt

Añada el error al fichero aeg.txt en el directorio activo. Si el fichero texto.txt existe al


fichero aeg.txt no se le añadirá nada.

&> Redirecciona tanto la salida estándar como el error estándar. Si el fichero existe lo
sobrescribe

Ejemplo: $cat texto.txt &>aeg.txt

Creamos el fichero aeg.txt en el directorio activo, cuyo contenido será el error si el


fichero texto.txt no existe y el contenido del fichero texto.txt en caso de que exista.

NOTA: Un truco muy habitual es redirigir la salida estándar o el error estándar


hacia /dev/null. Este fichero es un dispositivo que no está conectado a nada; se utiliza para
deshacerse de datos.

Ejemplo: Suponiendo que no poseemos ningún fichero en el directorio activo,


ejecutaremos una serie de comandos y mostraremos las respuestas de los mismos y los
contenidos de los ficheros que se van creando o modificando.
$cat >aeg.txt
El contenido de este fichero son estas tres líneas
Segunda línea
Tercera línea
^d
$cat aeg.txt >nuevo.txt
$cat nuevo.txt
El contenido de este fichero son estas tres líneas
Segunda línea
Tercera línea
$cat aeg1.txt >nuevo.txt
cat: aeg1.txt: No existe el fichero o el directorio
$cat nuevo.txt
$cat aeg1.txt 2>nuevo.txt
$cat nuevo.txt
cat: aeg1.txt: No existe el fichero o el directorio
$cat aeg.txt 2>nuevo.txt
El contenido de este fichero son estas tres líneas
Segunda línea
Tercera línea
$cat nuevo.txt
$cat aeg.txt &>error
$cat error
El contenido de este fichero son estas tres líneas
Segunda línea
Tercera línea
$cat aeg1.txt &>error1
$cat error1
cat: aeg1.txt: No existe el fichero o el directorio
$
103.4.3. Tuberías.
Con frecuencia, los comandos pueden operar con la salida de otros comandos. Por
ejemplo, puede utilizar un comando de filtro de texto (como el egrep que se explica a
continuación) para que otro programa manipule la salida de texto (ordenar los datos
seleccionados anteriormente). Esto se puede hacer con la ayuda de los operadores de
redireccionamiento, enviando la salida estándar del primer comando (egrep) y ejecutar el
segundo programa (sort) tomando como dato el fichero creado anteriormente. Esta
solución es poco elegante, ya que conlleva la creación de ficheros que luego si no los
borramos pueden provocar desorden entre nuestros datos. La solución es el uso
de pipes de datos (o pipelines).

El pipeline |, es un tipo de redireccionamiento especial; con él se indica, que la salida


obtenida de un comando, sirve como entrada de datos a otro comando. Es decir, los datos
de salida los redireccionamos a otro comando.

Ejemplo:

La orden ls visualiza toda la información del directorio sin parar, por lo que algunas veces
no llegamos a ver el contenido de todo el directorio. Como la orden ls no posee ninguna
opción para paginar esta información, deberemos combinar la orden ls y la orden more,
(que es la que pagina), para ello escribiremos: $ ls | more

$egrep –i ‘donostia’ alumnos.txt | sort

Visualiza la lista de los alumnos que son de Donostia ordenados.

NOTA: Podemos utilizar el número de | que deseemos e incluso hacer que el resultado
final se almacene en un fichero.

$egrep –i ‘donostia’ alumnos.txt | cut -d: -f1,2 | sort >aeg.txt

103.4.4. Comandos más utilizados con


redireccionamientos.
Para elegir líneas de los ficheros utilizaremos el comando grep, egrep o fgrep.

COMANDO: grep, egrep, fgrep

FORMATO: grep [-opciones] cadena ficheros

FUNCIÓN: Visualiza las líneas de los ficheros indicados que contengan la cadena
indicada.

OPCIONES:

v Visualiza las líneas del fichero que no poseen la cadena indicada.


x Visualiza las líneas que poseen solo la cadena indicada.
w Visualiza las líneas que posee la cadena como palabra completa.
c Visualiza cuántas líneas posee la cadena a buscar.
n Visualiza además de las líneas que posee la cadena, el nº de la línea.
l Visualiza únicamente el nombre del fichero en caso de que la cadena exista en
dicho fichero.
h En caso de realizar la búsqueda en varios ficheros, no visualiza el nombre del
fichero delante de la línea que posee la cadena.
r Realiza una búsqueda en recursivo
yói No distingue entre mayúsculas y minúsculas.
f<fich> La cadena a buscar será el contenido del fichero indicado en <fich>.
e<exp> Se utiliza cuando se desea buscar una cadena que comience con "-" , para no
confundirlo con una opción.

Ejemplo: $ egrep ‘aeg’ ventas.txt

Hasta el momento la cadena a buscar era una cadena fija, es decir, buscábamos los
caracteres especificados. Pero con estos comandos también podemos buscar cadenas que
sean expresiones regulares.

La primera diferencia que existe entre estos 3 comandos es que fgrep, solo puede buscar
cadenas fijas, en cambio egrep y grep, pueden buscar expresiones regulares. En caso de
utilizar expresiones, es conveniente encerrar estas, entre apóstrofes (´).

Los caracteres, (metacaracteres), que podemos utilizar para definir una expresión regular
son los siguientes:

. Indica que en dicha posición puede existir cualquier carácter con uno de longitud.
^ Indica que la cadena se va a buscar al comienzo de la línea. Este carácter se coloca
antes de la cadena a buscar.
$ Indica que la cadena a buscar se encuentra al final de la línea. El $ se coloca
después de la cadena a buscar.
[] Dentro de los corchetes indicaremos:

Un rango de caracteres: buscará los caracteres correspondientes, a dicho rango.


Una lista de caracteres: buscará los caracteres correspondientes a dicha lista.
Si tras el corchete de abrir, "[", escribimos un circunflejo, "^", significa que buscará todos
los caracteres excepto los indicados o por el rango o por la lista de caracteres.

Si deseamos buscar varias cadenas en un fichero, utilizaremos el comando egrep, y para


separar las cadenas utilizamos el pipe , |, ó el <intro>.

En caso de utilizar <intro>, en la nueva línea se visualizará el símbolo <, que significa que
el comando no ha finalizado, en este momento teclearemos la 2ª cadena a buscar,
cerraremos el apóstrofe y escribiremos el nombre del fichero.

Ejemplo $ egrep ´^a´ aeg.txt


$ egrep ´a$´ aeg.txt
$ egrep ´F[0-4]´ aeg.txt
$ grep ´F[^0-4]´ aeg.txt
$ grep ´F.L´ aeg.txt
$ grep ´F[abc]´ aeg.txt

Para conseguir caracteres o campos de los ficheros utilizaremos el comando cut.

COMANDO: cut

FORMATO: cut [-opciones] ficheros

FUNCIÓN: Toma de los ficheros indicados, las columnas o los campos indicados.

OPCIONES:

c Tras esta opción, indicaremos los números de las columnas que queramos elegir. Los
números de las columnas se pueden indicar separándolos por comas ó grupos de
columnas separando las columnas mediante guiones. Cada carácter es una columna.
f Tras esta opción, indicaremos los números de campos, ( de forma similar a las
columnas ). Hay que tener en cuenta, que el separador de campo por defecto es el
tabulador.
d Tras esta opción indicaremos el carácter que deseamos sea el separador de campos.

Ejemplo: $ cut -c1,4,7-9 aeg.txt


Elige las columnas 1 y 4 y de la 7 a la 9. Sólo visualiza las columnas elegidas.

$ cut -f 1,2,7-9 aeg.txt


Elige los campos 1, 2 y del 7 al 9 ambos inclusive.

Para unir las líneas de varios ficheros utilizaremos el comando paste.

COMANDO: paste

FORMATO: paste [-opciones] fichero1 fichero2

FUNCIÓN: Visualiza 2 ó más ficheros lateralmente, es decir, coloca la 1ª línea


del fichero1 junto a la 1ª línea del fichero2. El elemento de unión es el tabulador.

OPCIONES:

d Tras la opción indicaremos un carácter, dicho carácter será la unión de los


ficheros.

Ejemplo: $ paste aeg11.txt aeg12.txt

$ paste -d* aeg11.txt aeg12.txt

Para conocer los caracteres, palabras y líneas de los ficheros utilizaremos el comando wc.

COMANDO: wc

FORMATO: wc [-opciones] ficheros

FUNCIÓN: Cuenta líneas, palabras y caracteres de los ficheros indicados.

OPCIONES:

l Cuenta el nº de líneas
w Cuenta el nº de palabras
c Cuenta el nº de caracteres

Si no indicamos las opciones, visualiza el nº de líneas, de palabras y de caracteres en este


orden. Al indicar las opciones, visualiza el nº de las opciones en el orden indicado.

Ejemplo: $ wc aeg.txt
Visualiza el nº de líneas, de palabras, y de caracteres del
fichero aeg.txt.

$ wc -c aeg.txt
Visualiza solo, el nº de caracteres del fichero aeg.txt

$ wc aeg1.txt aeg2.txt
Visualiza 3 líneas; en la primera línea, visualiza el nº de líneas, palabras
y caracteres del fichero aeg1.txt, en la 2ª línea la misma información pero del
fichero aeg2.txt, y en la 3ª línea el total de líneas, palabras y caracteres de los 2 ficheros.

Para ordenarlas líneas de los ficheros utilizaremos el comando sort.

COMANDO: sort
FORMATO: sort [-opciones] ficheros

FUNCIÓN: Ordenar el contenido de los ficheros indicados.

OPCIONES:

o Tras esta opción escribiremos el nombre del fichero en el cual se grabará el fichero
ordenado.
r Ordena de mayor a menor.
t Tras esta opción indicaremos el carácter que hemos considerado como separador
de campos. El separador de campos por defecto es el espacio.
g Trata los números como tales.
+n1 –n2 Si en lugar de tomar como campo a ordenar toda la línea, queremos hacerlo
por un campo en particular, tenemos que especificarlo indicando +n1 indica los campos a
saltar y -n2 indica a partir de que campo se ignora la línea.

Ejemplos: $sort aeg11.txt aeg12.txt


Ordena tomando los contenidos de los 2 ficheros y visualiza una única
salida común, es decir, no ordena primero el contenido del aeg11.txt y luego el contenido
del aeg12.txt.

$sort -r aeg.txt
Ordena de mayor a menor el contenido del fichero aeg.txt.

$sort +1 -3 aeg.txt
Ordena el contenido del fichero aeg.txt tomando para ordenar los campos
1 y 2 sabiendo que el separador de campos sea el espacio.

OPCIONES:

o Tras esta opción escribiremos el nombre del fichero en el cual se grabará el


fichero ordenado.

r Ordena de mayor a menor.

t Tras esta opción indicaremos el carácter que hemos considerado como


separador de campos. El separador de campos por defecto es el espacio.

g Trata los números como tales.

+n1 –n2 Si en lugar de tomar como campo a ordenar toda la línea, queremos hacerlo
por un campo en particular, tenemos que especificarlo indicando +n1 indica los campos a
saltar y -n2 indica a partir de que campo se ignora la línea.

Ejemplos: $sort aeg11.txt aeg12.txt

Ordena tomando los contenidos de los 2 ficheros y visualiza una única salida común, es
decir, no ordena primero el contenido del aeg11.txt y luego el contenido del aeg12.txt.

$sort -r aeg.txt

Ordena de mayor a menor el contenido del fichero aeg.txt.

$sort +1 -3 aeg.txt

Ordena el contenido del fichero aeg.txt tomando para ordenar los campos 1 y 2 sabiendo
que el separador de campos sea el espacio.

También podría gustarte