কিভাবে grep দিয়ে প্যাটার্ন, ফাইল এবং ডিরেক্টরি বাদ দিতে হয়

লিনাক্স ল্যাপটপ একটি ব্যাশ প্রম্পট দেখাচ্ছে
ফাতমাওয়াতি আহমেদ জায়েনুরি/শাটারস্টক ডটকম

1974 সাল থেকে লিনাক্স grep কমান্ড মানুষকে ফাইলে স্ট্রিং খুঁজে পেতে সাহায্য করছে। কিন্তু মাঝে মাঝে grep শুধু খুব পুঙ্খানুপুঙ্খ. এখানে বলার বিভিন্ন উপায় আছে grep বিভিন্ন জিনিস উপেক্ষা করা।

grepCommand

দ্য grep কমান্ড টেক্সট ফাইল অনুসন্ধান করে যে স্ট্রিংগুলির সন্ধান করে যা কমান্ড লাইনে আপনার প্রদান করা অনুসন্ধানের ধরণগুলির সাথে মেলে। এর ক্ষমতা grep নিয়মিত অভিব্যক্তির ব্যবহারে পড়ুন। এটি আপনাকে স্পষ্টভাবে সংজ্ঞায়িত করার পরিবর্তে আপনি যা খুঁজছেন তা বর্ণনা করতে দেয়।

এর জন্ম grep লিনাক্সের পূর্ববর্তী। এটি ইউনিক্স-এ 1970-এর দশকের গোড়ার দিকে বিকশিত হয়েছিল। এটিতে g/re/p কী ক্রম থেকে এর নাম নেওয়া হয়েছে ed লাইন সম্পাদক (প্রসঙ্গক্রমে, উচ্চারিত “ই-ডি”)। এই জন্য দাঁড়িয়েছে জিলোবাল পুনরায়নিয়মিত এক্সপ্রেস অনুসন্ধান, পিরেন্ট ম্যাচিং লাইন.

grep বিখ্যাতভাবে-সম্ভবত, কুখ্যাতভাবে-পুঙ্খানুপুঙ্খ এবং একক মনের। কখনও কখনও এটি ফাইল বা ডিরেক্টরিগুলি অনুসন্ধান করবে যা আপনি বরং এটির সময় নষ্ট করবেন না, কারণ ফলাফলগুলি আপনাকে গাছের কাঠ দেখতে অক্ষম করতে পারে৷

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

নিদর্শন ব্যতীত

সঙ্গে অনুসন্ধান করতে grep আপনি অন্য কোনো প্রক্রিয়া থেকে পাইপ ইনপুট করতে পারেন যেমন cat অথবা আপনি শেষ কমান্ড লাইন প্যারামিটার হিসাবে একটি ফাইলের নাম প্রদান করতে পারেন।

আমরা একটি ছোট ফাইল ব্যবহার করছি যাতে কবিতাটির পাঠ্য রয়েছে জব্বারওকি, লুইস ক্যারল দ্বারা। এই দুটি উদাহরণে, আমরা “জ্যাবারওক” অনুসন্ধান শব্দের সাথে মেলে এমন লাইনগুলি অনুসন্ধান করছি৷

cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text

grep দিয়ে একই টেক্সট ফাইলের মাধ্যমে অনুসন্ধান করার দুটি ভিন্ন উপায়

যে লাইনগুলিতে সার্চ ক্লুর সাথে মিল রয়েছে সেগুলি আমাদের জন্য তালিকাভুক্ত করা হয়েছে, প্রতিটি লাইনের মিলিত উপাদান লাল রঙে হাইলাইট করা হয়েছে৷ যে সোজা অনুসন্ধান. কিন্তু যদি আমরা “জ্যাবারওক” শব্দটি ধারণ করে এমন লাইনগুলি বাদ দিতে এবং বাকিগুলি মুদ্রণ করতে চাই?

আমরা সঙ্গে যে সম্পন্ন করতে পারেন -v (উল্টানো ম্যাচ) বিকল্প। এটি সেই লাইনগুলিকে তালিকাভুক্ত করে যা অনুসন্ধান শব্দের সাথে মেলে না৷

grep -v "Jabberwock" jabberwocky.text

grep-এর সাথে -v ইনভার্টেড সার্চ অপশন ব্যবহার করে

যে লাইনগুলিতে “জ্যাবারওক” নেই সেগুলি টার্মিনাল উইন্ডোতে তালিকাভুক্ত করা হয়েছে।

যে সমস্ত লাইনে জ্যাবারওক শব্দটি নেই

আমরা আমাদের ইচ্ছা হিসাবে অনেক পদ বাদ দিতে পারেন. আসুন “জ্যাবারওক” এবং “এবং” আছে এমন যেকোন লাইন ফিল্টার করি। এই অর্জন করতে আমরা ব্যবহার করব -e (অভিব্যক্তি) বিকল্প। আমরা ব্যবহার করছি প্রতিটি অনুসন্ধান প্যাটার্নের জন্য এটি ব্যবহার করতে হবে।

