GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menggabungkan dua pipa bernama ke aliran input tunggal di linux

Solusi 1:

Secara pribadi, favorit saya (membutuhkan bash dan hal-hal lain yang standar pada sebagian besar distribusi Linux)

Detailnya bisa sangat bergantung pada apa yang dihasilkan kedua hal itu dan bagaimana Anda ingin menggabungkannya ...

Isi dari command1 dan command2 setelah satu sama lain dalam output:

cat <(command1) <(command2) > outputfile

Atau jika kedua perintah mengeluarkan versi alternatif dari data yang sama yang ingin Anda lihat berdampingan (saya telah menggunakan ini dengan snmpwalk; angka di satu sisi dan nama MIB di sisi lain):

paste <(command1) <(command2) > outputfile

Atau jika Anda ingin membandingkan keluaran dari dua perintah serupa (misalkan temukan di dua direktori berbeda)

diff <(command1) <(command2) > outputfile

Atau jika mereka mengurutkan keluaran, gabungkan mereka:

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

Atau jalankan kedua perintah sekaligus (walaupun bisa sedikit mengacak):

cat <(command1 & command2) > outputfile

Operator <() menyiapkan pipa bernama (atau /dev/fd) untuk setiap perintah, menyalurkan output dari perintah itu ke dalam pipa bernama (atau referensi filehandle /dev/fd) dan meneruskan nama pada baris perintah. Ada yang setara dengan>(). Anda dapat melakukan:command0 | tee >(command1) >(command2) >(command3) | command4 untuk secara bersamaan mengirim output dari satu perintah ke 4 perintah lainnya, misalnya.

Solusi 2:

Anda dapat menambahkan dua steam ke yang lain dengan cat , seperti yang ditunjukkan gorila.

Anda juga dapat membuat FIFO, mengarahkan keluaran perintah ke situ, lalu membaca dari FIFO dengan program lain apa pun:

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

Sangat berguna untuk program yang hanya akan menulis atau membaca file, atau menggabungkan program yang hanya menghasilkan stdout/file dengan satu yang hanya mendukung yang lain.

Solusi 3:

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

/tmp/p1 dan /tmp/p2 adalah pipa input Anda, sedangkan /tmp/output adalah outputnya.

Solusi 4:

Saya telah membuat program khusus untuk ini:fdlinecombine

Itu membaca banyak pipa (biasanya keluaran program) dan menulisnya ke stdout secara berurutan (Anda juga dapat mengganti pemisah)

Solusi 5:

Hati-hati di sini; hanya menangkapnya akan berakhir dengan mencampurkan hasil dengan cara yang mungkin tidak Anda inginkan:misalnya, jika itu adalah file log, Anda mungkin tidak benar-benar menginginkan baris dari satu baris disisipkan di tengah baris dari baris lainnya. Jika tidak apa-apa, maka

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

akan bekerja. Jika itu tidak oke, maka Anda harus menemukan sesuatu yang akan melakukan buffering baris dan hanya menampilkan baris lengkap. Syslog melakukan ini, tapi saya tidak yakin apa lagi yang mungkin.

EDIT:optimalisasi untuk pembacaan tanpa buffer dan pipa bernama:

mempertimbangkan /tmp/p1 , /tmp/p2 , /tmp/p3 sebagai pipa bernama, dibuat oleh "mkfifo /tmp/pN "

ekor -q -f /tmp/p1 /tmp/p2 | awk '{cetak $0> "/tmp/p3"; tutup("/tmp/p3"); fflush();}' &

sekarang dengan cara ini, kita dapat membaca Output bernama pipa "/tmp/p3" unbuffered oleh :

ekor -f /tmp/p3

ada semacam bug kecil, Anda perlu "menginisialisasi" pipa masukan pertama /tmp/p1 dengan:

gema -n> /tmp/p1

untuk mengekor akan menerima input dari pipa ke-2 /tmp/p2 terlebih dahulu dan tidak menunggu sampai sesuatu datang ke /tmp/p1 . mungkin tidak demikian, jika Anda yakin, /tmp/p1 akan menerima masukan terlebih dahulu.

Opsi -q juga diperlukan untuk mengekor tidak mencetak sampah tentang nama file.


Linux
  1. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  2. Linux – Menggabungkan /usr/bin Dan /usr/sbin Ke /bin (gnu/linux)?

  3. UNIX / Linux :Apa izin yang benar dari direktori /tmp dan /var/tmp?

  1. Cara Menggunakan Pipes dan Named Pipes di Linux (dengan Contoh)

  2. Bagaimana cara menyalurkan /dev/urandom ke output suara linux?

  3. Bagaimana cara menafsirkan dan memperbaiki kesalahan Input/output di Linux?

  1. Cara Mengembalikan Direktori /tmp yang Dihapus di Linux

  2. Cara Menggabungkan Dua File Teks di Linux

  3. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?