আমি কীভাবে এক কমান্ডের আউটপুট একাধিক কমান্ডে পাস করব?


20

প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে বা গ্রুপিং ও পাইপিং ব্যবহার করে, কেউ আউটপুট ( স্টাডাউট ) অন্য কমান্ডের ইনপুট হিসাবে কমান্ডের একটি সেট পাস করতে পারে ।

উদাহরণ:

wc < <(echo hi;echo bye)
(echo hi; bye) | wc

তবে এর বিপরীতটি কি আছে?

অর্থাৎ, একক লাইনে অন্য অনেক কমান্ডের ইনপুট হিসাবে কোনও কমান্ডের আউটপুট প্রেরণ করার উপায় আছে ?

কিছুটা এইরকম :

cat testfile | wc | tail -n 5

( আক্ষরিক পাইপলাইন গ্রহণ করবেন না )। এখানে আমি আউটপুট পাস করার চেষ্টা করছি cat testfileউভয় wcএবংtail -n 5

আর একটি উদাহরণ হ'ল:

( একটি বাক্যের শেষ শব্দটি পেতে )

echo "some random words"| wc -c | cut -f(out put of wc -c) (output of first echo)

উত্তর:


21

দ্রুত উত্তর. আপনি tee >(what_to_do) >(another_thing_to_do)যতগুলি ভিন্ন কাজ করতে চান তার জন্য আপনি আপনার আদেশের সাথে চালিয়ে যেতে ব্যবহার করতে পারেন ।

উদাহরণ:

আসল পরীক্ষার ফাইল আউটপুট:

:~$ cat testfile.txt 
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616

teeকমান্ড সহ আউটপুট যোগ করা হয়েছে:

:~$ cat testfile.txt | tee >(tail -1) >(wc) >(awk '{print $3,$1,$2}')
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
      2      10      91
Serial Number:    TW0XFJWX550854187616

টি-এর প্রতিটি কমান্ড হ'ল সাধারণ কমান্ডগুলি যা আপনি কমান্ড লাইনে ব্যবহার করবেন >(head -1 | wc)যেমন কাজগুলিতে অ্যাড করার মতো ।

:~$ cat testfile.txt | tee >(tail -1) >(head -1 | wc)  >(awk '{print $3,$1,$2}')
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616
      1       7      52
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
Serial Number:    TW0XFJWX550854187616

অথবা আপনার ব্যবহারের মাধ্যমে শেষ লাইনটি বলে শেষ কথা দখল করতে পারেন awkসঙ্গে $NFএকটি সঙ্গে wcপাশাপাশি ভালো:

:~$ cat testfile.txt | tail -1 | tee >(wc) >(awk '{print $NF}')
Serial Number:    TW0XFJWX550854187616
TW0XFJWX550854187616
      1       3      39

উল্লেখ্য: একটি যোগ করার পদ্ধতি |শেষ নল কমান্ড থেকে একাধিক কমান্ড ব্যবহার ওভাররাইড করতে পারে teeকমান্ড। আমার এখানে কয়েকটি উদাহরণ রয়েছে যা আমি পরীক্ষা করে যাচ্ছি:

উদাহরণ 1 (পাইপ কমান্ড সমস্ত শেষ শব্দ টানছে):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $NF}'
words
24
5
1

উদাহরণ 2 (ডাব্লুসি কমান্ডের আউটপুট দেখায় না P পাইপ কমান্ড তৃতীয় শব্দ দখল করেছে)):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $3}'
just

উদাহরণ 3 (ইকো লাইনের তৃতীয় শব্দটি ধরে নেওয়া bing টি কমান্ড)):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $3}')
This is just five words
just
24
5
1

উদাহরণ 4 (ইকো লাইনের শেষ শব্দটি ধরে নেওয়া Te টি কমান্ড)):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $NF}')
This is just five words
words
24
5
1

আশাকরি এটা সাহায্য করবে!


3
আমি টি এবং কফি ভালবাসি! '-)
বয়স্ক গীক

1
বিভিন্ন গ্রাহকের মধ্যে আউটপুট ক্রম সম্পর্কে আদেশ বিবৃতি teeভুল। আপনি সাধারণত সঠিক অর্ডার পাওয়ার কারণটি হ'ল লো লোড মেশিনে, প্রথম গ্রাহক প্রক্রিয়াটি প্রথম চালিত হয়। একটি ব্যস্ততর মেশিনে, প্রথম গ্রাহককে কোনও কিছু মুদ্রণের আগে ঘুমিয়ে দেওয়া হতে পারে।
মেটেই ডেভিড

@ মেটে ডেভিড আমি অন্যথায় এটি প্রমাণ করতে পারি না, তাই আমি কেবল বিবৃতিটি সরিয়েছি। কোনও বিগি নেই।
টেরেন্স

2
আমার উত্তর দেখুন। তবে আরও গুরুতরভাবে, teeভোক্তাদের সম্পর্কে কোনও ধারণা নেই they তারা তৈরি করেছে bashকে লাইনটি প্রক্রিয়াকরণ করে। যা যা bashকরে তা হ'ল খোলা ফাইল বর্ণনাকারীদের অনুলিপি করা। এর বাইরে, আপনার একাধিক ভোক্তা একই ফাইলটিতে ডেস্ক্রিপ্টার ফাইল করার জন্য লিখেছেন। কার্নেল এটি যত্ন করে তবে অবশ্যই bashকমান্ড লাইনে তারা যে ক্রমটি উপস্থিত হয়েছিল তা কোনও কারণ হবে না।
মেটেই ডেভিড

17

আপনি প্রয়োজন teeঅংশে প্রবাহ বিভক্ত করতে। চেষ্টা করুন:

cat testfile | tee >(wc -l) >(wc -w) >(wc -c) | tail -n 5

মন্তব্য:

  • যদি একাধিক প্রক্রিয়া ( wc, tail) সমস্ত স্টডআউটে লিখিত হয়:

    • আপনি পেতে পারেন আউটপুট।

    • যে অর্ডারে তাদের আউটপুট প্রদর্শিত হবে সে সম্পর্কে কোনও গ্যারান্টি নেই। এটি দেখতে, sleep 1; wc -wদ্বিতীয় গ্রাহক হিসাবে চেষ্টা করুন ।

  • teeযদি এর কোনও গন্তব্যগুলি পর্যাপ্ত পরিমাণে স্ট্রিমটি ব্যবহার না করে তবে অবরুদ্ধ করবে। অর্থ, গন্তব্যগুলিকে মোটামুটি একই গতিতে ইনপুট খাওয়ানো হবে (স্থির আকারের বাফারিংকে মডুলু করা হবে)। এর পক্ষে সহজ কোনও সমাধান নেই, একমাত্র বিকল্প হ'ল একটি স্ট্রিমটি স্ট্রিমে সংরক্ষণ করা এবং এটি আলাদাভাবে গ্রাহকদের খাওয়ানো। কারণ wcএবং tailএটি কোনও সমস্যা নয়।

শেষ শব্দের জন্য, এটি করা সহজ:

echo "some random words" | awk '{print $NF}'

5

moreutilsপ্যাকেজ কমান্ড প্রদান করে pee(নল এবং টী বর্ণের নাম এর একত্রীকরণ, আপনি কি মনে করেন?) যা ঠিক তাই করছে।

আপনার প্রথম উদাহরণের জন্য, আপনি ব্যবহার করবেন:

cat testfile | pee wc "tail -n 5"

দ্বিতীয় উদাহরণটি আরও জটিল কারণ আপনি শেষ কমান্ডটিতে দুটি ইনপুট দিতে চান। আমি সম্ভবত awkঅন্যান্য উত্তর হিসাবে ব্যবহার করবে ।

লিঙ্ক: https://joeyh.name/code/moreutils/

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