grep -v -e "Jabberwock" -e "and" jabberwocky.txt

grep-এর সাথে একাধিক সার্চ ক্লজ ব্যবহার করা

আউটপুট লাইনের সংখ্যা একটি সংশ্লিষ্ট ড্রপ আছে.

টেক্সট থেকে লাইন যে সার্চ টার্মের সাথে মেলে না

যদি আমরা ব্যবহার করি -E (বর্ধিত রেজেক্স) বিকল্প, আমরা “এর সাথে অনুসন্ধানের ধরণগুলি একত্রিত করতে পারি|“, যা এই প্রসঙ্গে একটি পাইপ নির্দেশ করে না, এটি যৌক্তিক OR অপারেটর.

grep -Ev "Jabberwock|and" jabberwocky.txt

grep-এর সাথে লজিক্যাল OR অপারেটর ব্যবহার করা

আমরা আগের, লং-ওয়াইন্ডেড কমান্ডের সাথে ঠিক একই আউটপুট পাই।

টেক্সট থেকে লাইন যে সার্চ টার্মের সাথে মেলে না

কমান্ডের বিন্যাস একই হয় যদি আপনি একটি স্পষ্ট অনুসন্ধান ক্লু পরিবর্তে একটি regex প্যাটার্ন ব্যবহার করতে চান। এই কমান্ডটি “ACHT” সেটের যেকোনো অক্ষর দিয়ে শুরু হওয়া সমস্ত লাইন বাদ দেবে।

grep -Ev "^ACHT" jabberwocky.txt

নির্দিষ্ট অক্ষর দিয়ে শুরু হওয়া ফাইলগুলি বাদ দেওয়া

একটি প্যাটার্ন আছে কিন্তু অন্য প্যাটার্ন ধারণ করে না এমন লাইনগুলি দেখতে, আমরা পাইপ করতে পারি grep মধ্যে grep . আমরা “জ্যাবারওক” শব্দটি রয়েছে এমন সমস্ত লাইন অনুসন্ধান করব এবং তারপরে যে কোনও লাইন ফিল্টার করব তাই “হত্যা” শব্দটি ধারণ করে।

grep "Jabberwock" jabberwocky.txt | grep -v "slain"

দুইবার ফিল্টার করার জন্য গ্রেপে গ্রেপ পাইপিং করুন

ফাইল বাদ দিয়ে

আমরা জিজ্ঞাসা করতে পারেন grep ফাইলের সংগ্রহে একটি স্ট্রিং বা প্যাটার্ন সন্ধান করতে। আপনি কমান্ড লাইনে প্রতিটি ফাইল তালিকাভুক্ত করতে পারেন, কিন্তু অনেক ফাইলের সাথে যে পদ্ধতির স্কেল হয় না।

grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt

নামযুক্ত ফাইলগুলির একটি তালিকার মাধ্যমে অনুসন্ধান করা হচ্ছে৷

মনে রাখবেন যে ফাইলের নামটি আউটপুটের প্রতিটি লাইনের শুরুতে দেখা যায়।

টাইপিং কমাতে আমরা ওয়াইল্ডকার্ড ব্যবহার করতে পারি। কিন্তু যে বিরোধী হতে পারে. এই কাজ বলে মনে হচ্ছে.

grep "vorpal" *.txt

ফাইলের সংগ্রহ অনুসন্ধান করতে ওয়াইল্ডকার্ড ব্যবহার করে

যাইহোক, এই ডিরেক্টরিতে অন্যান্য TXT ফাইল রয়েছে, কবিতার সাথে কোন সম্পর্ক নেই। যদি আমরা একই কমান্ড কাঠামোর সাথে “তলোয়ার” শব্দটি অনুসন্ধান করি তবে আমরা প্রচুর মিথ্যা ইতিবাচক পাই।

grep "sword" *.txt

খুঁজছি "তলোয়ার" TXT ফাইলের সংগ্রহের মাধ্যমে

আমরা যে ফলাফলগুলি চাই সেগুলি TXT এক্সটেনশন থাকা অন্যান্য ফাইল থেকে মিথ্যা ফলাফলের প্রবাহ দ্বারা মুখোশিত।

মিথ্যা ইতিবাচক একটি বড় সেট

“ভর্পাল” শব্দটি কিছুতেই মেলেনি, কিন্তু “তলোয়ার” শব্দটি “পাসওয়ার্ড” এর মধ্যে অন্তর্ভুক্ত তাই এটি কিছু ছদ্ম-লগফাইলে অনেকবার পাওয়া গেছে।

আমরা এই ফাইলগুলি বাদ দিতে হবে. এটা করতে আমরা ব্যবহার করব --exclude বিকল্প “vol-log-1.txt” নামক একটি ফাইল বাদ দিতে আমরা এই কমান্ডটি ব্যবহার করব:

grep --exclude=vol-log-1.txt "sword" *.txt

