এক আউটপুটে একাধিক ইউনিক্স কমান্ড একত্রিত করুন


9

নির্দিষ্ট ইমেল ঠিকানার জন্য আমার মেইল ​​লগগুলি সন্ধান করতে হবে search আমরা মাইলোগ নামে একটি বর্তমান ফাইল পাশাপাশি এক সপ্তাহের মূল্যমানের .bz2 ফাইল একই ফোল্ডারে রাখি । বর্তমানে, আমি ফাইলটি অনুসন্ধানের জন্য নিম্নলিখিত কমান্ডগুলি চালাচ্ছি:

grep person@domain.com maillog
bzgrep person@domain.com *.bz2

একক আউটপুট- এ grepএবং bzgrepআদেশগুলি একত্রিত করার কোনও উপায় আছে কি ? এইভাবে, আমি একক ইমেল বা একটি একক ফাইলে মিলিত ফলাফলগুলি পাইপ করতে পারতাম।

উত্তর:


24

আরেকটি উপায়

{ grep ...; bzgrep ...;} >file

&&অসুবিধা আছে যে ব্যর্থ bzgrepহলে চালানো হবে না grep

প্রারম্ভিক বক্রবন্ধনী বন্ধনী এবং শেষ কমান্ডের পরে সেমিকোলনের পরে বাধ্যতামূলক স্থানটি নোট করুন। বিকল্পভাবে, আপনি সাব-শেল সিনট্যাক্স (কোঁকড়া ধনুর্বন্ধনী পরিবর্তে প্যারেন্টেসিস) ব্যবহার করতে পারেন, যা পিক হিসাবে খুব ভাল নয়:

(grep ...; bzgrep ...) >file

এই ইস্যুতে সেরা সাধারণ উদ্দেশ্যে শেল পদ্ধতির জন্য +1। শেল গোষ্ঠীকরণ একটি সাধারণভাবে ব্যবহারযোগ্য বৈশিষ্ট্য।
ফিল হলেনব্যাক

2
আপনি এর ()পরিবর্তে মানে না {}?
এহতেশ চৌধুরী

আর্চ লিনাক্সে এটি কাজ করেছে ()তবে নয় {}, কোনওভাবেই +1 এটি আমার যা প্রয়োজন তা-ই!
ক্রিস ম্যাগনসন

11

কোনও ফাইল বিজিপ-সংকুচিত না হলে bzgrep নিয়মিত গ্রেপ-এ স্বয়ংক্রিয়ভাবে ডিফল্ট হয়। এইভাবে নিম্নলিখিতগুলি পর্যাপ্ত হওয়া উচিত:

bzgrep person@domain.com maillog *bz2 | mail -s "logs yay" someuser@blah

ওহ অবশ্যই এখানে আমার বাধ্যতামূলক জিএনইউ সমান্তরাল সমাধানও রয়েছে:

parallel -m bzgrep person@domain.com ::: maillog* *bz2 | mail -s "logs yay" someuser@blah

যদি আপনি প্রচুর ফাইল চেক করেন তবে এটি আরও দ্রুত হতে পারে।


2

এটি করার আরও একটি উপায় এখানে রয়েছে (ধরে নিই আপনি বাশ চালাচ্ছেন, যা আপনি সম্ভবত আছেন):

cat <(bzgrep ...) <(grep ...)

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

আপনার বিশেষ ক্ষেত্রে আমি ফিলের সমাধানটি সুপারিশ করব, তবে উপরের আপনার ব্যাগে রাখা ভাল কৌশল is

আপনি যদি আগ্রহী হন তবে আপনি এখানে আরও পড়তে পারেন: http://www.tldp.org/LDP/abs/html/process-sub.html


হ্যাঁ হ্যাঁ, 'আপনি দুটি প্রক্রিয়ার আউটপুট কীভাবে পৃথক করবেন' এর জন্য উত্তরীয় উত্তর। জানতে একটি ভাল কৌশল।
ফিল হলেনব্যাক

