Hola, encontramos la solución a lo que necesitas, has scroll y la hallarás más abajo.
Solución:
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 revolver un poco las cosas):
cat <(command1 & command2) > outputfile
El <() operator sets up a named pipe (or /dev/fd) for each command, piping the output of that command into the named pipe (or /dev/fd filehandle reference) and passes the name on the commandline. There's an equivalent with >(). Podrías hacerlo: 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 eso, 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 generan salida estándar/archivo con uno que solo admite el otro.
Solución 3:
(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output
/tmp/p1
y /tmp/p2
son sus tuberías de entrada, mientras que /tmp/output
es la salida.
Solución 4:
He creado un programa especial para esto: fdlinecombine
Lee múltiples conductos (generalmente salidas del programa) y los 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/pnorte"
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:
eco -n > /tmp/p1
con el fin de 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 cola no imprime basura sobre nombres de archivos.
Nos puedes avalar nuestra tarea mostrando un comentario o dejando una valoración te lo agradecemos.