Saltar al contenido

¿Cómo puedo unir dos tuberías con nombre en un flujo de entrada único en Linux?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *