GNU/Linux >> Linux の 問題 >  >> Linux

Linuxで2つの名前付きパイプを単一の入力ストリームに結合するにはどうすればよいですか

解決策 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 オプションが必要です。 ファイル名に関するガベージを出力しません。


Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  3. Linux – / usr/binと/usr/sbinを/bin(gnu / linux)にマージしますか?

  1. CentOS / RHEL 7 で systemd-tmpfiles が /tmp/ または /var/tmp (tmpwatch の置き換え) をクリーンアップする方法

  2. UNIX / Linux :/tmp および /var/tmp ディレクトリの正しい権限は何ですか

  3. /dev/urandom を Linux サウンド出力にパイプする方法は?

  1. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  2. Linux で入出力エラーを解釈して修正する方法は?

  3. デフォルトの /tmp を /home/user/tmp に変更する方法