আমি কীভাবে দুটি নামের পাইপগুলিকে লিনাক্সের একক ইনপুট প্রবাহে যুক্ত করব do


64

|লিনাক্সে পাইপ ( ) বৈশিষ্ট্যটি ব্যবহার করে আমি স্ট্যান্ডার্ড ইনপুটটিকে এক বা একাধিক আউটপুট স্ট্রিমগুলিতে এগিয়ে যেতে পারি।

আমি teeআউটপুট বিভক্ত করতে সাব-প্রসেসকে আলাদা করতে পারি।

দুটি ইনপুট স্ট্রিমগুলিতে যোগদানের জন্য কোনও আদেশ আছে কি?

আমি এই সম্পর্কে কিভাবে যেতে হবে? ডিফ কীভাবে কাজ করে?

উত্তর:


105

ব্যক্তিগতভাবে, আমার প্রিয় (বেশিরভাগ লিনাক্স বিতরণে স্ট্যান্ডার্ড বাশ এবং অন্যান্য জিনিসগুলির প্রয়োজন)

দুটি জিনিস কী আউটপুট দেয় এবং কীভাবে আপনি সেগুলি মার্জ করতে চান তার উপর বিশদটি অনেকটা নির্ভর করতে পারে ...

আউটপুটে একে অপরের পরে কমান্ড 1 এবং কমান্ড 2 এর সূচি:

cat <(command1) <(command2) > outputfile

অথবা যদি উভয়ই একই তথ্যের আউটপুট বিকল্প সংস্করণকে কমান্ড করে যা আপনি পাশাপাশি দেখতে চান (আমি এটি স্ন্যাম্পওয়াক দিয়ে ব্যবহার করেছি; একপাশে সংখ্যাগুলি এবং অন্যদিকে এমআইবি নামগুলি):

paste <(command1) <(command2) > outputfile

অথবা আপনি যদি দুটি অনুরূপ কমান্ডের আউটপুট তুলনা করতে চান (দুটি ভিন্ন ডিরেক্টরিতে একটি অনুসন্ধান করুন)

diff <(command1) <(command2) > outputfile

বা যদি তাদের কোনও সাজানোর আউটপুট অর্ডার করা হয় তবে সেগুলি মার্জ করুন:

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

অথবা দুটি কমান্ড একবারে চালান (কিছুটা হলেও স্ক্যামার করতে পারে):

cat <(command1 & command2) > outputfile

<() অপারেটর প্রতিটি কমান্ডের জন্য একটি নামক পাইপ (বা / dev / fd) সেট আপ করে সেই কমান্ডের আউটপুটটিকে পাইপযুক্ত নামের পাইপ (বা / dev / fd ফাইলহ্যান্ডেল রেফারেন্স) এ পাইপ করে এবং কমান্ডলাইনে নামটি পাস করে। > () এর সাথে একটি সমতুল্য রয়েছে। আপনি এটি করতে পারেন: command0 | tee >(command1) >(command2) >(command3) | command4একই সাথে একটি কমান্ডের আউটপুট 4 টি অন্যান্য কমান্ডে প্রেরণ করতে।


অসাধারণ! আমি সময় ব্যাশ এর র manpage প্রচুর পড়েছি কিন্তু যে একটি চয়ন নি
জাভিয়ের

2
আপনি ([উন্নত ব্যাশ স্ক্রিপ্টিং নির্দেশিকা] রেফারেন্স জানতে পারেন tldp.org/LDP/abs/html/process-sub.html লিনাক্স ডকুমেন্টেশন প্রকল্পের কোণে)
Brice

3
grep --line-bufferedএকযোগে একাধিক লগ ফাইলগুলি grepইনগ্রেড করার জন্য সহজ - আমি পাইপ দিয়ে আন্তঃবাহিত লাইনগুলি প্রতিরোধ করতে সক্ষম হয়েছি tail। দেখতে stackoverflow.com/questions/10443704/line-buffered-cat
RubyTuesdayDONO

