Solución 1:
Personalmente, mi favorito (requiere bash y otras cosas que son estándar en la mayoría de las distribuciones de Linux)
Los detalles pueden depender mucho del resultado de las dos cosas y de cómo desea fusionarlos...
Contenido de command1 y command2 uno tras otro en la salida:
cat <(command1) <(command2) > outputfile
O si ambos comandos generan versiones alternativas de los mismos datos que desea ver uno al lado del otro (he usado esto con snmpwalk; números en un lado y nombres MIB en el otro):
paste <(command1) <(command2) > outputfile
O si desea comparar la salida de dos comandos similares (por ejemplo, buscar en dos directorios diferentes)
diff <(command1) <(command2) > outputfile
O si son salidas ordenadas de algún tipo, combínelas:
sort -m <(command1) <(command2) > outputfile
O ejecute ambos comandos a la vez (aunque podría alterar un poco las cosas):
cat <(command1 & command2) > outputfile
El operador <() configura una canalización con nombre (o /dev/fd) para cada comando, canaliza la salida de ese comando a la canalización con nombre (o referencia de identificador de archivo /dev/fd) y pasa el nombre en la línea de comandos. Hay un equivalente con>(). Podrías hacer:command0 | tee >(command1) >(command2) >(command3) | command4
para enviar simultáneamente la salida de un comando a otros 4 comandos, por ejemplo.
Solución 2:
Puede agregar dos vapores a otro con cat
, como muestra el gorila.
También puede crear un FIFO, dirigir la salida de los comandos a ese, luego leer desde el FIFO con cualquier otro programa:
mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo
Particularmente útil para programas que solo escribirán o leerán un archivo, o para mezclar programas que solo generen stdout/file con uno que solo admita el otro.
Solución 3:
(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output
/tmp/p1
y /tmp/p2
son sus conductos de entrada, mientras que /tmp/output
es la salida.
Solución 4:
He creado un programa especial para esto:fdlinecombine
Lee varias canalizaciones (generalmente salidas de programa) y las escribe en la salida estándar en línea (también puede anular el separador)
Solución 5:
Tenga cuidado aquí; simplemente catearlos terminará mezclando los resultados de formas que quizás no desee:por ejemplo, si son archivos de registro, probablemente no desee que una línea de uno se inserte a la mitad de una línea del otro. Si eso está bien, entonces
cola -f /tmp/p1 /tmp/p2>/tmp/salida
trabajará. Si eso es no bien, entonces tendrá que encontrar algo que haga el almacenamiento en búfer de línea y solo genere líneas completas. Syslog hace esto, pero no estoy seguro de qué más podría hacer.
EDITAR:optimización para lectura sin búfer y canalizaciones con nombre:
considerando /tmp/p1 , /tmp/p2 , /tmp/p3 como canalizaciones con nombre, creadas por "mkfifo /tmp/pN "
cola -q -f /tmp/p1 /tmp/p2 | awk '{imprimir $0> "/tmp/p3"; cerrar("/tmp/p3"); fflush();}' &
ahora, de esta manera, podemos leer la salida llamada tubería "/tmp/p3" sin búfer por :
cola -f /tmp/p3
hay un pequeño error de tipo, necesita "inicializar" la primera tubería de entrada /tmp/p1 por:
echo -n> /tmp/p1
con el fin de la cola aceptará la entrada de la segunda tubería /tmp/p2 primero y no esperará hasta que llegue algo a /tmp/p1 . este puede no ser el caso, si está seguro, /tmp/p1 recibirá la entrada primero.
También se necesita la opción -q para seguir no imprime basura sobre nombres de archivo.