একক কমান্ড থেকে দুটি পৃথক কমান্ড থেকে কীভাবে মার্জ এবং পাইপ ফলাফল হবে?


35

আমি দুটি ভিন্ন কমান্ড থেকে মার্জ (ইউনিয়ন) আউটপুট চাই এবং সেগুলি একটি একক কমান্ডে পাইপ করতে চাই।

একটি নির্বোধ উদাহরণ:

কমান্ডগুলি আমি আউটপুটটি মার্জ করতে চাই:

cat wordlist.txt
ls ~/folder/*

মধ্যে:

wc -l

এই উদাহরণে, ওয়ার্ডলিস্ট.টেক্সটে যদি 5 টি লাইন এবং 3 ফাইল থাকে তবে আমি wc -l8 টি ফিরে আসতে চাই ।

$cat wordlist.txt *[magical union thing]* ls ~/folder/* | wc -l
8

আমি কেমন করে ঐটি করি?

উত্তর:


56

আপনার যাদুকরী ইউনিয়নের জিনিসটি একটি সেমিকোলন ... এবং কোঁকড়া ধনুর্বন্ধনী:

    { cat wordlist.txt ; ls ~/folder/* ; } | wc -l

কোঁকড়া ধনুর্বন্ধনী শুধুমাত্র কমান্ডগুলি একসাথে ভাগ করে নিচ্ছে, যাতে পাইপের চিহ্নটি |সম্মিলিত আউটপুটকে প্রভাবিত করে।

আপনি ()একটি কমান্ড গোষ্ঠীর আশেপাশে বন্ধনী ব্যবহার করতে পারেন , যা একটি সাব-শেলের কমান্ডগুলি কার্যকর করবে। এটিতে কোঁকড়ানো ধনুর্বন্ধনী সহ একটি সূক্ষ্ম সেট রয়েছে, উদাহরণস্বরূপ নিম্নলিখিত চেষ্টা করে দেখুন:

    cd $HOME/Desktop ; (cd $HOME ; pwd) ; pwd
    cd $HOME/Desktop ; { cd $HOME ; pwd ; } ; pwd

আপনি দেখতে পাবেন যে বর্তমান ওয়ার্কিং ডিরেক্টরি সহ সমস্ত পরিবেশের ভেরিয়েবলগুলি প্রথম বন্ধনী গোষ্ঠী থেকে বেরিয়ে আসার পরে পুনরায় সেট করা হয়েছে তবে কোঁকড়ানো-ব্রেস গোষ্ঠীটি প্রস্থান করার পরে নয়।

সেমিকোলনের ক্ষেত্রে, বিকল্পগুলিতে চিহ্ন &&এবং ||চিহ্নগুলি অন্তর্ভুক্ত রয়েছে , যা শর্তাধীনভাবে দ্বিতীয় কমান্ড কেবল তখনই সফল হয় যদি না সফল হয় তবে যথাক্রমে, যেমন

    cd $HOME/project && make
    ls $HOME/project || echo "Directory not found."

1
যে কাজ করে! আমাকে শিখতে সহায়তা করুন - কোঁকড়ানো ধনুর্বন্ধনী এখানে ঠিক কী করছে? তাদের আর কি যাদু শক্তি রয়েছে?
ডেভিড ওনিল

@ ডেভিডঅনিল { list; }একটি যৌগিক কমান্ড । থেকে bash(1): তালিকাটি কেবল বর্তমান শেল পরিবেশে কার্যকর করা হয়। তালিকাটি অবশ্যই একটি নতুন লাইন বা সেমিকোলন দিয়ে শেষ করতে হবে। [..] রিটার্নের স্থিতি হল তালিকার প্রস্থান স্থিতি।
লেকেনস্টেইন

আমি উত্তরে আরও কিছু তথ্য যুক্ত করেছি। ব্যাশের সাথে শেল স্ক্রিপ্টিংয়ের সুনির্দিষ্ট গাইড হ'ল বাশ ম্যানপেজ, man bashকমান্ড লাইন থেকে টাইপ করুন এবং এটি ব্রাউজ করুন।
পাব্লোমে

উচিত; এই শব্দগুলিতে ওয়ার্ডলিস্ট.txt ফাইলটি উপস্থিত না থাকলে এই কমান্ডগুলিতে && থাকতে পারে না?
রিনজউইন্ড

যদি wordlist.txtউপস্থিত না থাকে তবে একটি ত্রুটি catস্ট্যান্ডার্ড ত্রুটিতে প্রদর্শিত হবে, তবে মানক আউটপুটে নয়, সুতরাং wc -lএটি থেকে কোনও লাইন গণনা করবে না। একই ~/folderবিদ্যমান নেই। 2> /dev/nullস্ট্যান্ডার্ড ত্রুটির উপর আওয়াজ প্রতিরোধের জন্য এই কমান্ডগুলির প্রতিটি এবং সেমিকোলনের মধ্যে একটি যোগ করতে পারে তবে কুরুচিপূর্ণ হওয়া ব্যতীত, ত্রুটি বার্তাগুলি লাইন গণনা করার উদ্দেশ্যে নির্দোষ।
পাব্লোমে

8

যেহেতু wcকোনও ফাইল পাথ ইনপুট হিসাবে গ্রহণ করে, আপনি প্রক্রিয়া বিকল্পটিও ব্যবহার করতে পারেন:

wc -l <(cat wordlist.txt; ls ~/folder/*)

এটি মোটামুটি সমান:

echo wordlist.txt > temp
ls ~/folder/* >> temp
wc -l temp

মনে রাখবেন যে ls ~/folder/*সাবডিরেক্টরিজের সামগ্রীগুলি যদি থাকে (গ্লোব বিস্তারের কারণে) ফেরত দেয়। আপনি যদি কেবলমাত্র লিখিত সামগ্রীগুলির তালিকা করতে চান তবে ~/folderব্যবহার করুন ls ~/folder


wc -lশুধু একটি গঠিত উদাহরণ ছিল, আমি আসলে কিছু আরও জটিল যে এই অপশনটি নেই সেটিকে বংশীধ্বনিতুল্য করছি।
ডেভিড ওনিল

2
@ ডেভিডনিল ওয়েল, যেমন catকোনও ফাইল আর্গুমেন্ট গ্রহণ করে আপনি এটি ব্যবহার করতে পারেন cat <(cat wordlist.txt; ls wordlist.txt) | wc -lএবং এমনকি করতে পারেন cat wordlist.txt <(ls wordlist.txt) | wc -l। এটি অবশ্যই খুব কুৎসিত, তবে এটি কমান্ড লাইন সরঞ্জামগুলির সাথে অবিরাম সম্ভাবনাগুলি দেখায়।
লেকেনস্টেইন

1
@ ডেভিডনিল সঠিক, আমি এখন এটি সংশোধন করেছি, ধন্যবাদ।
লেকেনস্টেইন

1
আপনি এটি চান ls ~/folder/যাতে ~/folderপ্রতীকী লিঙ্কটি যদি লিঙ্কের lsপরিবর্তে তার লক্ষ্যের বিষয়বস্তুগুলি তালিকাভুক্ত করে। যাইহোক, সমস্ত lsকমান্ডগুলি অনুসরণ করা উচিত -1যাতে প্রতি লাইন একক ফাইল মুদ্রিত হয় এবং wc -lফাইলগুলি গণনা করার একটি বৈধ উপায়।
পাবলোমমে

@ পাবলোমমে আপনি সিমলিংক জিনিসটি সম্পর্কে সত্য, তবে -1আউটপুটটি টার্মিনাল নয়, পাইপ বলেই বোঝানো হয়েছে।
লেকেনস্টেইন

2

আমি নিজেকে একই প্রশ্ন জিজ্ঞাসা করছি, এবং একটি সংক্ষিপ্ত স্ক্রিপ্ট লিখে শেষ।

magicalUnionThing(আমি এটি কল করি append):

#!/bin/sh
cat /dev/stdin
$*

সেই স্ক্রিপ্টটিকে সম্পাদনযোগ্য করে তুলুন

chmod +x ./magicalUnionThing

এখন আপনি কি

cat wordlist.txt |./magicalUnionThing ls ~/folder/* | wc -l

এর মানে কি:

  • স্ট্যান্ডার্ড আউটপুটে মান ইনপুট প্রেরণ করুন
  • যুক্তি কার্যকর করুন। $*সমস্ত আর্গুমেন্টকে স্ট্রিং হিসাবে ফিরিয়ে দেয়। এই কমান্ডের আউটপুট স্ক্রিপ্ট স্ট্যান্ডার্ড আউটপুট ডিফল্ট যায়।

সুতরাং ম্যাজিকাল ইউনিউনটিহিংয়ের স্ট্যান্ডআউটটি আর্গুমেন্ট হিসাবে পাস হওয়া কমান্ডের স্টিনআউট হবে।

অন্যান্য উত্তর হিসাবে অবশ্যই সহজ উপায় আছে।
হতে পারে এই বিকল্পটি কিছু ক্ষেত্রে কার্যকর হতে পারে।

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