উত্তর:
একটি সহজ উপায় হ'ল আউটপুটটি ভেরিয়েবলের মধ্যে সঞ্চয় না করা, তবে কিছুক্ষণ / পঠন লুপের সাহায্যে সরাসরি এটির পুনরাবৃত্তি।
কিছুটা এইরকম:
grep xyz abc.txt | while read -r line ; do
echo "Processing $line"
# your code goes here
done
আপনি ঠিক কী পরে আছেন তার উপর নির্ভর করে এই স্কিমের বিভিন্নতা রয়েছে।
যদি আপনাকে লুপের ভিতরে ভেরিয়েবলগুলি পরিবর্তন করতে হয় (এবং তার পরিবর্তে এটির বাইরে দৃশ্যমান থাকে), আপনি ফেডোরকিয়ার উত্তরে বর্ণিত প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন :
while read -r line ; do
echo "Processing $line"
# your code goes here
done < <(grep xyz abc.txt)
while read p || [[ -n $p ]]; do ...
(থেকে ধার stackoverflow.com/questions/1521462/... )
আপনি নিম্নলিখিত while read
লুপটি করতে পারেন , যা grep
তথাকথিত প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে কমান্ডের ফলাফল দ্বারা খাওয়ানো হবে :
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
এইভাবে, আপনাকে ফলটি কোনও চলকতে সঞ্চয় করতে হবে না, তবে লুপটিতে সরাসরি তার "আউটজেক্ট" করতে হবে।
বাশএফএকিউ / 001 এর প্রস্তাবনাগুলি অনুসারে IFS=
এবং তার ব্যবহার read -r
অনুসারে নোট করুন : আমি কীভাবে কোনও ফাইল (ডেটা স্ট্রিম, ভেরিয়েবল) লাইন বাই লাইন (এবং / অথবা ক্ষেত্রের বাইরের ক্ষেত্র) পড়তে পারি? :
পড়ার জন্য -r বিকল্পটি ব্যাকস্ল্যাশ ব্যাখ্যাকে বাধা দেয় (সাধারণত ব্যাকস্ল্যাশ নিউলাইন জোড় হিসাবে ব্যবহৃত হয়, একাধিক লাইনে চালিয়ে যাওয়ার জন্য বা ডিলিমিটরগুলি থেকে বাঁচতে)। এই বিকল্পটি ব্যতীত ইনপুটটিতে থাকা কোনও অনস্কেপড ব্যাকস্ল্যাশগুলি ফেলে দেওয়া হবে। আপনার প্রায়শই পড়ার সাথে -r বিকল্পটি ব্যবহার করা উচিত।
উপরের দৃশ্যে আইএফএস = শীর্ষস্থানীয় এবং পিছনের সাদা স্থানের ছাঁটাই প্রতিরোধ করে। আপনি যদি এই প্রভাবটি চান তবে এটি সরান।
প্রক্রিয়া প্রতিস্থাপন সম্পর্কিত, এটি ব্যাশ হ্যাকার্স পৃষ্ঠায় ব্যাখ্যা করা হয়েছে :
প্রক্রিয়া প্রতিস্থাপন পুনঃনির্দেশের একটি ফর্ম যেখানে কোনও প্রক্রিয়ার ইনপুট বা আউটপুট (কমান্ডের কিছু ক্রম) অস্থায়ী ফাইল হিসাবে উপস্থিত হয়।
for
সংস্করণটি স্ট্রাইক করেছি । স্ট্যাকওভারফ্লো . com/ a/ 14588210/1983854"${$(grep xyz abc.txt)[@]}"
হিসাবে যেমন একটি লুপ করার চেষ্টা করেছিল কিন্তু পারেনি। সুতরাং আমি শুধু প্রথম সংস্করণ ছেড়ে।
zsh
, যেখানে এই ধরণের বাসা সম্ভবত কাজ করে)।
while IFS= read -r result <&3
এবংdone 3< <(grep ...
আমি এখানে গ্রেপ + এর পরিবর্তে আরও কিছু ব্যবহার করার পরামর্শ দেব।
awk '$0~/xyz/{ //your code goes here}' abc.txt
//your code goes here
?
- লাইন-বাফার্ড গ্রেপ বিকল্পের সাথে কোনও পুনরাবৃত্তি ছাড়াই:
your_command | grep --line-buffered "your search"
রিয়েল লাইফ উদাহরণস্বরূপ সিমফনি পিএইচপি ফ্রেমওয়ার্ক রাউটার ডিবাগ কমান্ড আউটপুট, সমস্ত "এপিআই" সম্পর্কিত রুটগুলি গ্রেপ করতে:
php bin/console d:r | grep --line-buffered "api"
tail -f some.log
, আমার ক্ষেত্রে) ...
প্রায়শই প্রক্রিয়াকরণের ক্রমের বিষয়টি বিবেচনা করে না। জিএনইউ সমান্তরাল এই পরিস্থিতির জন্য তৈরি:
grep xyz abc.txt | parallel echo do stuff to {}
আপনি যদি প্রক্রিয়াজাতকরণ আরও পছন্দ হয়:
grep xyz abc.txt | myprogram_reading_from_stdin
এবং myprogram
ধীরে ধীরে আপনি চালাতে পারেন:
grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin
grep -o
এই ধরণের জিনিসটির শক্তির উল্লেখ নেই ।-o
পতাকা ফেরত দিতে হবে শুধুমাত্র প্রতি আউটপুট লাইন এক ম্যাচ সঙ্গে, পাঠ্য ম্যাচ। (এটি সম্পূর্ণ নয়, সুতরাংecho aaa |grep 'a*'
কেবল আপনাকে "আআ" দেয় এবং তিনটি আংশিক ম্যাচ "", "এ" এবং "