1

আমার এই লেখার সময়, গৃহীত উত্তরের বাক্য গঠনটি বেশিরভাগের পক্ষে ভুল ছিল, যদি সব না হয় তবে বোর্ন-উদ্ভূত শেলস সহ bash। আমি শীর্ষে একটি সম্পাদনার পরামর্শ দিয়েছি এবং এটি ঠিক করার জন্য জবাব গ্রহণ করেছি, তবে আমি এই সমস্ত তথ্য যুক্ত করতেও আগ্রহী ছিলাম, এবং এটি সম্পাদনার পরিবর্তে পুনর্লিখনের আরও বেশি কিছু হত।

আপনি যৌগিক আদেশগুলি ব্যবহার করতে পারেন:

{ grep ...; bzgrep ...; } >file

.. অথবা সাবশেল (কোঁকড়া ধনুর্বন্ধনী পরিবর্তে প্রথম বন্ধনী নোট করুন):

(grep ...; bzgrep ...) >file

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

দ্রষ্টব্য: আপনি এই কৌশলগুলি দিয়ে পাইপলাইনও ব্যবহার করতে পারেন, সুতরাং আপনি এরকম কিছু করতে পারেন:

{ grep ...; bzgrep ...; } | less

দ্রষ্টব্য যদি আপনি আপনার মিলিত আউটপুটে ম্যাচের ক্রম যত্ন সম্পর্কে না, আপনি একটি একক ব্যবহার করতে পারে &দুই কমান্ড মধ্যে তাই মত: { grep ... & bzgrep ...; }। তারপরে দুটি কমান্ড একই সাথে চলবে: grepশুরু হয়ে যায় এবং শেলটি এটি পটভূমিতে রাখে, তারপরে শেলটি চালিত হবে bzgrep। (তবে ফাইলের পুনঃনির্দেশ এবং ফাইল স্ট্রিম বাফারিংয়ের সাথে সম্পর্কিত একটি ব্যাখ্যা রয়েছে যার ফলে আউটপুট ফাইলের লাইনগুলির খুব সামান্য অংশ বিভক্ত / জঞ্জাল হয়ে পড়েছে: আপনি কী দেখতে পান এটি নির্ভর করে কিভাবে আপনার grep, bzgrep, এবং libc stdio.hফাংশনগুলি বাস্তবায়িত হয় most বেশিরভাগ বাস্তবায়নে, আমি বিশ্বাস করি কোনও ফাইলে পুনর্নির্দেশের আগে কমান্ডটি পাইপ করা সমস্যা এড়াতে পারে, তাই আপনি কাজটি { foo & bar; } | cat - >fileহিসাবে কাজ করতে পারেন ))


0

আপনি কমান্ডগুলি && এর সাথে একসাথে বেঁধে রাখতে পারেন যা আপনাকে প্রতিটি কমান্ড চালানোর অনুমতি দেবে।

আপনি প্রতিটি কমান্ডের শেষে >> textfile.txt যুক্ত করতে পারেন এবং আউটপুট কোনও ফাইলকে আঘাত করতে পারে তবে সেই ফাইলটিকে মেল করে।


2
গীকোসর যেমন উল্লেখ করেছেন, && এখানে ব্যবহার করা উচিত নয় কারণ গ্রেপের রিটার্ন মানটি কিছু খুঁজে পেয়েছিল কিনা তার উপর নির্ভর করে। আপনি যদি করেন grep ... && bzgrep ..., গ্রেপের কোনও হিট না থাকলে এটি ব্যর্থতা ফিরে আসবে এবং আদেশটি বন্ধ হয়ে যাবে। >>এটি একটি ভাল ধারণা যদিও ভিন্ন >, এটি একটি বিদ্যমান ফাইলের শেষে আউটপুট যুক্ত করবে।
ডার্পফ

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