解決策 1:
個人的には、私のお気に入りです (ほとんどの Linux ディストリビューションで標準的な bash やその他のものが必要です)
詳細は、2 つの出力の内容とそれらをどのようにマージするかによって大きく異なります ...
出力内の command1 と command2 の内容:
cat <(command1) <(command2) > outputfile
または、両方のコマンドが、並べて表示したい同じデータの代替バージョンを出力する場合 (私はこれを snmpwalk で使用しました。一方に数字、もう一方に MIB 名を使用しました):
paste <(command1) <(command2) > outputfile
または、2 つの類似したコマンドの出力を比較したい場合 (たとえば、2 つの異なるディレクトリでの検索)
diff <(command1) <(command2) > outputfile
または、それらが何らかの順序付けられた出力である場合は、それらをマージします:
sort -m <(command1) <(command2) > outputfile
または、両方のコマンドを一度に実行します (ただし、少し混乱する可能性があります):
cat <(command1 & command2) > outputfile
<() 演算子は、コマンドごとに名前付きパイプ (または /dev/fd) を設定し、そのコマンドの出力を名前付きパイプ (または /dev/fd ファイルハンドル参照) にパイプして、コマンドラインで名前を渡します。>() と同等のものがあります。次のようにできます:command0 | tee >(command1) >(command2) >(command3) | command4
たとえば、1 つのコマンドの出力を他の 4 つのコマンドに同時に送信します。
解決策 2:
cat
で 2 つのストリームを別のストリームに追加できます 、ゴリラが示すように。
また、FIFO を作成し、コマンドの出力をそこに送信してから、他のプログラムを使用して FIFO から読み取ることもできます:
mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo
ファイルの書き込みまたは読み取りのみを行うプログラム、または stdout/file のみを出力するプログラムと他のプログラムのみをサポートするプログラムを混在させる場合に特に便利です。
解決策 3:
(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output
/tmp/p1
と /tmp/p2
/tmp/output
は入力パイプです。 出力です。
解決策 4:
このための特別なプログラムを作成しました:fdlinecombine
複数のパイプ (通常はプログラム出力) を読み取り、行ごとに stdout に書き込みます (セパレーターをオーバーライドすることもできます)
解決策 5:
ここで注意してください。たとえば、それらがログ ファイルである場合、一方の行をもう一方の行の途中に挿入する必要はないでしょう。それでよろしければ、
<ブロック引用>tail -f /tmp/p1 /tmp/p2>/tmp/output
動作します。そうでない場合 では、行のバッファリングを行い、完全な行のみを出力するものを見つける必要があります。 Syslog はこれを行いますが、他に何ができるかはわかりません。
編集:バッファリングされていない読み取りと名前付きパイプの最適化:
/tmp/p1 、 /tmp/p2 、 /tmp/p3 を「mkfifo /tmp/pN によって作成された名前付きパイプとみなす」 "
<ブロック引用>テール -q -f /tmp/p1 /tmp/p2 | awk '{print $0> "/tmp/p3";閉じる ("/tmp/p3"); fflush();}' &
これで、名前付きパイプ "/tmp/p3" unbuffered の出力を読み取ることができます 投稿者:
<ブロック引用>テール -f /tmp/p3
ある種の小さなバグがあります。最初の入力パイプ /tmp/p1 を次のように「初期化」する必要があります:
<ブロック引用>エコー -n> /tmp/p1
尾行するために 最初に 2 番目のパイプ /tmp/p2 からの入力を受け入れ、何かが /tmp/p1 に来るまで待機しません。そうではない可能性があります。確実であれば、/tmp/p1 が最初に入力を受け取ります。
また、tail するには -q オプションが必要です。 ファイル名に関するガベージを出力しません。