#4sysadmins

Inicio » Redirecciones y canalizadores

Redirecciones y canalizadores

> : Redirige la salida estándar a un archivo. Lo crea nuevo.

$echo “Crear archivo con este texto” > nuevo_archivo.txt

>> : Redirige la salida estándar a un archivo añadiendo la nueva info, al contenido ya existente.

$echo -e “\nAñade esto al texto anterior” >> nuevo_archivo.txt

2> : Crea un archivo que contiene el error estándar. Si el archivo existe, se sobrescribe.

$cat /home/nebul4ck/archvo.txt 2> ./stderr.txt

Nota: Suponemos que archivo.txt esta mal escrito, entonces no será encontrado, por lo que debería de mostrar algo como: cat: archvo.txt: No existe el archivo o el directorio, pero no es así ya que esto se encuentra ahora dentro del archivo stderr.txt

Truco: Podemos enviar los errores estándar a “ningún sitio” así:

$comando 2> /dev/null

2>> : Añade el error estándar al archivo existente

Con el caracter & podemos redirigir salidas de un tipo hacia otras, por ejemplo el uso mas básico es &> archivo que crea un archivo nuevo que contiene tanto la salida estándar como el error estándar. Si el archivo existe, se sobrescribe. Otro ejemplo algo mas complejo es 2&>1 archivo que redirige la salida de error hacia la salida estándar.

< : Envía el contenido del archivo especificado, para utilizarlo como entrada estándar.

<< : Acepta el texto de las lineas siguientes como entrada. Se inicia y finaliza el texto utilizando la misma palabra.

$echo << PATRON
> Este texto se mostrará por pantalla
> y finalizará cuando yo vuelva a escribir
> PATRON

<> : Utiliza el mismo archivo tanto para la entrada como para la salida.

Tee: Es la herramienta de redirección definitiva, divide la entrada estándar para que se muestre tanto por la salida estándar y en tantos archivos como especifiquemos.

$ls -lt /home/nebul4ck/listado.txt | tee salida.txt

| : El uso de pipes es importantísimo si tratamos de usar la salida de un comando como la entrada de otro (concatenación de comandos).

$ps -ef | grep term
nebul4ck 2420 2035 0 dic16 ? 00:00:16 mate-terminal

xargs : Con xargs podemos generar líneas de comandos, es decir podemos pasar un comando que despliegue una serie de líneas y ejecutar un comando por cada una de ellas.

$find ./ -type f -name “*.txt” | xargs -d “\n” rm

Nota: El comando find nos mostrara tantas líneas como archivos.txt encuentre en el directorio y a través de | canalizaremos esa salida para que xargs analice cada una de sus líneas (esto se consigue usando la opción -d, indica que queremos usar como delimitador, en nuestro caso el salto de línea) aplicándole el comando pasado a xargs que es rm, es decir se eliminarán todos los archivos .txt de ese directorio.

exec : El comando exec además de ejecutar programas externos (que pueden ser ejecutados, incluso escribiendo unicamente el nombre del programa) posee una funcionalidad adicional, y es que el nuevo proceso reemplaza a la consola, es decir exec se hace con el ID de la shell en la que ha sido ejecutado en vez de abrir un nuevo proceso, de manera que cuando el comando termine su ejecución, la consola se cerrará. Un uso común de exec es junto con otros comandos formando una cadena de comandos o dentro de scripts.

$find . -type f -name "*sed" -exec rm {} \;

find se encarga de encontrar un(os) archivo(s) basado en unos criterios y entonces se ejecuta exec que a su vez llama a rm para que sustituya los archivos encontrados dentro de {} y los elimine. Esto se podría haber realizado de forma mas simple usando el metacaracter acento grave del shell, que devuelve el resultado de la ejecución de un programa, en este caso el resultado de find lo pasa como argumento a rm.

$rm `find . -type f -name “*sed”`

Otro uso que podemos hacer de exec es el siguiente:

exec &> /nombre/archivo

Si usamos esto dentro de un shell script, nos enviará la salida estándar y el error estándar de lo que se ejecute mediante ese script al archivo /nombre/archivo, «digamos que genera un log».

Nota: Veremos otros usos de exec en el Capítulo 9 «El entorno de Consola, Shell Scripts, el Correo Electrónico y uso básico de SQL» a la hora de saber como ejecutar un shell script o programa.


6 comentarios

  1. qromsat dice:

    Otro redirector de flujo es: <<<
    Este nos permite enviar el contenido de una cadena de palabras.
    Por ejemplo:
    $ tr a-z A-Z <<< "uno dos tres"
    UNO DOS TRES
    Que a diferencia del redirector << en este no hace falta introducir una palabra patrón al principio y al final del texto.

    Me gusta

  2. david dice:

    De verdad que muy agradecido por este gran aporte, me ha servido increíblemente… Un gran saludo!

    Me gusta

  3. david dice:

    Man gracias por este post, esta genial, de hecho lo explicas excelentemente. Ya llevo varios años usando linux, y aun me cuesta entender un poco el uso del comando xargs, pudieras capaz reforzar un poco con otros ejemplos practicos su funcionalidad. Gracias por adelantado!

    Me gusta

    • nebul4ck dice:

      La función principal de xargs es leer la entrada estándar y aplicar un comando sobre el objeto. Por defecto es un echo, por lo que si lo ejecutas sin mas:

      # ls -l | xargs

      Obtienes CASI lo mismo que si lo anulas, y digo casi, porque es un claro ejemplo para ver que verdaderamente está funcionando. Si aplicas el comando anterior sin «|xargs» comprobarás que la salida cambia. Si quieres obtener el mismo resultado deberías de aplicar un parámetro sobre xargs para que formatee la salida del echo, tal que así:

      # ls -l | xargs -0

      El parámetro -0 lo que ha hecho es entender que la entrada estándar (en este caso la salida del comando ls -l /) viene acompañada de espacios en blanco entre directorio y directorio, por eso cuando hacemos un ls -l vemos un directorio por línea (lo que hay entre los permisos, fechas, etc.. son tabulaciones), así él reconoce que existen distintas líneas y actúa en consecuencia.

      Otro ejemplo:

      # grep -o «/[a-zA-Z/]*» /home/miuser/MisDocs/proo/std.txt | xargs ls -l | grep «prueba.txt» | cut -d » » -f3 |sudo xargs userdel -r

      Aquí se busca mediante un patrón todos los posibles directorios que se nombran dentro del archivo /home/miuser/MisDocs/proo/std.txt y se aplica un «ls -l» a cada uno de ellos (aquí comprobarás bien el uso de xargs, ya que si lo quitas, tan solo te mostrará el contenido del directorio de trabajo). La idea es que en uno de estos directorios se encuentra un archivo cuyo usuario propietario queremos eliminar del sistema pero no estamos seguros (esto es por hacer algo….), entonces se intuye que el usuario a eliminar es propietario del archivo prueba.txt, si se localiza, se corta el nombre del usuario con cut y se vuelve a aplicar xargs de manera que se le aplica a esa línea de salida de cut (el nombre del usuario) y se utiliza con el comando userdel -r que lo eliminará de forma recursiva.

      espero que te haya aclarado un poco mas… créate necesidades y aplica comandos y así coges soltura.

      Saludos!!

      Me gusta

Deja un comentario, Gracias!