78 votes

Comment joindre deux tubes nommés en un seul flux d'entrée sous linux ?

En utilisant les tuyaux ( | ) de Linux, je peux faire suivre l'entrée standard vers un ou plusieurs flux de sortie.

Je peux utiliser tee pour diviser la sortie en sous-processus séparés.

Existe-t-il une commande permettant de joindre deux flux d'entrée ?

Comment dois-je m'y prendre ? Comment fonctionne le différentiel ?

125voto

freiheit Points 14144

Personnellement, mon préféré (nécessite bash et d'autres choses qui sont standard sur la plupart des distributions Linux)

Les détails peuvent dépendre beaucoup de ce que les deux choses produisent et de la façon dont vous voulez les fusionner ...

Contenu de la commande1 et de la commande2 après l'autre dans la sortie :

cat <(command1) <(command2) > outputfile

Ou si les deux commandes produisent des versions alternatives des mêmes données que vous voulez voir côte à côte (j'ai utilisé ceci avec snmpwalk ; les nombres d'un côté et les noms de MIB de l'autre) :

paste <(command1) <(command2) > outputfile

Ou si vous souhaitez comparer les résultats de deux commandes similaires (par exemple une recherche dans deux répertoires différents).

diff <(command1) <(command2) > outputfile

Ou s'il s'agit de sorties ordonnées d'une sorte, fusionnez-les :

sort -m <(command1) <(command2) > outputfile

Ou lancez les deux commandes en même temps (ce qui pourrait brouiller un peu les choses, cependant) :

cat <(command1 & command2) > outputfile

L'opérateur <() configure un tuyau nommé (ou /dev/fd) pour chaque commande, en acheminant la sortie de cette commande dans le tuyau nommé (ou la référence au gestionnaire de fichier /dev/fd) et en transmettant le nom sur la ligne de commande. Il existe un équivalent avec >(). Vous pourriez le faire : command0 | tee >(command1) >(command2) >(command3) | command4 pour envoyer simultanément la sortie d'une commande à 4 autres commandes, par exemple.

18voto

frameworkninja Points 628

Vous pouvez ajouter deux flux à un autre avec cat comme le montre le gorille.

Vous pouvez également créer une FIFO, y diriger la sortie des commandes, puis lire la FIFO avec n'importe quel autre programme :

mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo

Particulièrement utile pour les programmes qui n'écrivent ou ne lisent qu'un fichier, ou pour mélanger des programmes qui ne sortent que stdout/file avec un programme qui ne supporte que l'autre.

13voto

sef Points 574
(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output

/tmp/p1 y /tmp/p2 sont vos tuyaux d'entrée, tandis que /tmp/output est la sortie.

7voto

Vi. Points 821

J'ai créé un programme spécial pour cela : fdlinecombine

Il lit plusieurs tuyaux (généralement des sorties de programme) et les écrit sur stdout de manière linéaire (vous pouvez également modifier le séparateur).

4voto

mreggen Points 2940

Soyez prudent ici ; le simple fait de les mettre en chat va finir par mélanger les résultats d'une manière que vous ne souhaitez pas : par exemple, s'il s'agit de fichiers journaux, vous ne voulez probablement pas qu'une ligne de l'un soit insérée au milieu d'une ligne de l'autre. Si cela ne pose pas de problème, alors

tail -f /tmp/p1 /tmp/p2 > /tmp/output

fonctionnera. Si c'est no ok, alors vous allez devoir trouver quelque chose qui fera du buffering de ligne et ne sortira que des lignes complètes. Syslog le fait, mais je ne suis pas sûr de ce qui pourrait le faire.

EDIT : optimisation pour la lecture sans tampon et les tuyaux nommés :

considérant /tmp/p1 , /tmp/p2 , /tmp/p3 comme des tubes nommés, créés par "mkfifo /tmp/p". N "

tail -q -f /tmp/p1 /tmp/p2 | awk '{print $0 > "/tmp/p3" ; close("/tmp/p3") ; fflush();}' &

maintenant par cette voie, nous pouvons lire la sortie nommée pipe "/tmp/p3" sans tampon par :

tail -f /tmp/p3

il y a un petit bug en quelque sorte, vous devez "initialiser" le 1er tuyau d'entrée /tmp/p1 par :

echo -n > /tmp/p1

afin de queue acceptera l'entrée du 2ème tube /tmp/p2 en premier et n'attendra pas que quelque chose arrive à /tmp/p1 . cela peut ne pas être le cas, si vous êtes sûr, le /tmp/p1 recevra l'entrée en premier.

L'option -q est également nécessaire afin de queue n'affiche pas les noms de fichiers.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X