16

catগরিলা দেখায়, আপনি এর সাথে অন্য দুটি স্টিম যুক্ত করতে পারেন ।

আপনি একটি ফিফোও তৈরি করতে পারেন, কমান্ডের আউটপুটকে এটিতে নির্দেশনা দিতে পারেন, তারপরে অন্য যে কোনও প্রোগ্রামের সাথে ফিফোর কাছ থেকে পড়ুন:

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

বিশেষত সেই প্রোগ্রামগুলির জন্য দরকারী যা কেবল একটি ফাইল লিখতে বা পড়তে পারে, বা কেবলমাত্র অন্যকে সমর্থন করে এমন একের সাথে স্টডআউট / ফাইল আউটপুট করে এমন প্রোগ্রামগুলিকে মিশ্রিত করে।


2
এটি একটি পিএফসেন্সে (ফ্রিবিএসডি) কাজ করে যেখানে গৃহীত উত্তর দেয় না। ধন্যবাদ!
নাথান

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

/tmp/p1এবং /tmp/p2আপনার ইনপুট পাইপগুলি /tmp/outputহ'ল আউটপুট।


6
দ্রষ্টব্য: উভয় কমান্ড যদি ()প্রতিটি লাইনে তাদের আউটপুটটি ফ্লাশ করে না দেয় (এবং পারমাণবিকতার জন্য কিছু অস্পষ্ট POSIX নিয়ম) না থাকে তবে আপনি বিড়ালের
ইনপুটটিতে

আপনি কি অ্যাম্পারস্যান্ড চরিত্রের পরিবর্তে অর্ধবৃত্তটি ব্যবহার করবেন না?
সমীর

এটি এপিক স্টাফ
মোবিজিটাল

5

আমি এটির জন্য বিশেষ প্রোগ্রাম তৈরি করেছি: fdlinecombine

এটি একাধিক পাইপ (সাধারণত প্রোগ্রাম আউটপুট) পড়ে এবং স্টাডআউট লাইনের দিকে লেখায় (আপনি বিভাজককে ওভাররাইড করতে পারেন)


বিজ্ঞাপন হিসাবে কাজ করে। এটি জনসাধারণের জন্য ধন্যবাদ।
আলেক্সেই

3

আমি tpipeএটির জন্য একটি দুর্দান্ত কমান্ডটি ব্যবহার করেছি , এটি আপনাকে সাধারণভাবে সংকলনের প্রয়োজন হতে পারে কারণ এটি সাধারণ নয়। আপনার কথা বলার মতো কাজটি করার জন্য এটি সত্যিই দুর্দান্ত এবং আমি সাধারণত এটি ইনস্টল করি এটাই পরিষ্কার। ম্যান পৃষ্ঠাটি এখানে অবস্থিত http://linux.die.net/man/1/tpipe । বর্তমানে তালিকাভুক্ত ডাউনলোডটি এই সংরক্ষণাগারটিতে রয়েছে http://www.eurogaran.com/downloads/tpype/

এটি এভাবে ব্যবহার করা হয়,

## Reinject sub-pipeline stdout into standard output:
$ pipeline1 | tpipe "pipeline2" | pipeline3

3

এখানে সাবধান; কেবল তাদের ক্যাটিংয়ের ফলে ফলাফলগুলি আপনি যেভাবে নাও চান তার মিশ্রণটি শেষ করবে: উদাহরণস্বরূপ, যদি তারা ফাইল লগ করে থাকেন তবে আপনি সম্ভবত অন্যটির একটি রেখার মধ্য দিয়ে অর্ধেকভাবে sertedোকানো একটি থেকে একটি লাইন চান না। তা যদি ঠিক থাকে তবে

লেজ -f / tmp / p1 / tmp / p2> / tmp / আউটপুট

