GNU/Linux >> Tutoriales Linux >  >> Linux

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

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.


Linux
  1. Cómo restaurar el directorio /tmp eliminado en Linux

  2. Cómo unir dos archivos de texto en Linux

  3. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  4. ¿Qué tan portátiles son /dev/stdin, /dev/stdout y /dev/stderr?

  5. Linux – ¿Vincular /proc/mnt a /proc/mounts?

Directorio tmp de Linux:todo lo que necesita saber

Cómo unir varias líneas en una en un archivo en Linux

Cómo redirigir la salida a /dev/null en Linux

Cómo unir/combinar varios archivos de audio en uno solo en Linux

Cómo eliminar archivos y directorios en Linux

Cómo unir varias páginas PDF en una sola página