¿Se puede canalizar la salida de un comando a otros dos comandos?

Respuestas:

56

Parece que el teecomando hará lo que quieras.

La clave es usar

>( )

para la sustitución de procesos . Con tee, use el siguiente patrón:

tee >(proc1) >(proc2) >(proc3) | proc4

Entonces, si desea utilizar la salida de lscomo entrada para dos grepprogramas diferentes , guarde la salida de cada uno grepen diferentes archivos y canalice todos los resultados less, intente:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Los resultados de la ls -Ase "canalizarán" en ambos greps. El archivo hidden-filestendrá el contenido de la salida del primero grepy normal-filestendrá los resultados del segundo grep. Todos los archivos se mostrarán en el buscapersonas less. EDITAR : lo que ves lesses el mismo resultado exacto de ls -A, no el resultado del greps. Si desea modificar la salida de ls -Aa less(por ejemplo, intercambiando el orden para que los archivos normales se enumeren antes que los ocultos), intente esto:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Sin >/dev/null, la salida de greps se agregaría a la salida de en ls -Alugar de reemplazarla.

fuente

Ben
fuente
3
Esta es muy buena !
hayalci
3
+1 porque incluso después de 10 años de secuencias de comandos de shell, ¡nunca había visto esto!
jtimberman
6

Use "tee".

Ejemplo:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Esto enviará la salida del comando grep tanto al terminal como a wc (cuya salida se redirige a su vez al archivo grepresult).

"Tee" se explica en el artículo de Wikipedia tee (comando) . Central es: "El comando tee lee la entrada estándar, luego escribe su contenido en la salida estándar y simultáneamente lo copia en los archivos o variables especificados".

Peter Mortensen
fuente