এই উদাহরণে, আমরা “ভোল” দিয়ে শুরু হওয়া নামের একাধিক লগ ফাইল বাদ দিতে চাই। আমাদের প্রয়োজন সিনট্যাক্স হল:

grep --exclude=vol*.txt "sword" *.txt

ওয়াইল্ডকার্ড সহ ফাইল বাদ

যখন আমরা ব্যবহার করি -R (dereference recursive) বিকল্প grep আমাদের জন্য সম্পূর্ণ ডিরেক্টরি গাছ অনুসন্ধান করবে. ডিফল্টরূপে, এটি সেই অবস্থানগুলির সমস্ত ফাইলের মাধ্যমে অনুসন্ধান করবে। আমরা বাদ দিতে চাই এমন একাধিক ধরনের ফাইল থাকতে পারে।

এই টেস্ট মেশিনে বর্তমান ডিরেক্টরির নীচে, লগ ফাইল, CSV ফাইল এবং MD ফাইল ধারণকারী নেস্টেড ডিরেক্টরি রয়েছে। এই সব ধরনের টেক্সট ফাইল যা আমরা বাদ দিতে চাই। আমরা একটি ব্যবহার করতে পারে --exclude প্রতিটি ফাইল প্রকারের জন্য বিকল্প, কিন্তু আমরা ফাইলের প্রকারগুলিকে গোষ্ঠীবদ্ধ করে আরও দক্ষতার সাথে যা চাই তা অর্জন করতে পারি।

এই কমান্ডটি CSV বা MD এক্সটেনশন আছে এমন সমস্ত ফাইল এবং সমস্ত TXT ফাইল বাদ দেয় যার নাম হয় “ভোল” বা “লগ” দিয়ে শুরু হয়৷

grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /home/dave/data/

একাধিক ব্যবহার করা --ক্লজ এবং ফাইলের নাম গ্রুপিং বাদ দিন

ডিরেক্টরি ব্যতীত

আমরা যে ফাইলগুলিকে উপেক্ষা করতে চাই সেগুলি যদি ডিরেক্টরিগুলিতে থাকে এবং সেই ডিরেক্টরিগুলিতে কোনও ফাইল না থাকে যা আমরা অনুসন্ধান করতে চাই, আমরা সেই সম্পূর্ণ ডিরেক্টরিগুলিকে বাদ দিতে পারি৷

ধারণাটি ফাইল বাদ দেওয়ার মতই, আমরা ব্যবহার ব্যতীত --exclude-dir বিকল্প এবং উপেক্ষা করার জন্য ডিরেক্টরিগুলির নাম দিন।

grep -R --exclude-dir=backup "vorpal" /home/dave/data

অনুসন্ধান থেকে একটি ডিরেক্টরি বাদ

আমরা “ব্যাকআপ” ডিরেক্টরিটি বাদ দিয়েছি, কিন্তু আমরা এখনও “ব্যাকআপ2” নামক আরেকটি ডিরেক্টরির মাধ্যমে অনুসন্ধান করছি।

এটা কোন আশ্চর্য হবে না যে আমরা ব্যবহার করতে পারেন --exclude-dir একক কমান্ডে একাধিকবার বিকল্প। উল্লেখ্য যে বাদ দেওয়া ডিরেক্টরিগুলির পথটি যে ডিরেক্টরিতে অনুসন্ধান শুরু হবে তার সাথে সম্পর্কিত হওয়া উচিত৷ ফাইল সিস্টেমের মূল থেকে পরম পাথ ব্যবহার করবেন না৷

grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data

অনুসন্ধান থেকে দুটি ডিরেক্টরি বাদ

আমরা গ্রুপিংও ব্যবহার করতে পারি। আমরা একই জিনিস আরও সংক্ষিপ্তভাবে অর্জন করতে পারি:

grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data

গ্রুপিং সহ ডিরেক্টরি বাদ

আপনি একই কমান্ডে ফাইল এবং ডিরেক্টরি বর্জন একত্রিত করতে পারেন। আপনি যদি একটি ডিরেক্টরি থেকে সমস্ত ফাইল বাদ দিতে চান এবং ডিরেক্টরিগুলি থেকে নির্দিষ্ট ফাইল প্রকারগুলি বাদ দিতে চান হয় অনুসন্ধান, এই সিনট্যাক্স ব্যবহার করুন:

grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data

একই কমান্ডে ফাইলের ধরন এবং ডিরেক্টরিগুলি বাদ দেওয়া

কখনও কখনও এটা আপনি কি ছেড়ে আউট

মাঝে মাঝে সাথে grep এটা মনে হতে পারে আপনি একটি খড়ের গাদায় একটি সুই খুঁজে বের করার চেষ্টা করছেন। এটা খড়ের গাদা অপসারণ একটি বড় পার্থক্য করে তোলে.

সম্পর্কিত: লিনাক্সে রেগুলার এক্সপ্রেশন (regexes) কিভাবে ব্যবহার করবেন