কাজ করবে. যদি এটি ঠিক না থাকে , তবে আপনাকে এমন কিছু সন্ধান করতে হবে যা লাইন বাফারিং এবং কেবলমাত্র আউটপুট সম্পূর্ণ লাইনগুলি করবে। সিসলগ এটি করে তবে আমি আর নিশ্চিত না যে আর কী হতে পারে।

সম্পাদনা: আনফার্ড পড়া এবং নামযুক্ত পাইপগুলির জন্য অনুকূলকরণ:

"এমকেফিফো / টিএমপি / পি এন " দ্বারা নির্মিত নামী পাইপ হিসাবে / টিএমপি / পি 1, / টিএমপি / পি 2, / টিএমপি / পি 3 বিবেচনা করুন

লেজ-কি -f / টিএমপি / পি 1 / টিএমপি / পি 2 | awk '{মুদ্রণ $ 0> "/ টিএমপি / পি 3"; ঘনিষ্ঠ ( "/ tmp / 'P3"); fflush ();} '&

এখন এইভাবে, আমরা আউটপুট নামক পাইপ "/ tmp / p3" আনবফারড পড়তে পারি :

লেজ -f / টিএমপি / পি 3

এখানে ছোট বাগ রয়েছে, আপনার 1 ম ইনপুট পাইপ / টিএমপি / পি 1 এর মাধ্যমে "আরম্ভ" করতে হবে:

প্রতিধ্বনি-এন> / টিএমপি / পি 1

করার জন্য লেজ প্রথম 2nd নল / tmp / 'P2 থেকে ইনপুট গ্রহণ করবে এবং যতক্ষণ কিছু / tmp /' P1 আসে অপেক্ষা করবেন। এটি ক্ষেত্রে নাও হতে পারে, আপনি যদি নিশ্চিত হন তবে / tmp / p1 প্রথমে ইনপুট পাবেন।

ফাইল-নামগুলি সম্পর্কে আবর্জনা প্রিন্ট না করে লেজ রাখার জন্য -q বিকল্পটি প্রয়োজনীয় ।


আরও ব্যবহারযোগ্য হবে: "টেল-কি-এফ / টিএমপি / পি 1 / টিএমপি / পি 2 | অন্য_কম্যান্ড" যেহেতু এটি লাইন দ্বারা লাইন করা হবে এবং
-কিউ

unbuffered ফাইল / নামে পাইপ ব্যবহারের জন্য: tail -q -f /tmp/p1 /tmp/p2 | awk '{print $0 > "/tmp/p3"; close("/tmp/p3"); fflush();}' & এখন / tmp / 'P3 এমনকি পাইপ নামে করা যাবে এবং আপনি কেবল দ্বারা এটি পড়তে পারেন tail -f /tmp/p3এই সব UNBUFFERED = পাতিপাতি সেখানে অবশ্য সাজানোর ছোট বাগ সংশোধন করা হয়। 1 ম ফাইল / নামযুক্ত পাইপটি প্রথমে আরম্ভ করা দরকার যাতে ক্রম পুচ্ছ 2 য় থেকে আউটপুট গ্রহণ করবে। সুতরাং আপনার প্রয়োজন হবে echo -n > /tmp/p1এবং তার চেয়ে সমস্ত কিছুই সহজেই কাজ করবে।
রেডব্লিউ

1

এটি করার জন্য সেরা প্রোগ্রামটি হ'ল lmerge। ফ্রেইহার্টের উত্তরগুলির বিপরীতে এটি লাইন-ওরিয়েন্টেড তাই দুটি কমান্ডের আউটপুট একে অপরকে আঁতকে উঠবে না। অন্যান্য সমাধানগুলির বিপরীতে এটি মোটামুটি ইনপুটটিকে একত্রিত করে যাতে কোনও কমান্ড আউটপুটকে প্রাধান্য দিতে পারে না। উদাহরণ স্বরূপ:

$ lmerge <(yes foo) <(yes bar) | head -n 4

এর আউটপুট দেয়:

foo
bar
foo
bar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.