গ্রেপের সাথে এক লাইনে দুটি স্ট্রিং ম্যাচ করুন


218

আমি grepদুটি পৃথক স্ট্রিং যুক্ত লাইনগুলিকে মেলে ব্যবহার করার চেষ্টা করছি । আমি নিম্নলিখিত চেষ্টা করেছি কিন্তু এই লাইন যে হয় থাকতে ম্যাচ স্ট্রিং 1 বা স্ট্রিং 2 যা না আমি কি চাই।

grep 'string1\|string2' filename

সুতরাং আমি উভয় স্ট্রিংgrep রয়েছে এমন কেবল রেখাগুলির সাথে কীভাবে মিলব ?


1
সম্পর্কিত: unix.stackexchange.com
দ্য

উত্তর:


189

তুমি ব্যবহার করতে পার grep 'string1' filename | grep 'string2'

অথবা, grep 'string1.*string2\|string2.*string1' filename


5
@ আলেকজান্ডারএন আসলে আমি এটি বহুজাতিক দিয়ে কাজ করতে পারি না, এটি এত অদ্ভুতভাবে গৃহীত হয়েছিল ..
কুম্ভ শক্তি

1
এটি কোনও বহুমাত্রিক প্রশ্ন ছিল না। যদি এটি মাল্টলাইন ছিল, গ্রেপ-পি পার্ল স্টাইলের রেজেক্সকে সমর্থন করে ...
স্কট প্রাইভ

20
কেবল তখনই কাজ করে যখন 'স্ট্রিং 1' এবং 'স্ট্রিং 2' একই লাইনে থাকে। আপনি যদি 'স্ট্রিং 1' বা 'স্ট্রিং 2' দিয়ে লাইনগুলি সন্ধান করতে চান তবে ব্যবহারকারীর 45949 এর উত্তর দেখুন।
lifeson106

10
প্রথম বিকল্প: এক গ্রেপকে একটি সেকেন্ডে পাইপ দেওয়ার ফলে একটি ওআর ফলাফল আসে না এটি একটি ফলাফল তৈরি করে।
মাসুকোমি

1
আমি ব্যবহার করেছিgrep -e "string1" -e "string2"
রবি ধোরিয়া ツ

198

আমি মনে করি আপনি এটিই খুঁজছিলেন:

grep -E "string1|string2" filename

আমি মনে করি যে উত্তরগুলি এর মত:

grep 'string1.*string2\|string2.*string1' filename

উভয়ই কেবল সেখানে উপস্থিত থাকে যেখানে একটি বা অপর বা উভয়ই নয় match


14
grep -e "string1" -e "string2" filenameএকই কাজ করবেন না ?
janosdivenyi

25
এইভাবে স্ট্রিং 1 বা স্ট্রিং 2 এর জন্য গ্রেপ করা যায়। প্রশ্নটি পরিষ্কারভাবে জানিয়েছে যে তারা স্ট্রিং 1 এবং স্ট্রিং 2 খুঁজছেন।
ওরিওন ইলেজিল

9
খুব নিশ্চিত যে প্রশ্নটি বেশ সুনির্দিষ্ট:How do I match lines that contains *both* strings?
r0estir0bbe

এটি কি একই লাইনে মুদ্রণ করতে পারে?
凡 凡

1
এই উত্তর এখনও এখানে কেন? এটি প্রশ্নের উত্তর নয়।
প্রমিথিউস

26

যে কোনও জায়গায় যে কোনও শব্দে সমস্ত শব্দযুক্ত ফাইলগুলির সন্ধান করতে:

grep -ril \'action\' | xargs grep -il \'model\' | xargs grep -il \'view_type\'

প্রথম গ্রেপ একটি পুনরাবৃত্ত অনুসন্ধান ( r) কেস ( i) উপেক্ষা করে ফাইলে যে কোনও জায়গায় ঘটতে পারে ( একক উদ্ধৃতি সহ l) এক টার্মের জন্য ( ) একত্রে মিলছে এমন ফাইলগুলির নাম তালিকা (মুদ্রণ আউট) বন্ধ করে 'action'দেয়।

পরবর্তী গ্রেপগুলি অন্যান্য পদগুলির অনুসন্ধান করে, কেস সংবেদনশীলতা বজায় রাখে এবং মেলা ফাইলগুলি তালিকাভুক্ত করে।

আপনি যে ফাইলগুলির চূড়ান্ত তালিকা পাবেন সেগুলি ফাইলগুলির যে কোনও ক্রমে এই শর্তাদি ধারণ করে।


2
একমত! আমি কেবল নোট করব যে ফাঁকা জায়গায় ফাইলের নামগুলি হ্যান্ডেল করতে আমাকে xargs একটি "-d '\ n'" দিতে হয়েছিল ' এটি আমার জন্য লিনাক্সে কাজ করেছিল: grep -ril 'foo' | xargs -d '\n' grep -il 'bar'
টমি হ্যারিস

16

আপনি যদি একটি থাকে তাহলে grepএকটি সঙ্গে -Pএকটি সীমিত জন্য বিকল্প perlRegex, আপনি ব্যবহার করতে পারেন

grep -P '(?=.*string1)(?=.*string2)'

ওভারল্যাপিং স্ট্রিংগুলির সাথে কাজ করার সুবিধা রয়েছে। এটি perlহিসাবে কিছুটা সহজবোধ্য হিসাবে ব্যবহার করা হয়েছে grep, কারণ আপনি আরও যুক্তিসঙ্গতভাবে এবং যুক্তিটি নির্দিষ্ট করতে পারেন:

perl -ne 'print if /string1/ && /string2/'

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

12

আপনার পদ্ধতিটি প্রায় ভাল ছিল, কেবলমাত্র -উই অনুপস্থিত

grep -w 'string1\|string2' filename

1
কমপক্ষে ওএস-এক্স এবং ফ্রিবিএসডি-তে এটি কার্যকর হয়! আমার অনুমান যে আপনি অন্য কিছুতে রয়েছেন (যা ওপি সংজ্ঞায়িত করেনি - আশা করি আপনি বাদে অনেক ব্যবহারকারীর কাছে সঠিক উত্তরটি কম করেননি)।
লিও

আমি ওএস-এক্স এ আছি সম্ভবত আমি এটি সঠিকভাবে করছি না? আমি কী করেছি তা একবার দেখুন: i.imgur.com/PFVlVAG.png
এরিয়েল

1
অস্বাভাবিক. আমি প্রত্যাশা করেছিলাম পার্থক্যটি ফাইলের মধ্যে গ্রেপিংয়ের মধ্যে নয়, তবে আমি যদি আপনার পদ্ধতিগুলি আপনার এলএস দিয়ে পাইপ করি তবে আমি ফল পেয়ে যাব যে আপনি করবেন না: imgur.com/8eTt3Ak.png - উভয় OS-X 10.9.5 এ (উভয়ই) "গ্রেপ (বিএসডি গ্রেপ) 2.5.1-ফ্রিবিএসডি") এবং ফ্রিবিএসডি 10 ("গ্রেপ (জিএনইউ গ্রেপ) 2.5.1-ফ্রিবিএসডি")। আমি কি কৌতুহল করছি আপনি কি grep -V
লিও

1
আপনার উদাহরণগুলি আমার জন্য কাজ করছে: i.imgur.com/K8LM69O.png সুতরাং পার্থক্য হ'ল এই পদ্ধতিটি সাবস্ট্রিংগুলি গ্রহণ করে না, তাদের নিজস্ব নিজস্ব স্ট্রিং থাকতে হবে। আমি অনুমান করি সাবস্ট্রিংগুলির সন্ধানের জন্য আপনাকে গ্রেপের অভ্যন্তরে পুনরায় তৈরি করতে হবে। এরকম কিছু:grep -w 'regexp1\|regexp2' filename
এরিয়েল

2
ওপি স্ট্রিং 1 বা স্ট্রিং 2 এর সাথে মিল রেখে উদাহরণ দেখায় এবং উভয় স্ট্রিং যুক্ত লাইনগুলিকে কীভাবে মেলে তা জিজ্ঞাসা করে। এই উদাহরণটি এখনও OR দেয়।
গুস্তাফব্রস্টম

7

|একটি রেগুলার এক্সপ্রেশন মধ্যে অপারেটর অর্থ বা। তার মানে স্ট্রিং 1 বা স্ট্রিং 2 মিলবে। আপনি করতে পারেন:

grep 'string1' filename | grep 'string2'

যা প্রথম কমান্ড থেকে দ্বিতীয় গ্রেপের ফলাফলগুলিকে পাইপ করবে। এটি আপনাকে উভয় সাথে মেলে শুধুমাত্র লাইন দেয় should


1
আপনার বক্তব্যগুলি সত্য, তবে ওপি প্রশ্নের উত্তর দেবেন না
বেন হুইলার

এটি প্রশ্নের উত্তর দেয় এবং প্রকৃতপক্ষে এটি বেশিরভাগ মানুষ এটি লেখেন।
পিটার কে

7

আপনি এরকম কিছু চেষ্টা করতে পারেন:

(pattern1.*pattern2|pattern2.*pattern1)

4

এবং লোকেদের যেমন পার্ল এবং অজগর, এবং সংশ্লেষিত শেল স্ক্রিপ্টগুলির পরামর্শ দেওয়া হয়েছিল, এখানে একটি সাধারণ অজানা পদ্ধতির:

awk '/string1/ && /string2/' filename

গৃহীত উত্তরের মন্তব্যগুলিতে নজর রেখে: না, এটি বহু-লাইন করে না; তবে প্রশ্নটির লেখক যা চেয়েছিলেন তাও তা নয়।


3

এর জন্য গ্রেপ ব্যবহার করার চেষ্টা করবেন না, পরিবর্তে বিশ্রী ব্যবহার করুন। 2 রিজেেক্সপ্স আর 1 এবং আর 2 কে গ্রেপের সাথে মিলানোর জন্য আপনি ভাবতেন যে এটি হবে:

grep 'R1.*R2|R2.*R1'

অবাক হওয়ার সময় এটি থাকত:

awk '/R1/ && /R2/'

তবে কি যদি R2ওভারল্যাপ হয় বা একটি উপসেট হয় R1? অ্যাগ্রক কমান্ড চলাকালীন সেই গ্রেপ কমান্ডটি কার্যকরভাবে কাজ করবে না। বলে লাইন যেগুলিতে খুঁজতে চান করতে দেয় theএবং heat:

$ echo 'theatre' | grep 'the.*heat|heat.*the'
$ echo 'theatre' | awk '/the/ && /heat/'
theatre

আপনাকে এর জন্য 2 গ্রেপ এবং একটি পাইপ ব্যবহার করতে হবে:

$ echo 'theatre' | grep 'the' | grep 'heat'
theatre

এবং অবশ্যই যদি আপনি এগুলি পৃথক করার প্রয়োজন পড়ে থাকেন তবে আপনি সর্বদা জাগতে ঠিক একই রেজিএক্সপেক্টে লিখতে পারেন যেমন আপনি গ্রিপ ব্যবহার করেছিলেন এবং এমন বিকল্প বিকল্প সমাধান রয়েছে যা প্রতিটি সম্ভাব্য ক্রমটিতে রেজেক্সপগুলি পুনরাবৃত্তি করার সাথে জড়িত না।

এটিকে একপাশে রেখে, যদি আপনি 3 রেজিক্সএস আর 1, আর 2 এবং আর 3 এর সাথে মিলানোর জন্য আপনার সমাধানটি প্রসারিত করতে চান তবে কি হবে। গ্রেপ ইন যে এই দুর্বল পছন্দগুলির মধ্যে একটি হতে চাই:

grep 'R1.*R2.*R3|R1.*R3.*R2|R2.*R1.*R3|R2.*R3.*R1|R3.*R1.*R2|R3.*R2.*R1' file
grep R1 file | grep R2 | grep R3

অদ্ভুত অবস্থায় এটি সংক্ষিপ্ত, সুস্পষ্ট, সরল, দক্ষ হতে চাই:

awk '/R1/ && /R2/ && /R3/'

এখন, আপনি যদি রিজেক্সপ্স আর 1 এবং আর 2 এর পরিবর্তে আক্ষরিক স্ট্রিং এস 1 এবং এস 2 এর সাথে মিল করতে চান? আপনি কেবল গ্রিপ-এ কল করতে পারবেন না, গ্রিপ কল করার আগে আপনাকে সমস্ত আরই মেটাচার থেকে বাঁচতে কোড লিখতে হবে:

S1=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R1')
S2=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R2')
grep 'S1.*S2|S2.*S1'

অথবা আবার 2 গ্রেপস এবং একটি পাইপ ব্যবহার করুন:

grep -F 'S1' file | grep -F 'S2'

যা আবার দুর্বল পছন্দ যেখানে আপনি ঠিক রেজিএক্সএক্স অপারেটরের পরিবর্তে স্ট্রিং অপারেটর ব্যবহার করেন:

awk 'index($0,S1) && index($0.S2)'

এখন, আপনি যদি একটি লাইনের পরিবর্তে একটি অনুচ্ছেদে 2 রেজিেক্সপগুলি মেলতে চান? গ্রেপ করে করা যায় না, অসভ্য মধ্যে তুচ্ছ:

awk -v RS='' '/R1/ && /R2/'

কিভাবে একটি সম্পূর্ণ ফাইল জুড়ে? আবার গ্রেপ এবং অজস্র ক্ষেত্রে তুচ্ছভাবে করা যাবে না (এই সময় আমি একত্রীকরণের জন্য মাল্টি-চর আরএসের জন্য জিএনইউ অ্যাডকে ব্যবহার করছি তবে এটি কোনও অ্যাডকের বেশি কোড নয় বা আপনি একটি নিয়ন্ত্রণ-চর বেছে নিতে পারেন যা আপনি জানেন না আরএসের মতো করার জন্য ইনপুটটিতে থাকুন):

awk -v RS='^$' '/R1/ && /R2/'

সুতরাং - যদি আপনি কোনও লাইন বা অনুচ্ছেদে বা ফাইলে একাধিক রেজেক্সপস বা স্ট্রিং সন্ধান করতে চান তবে গ্রেপ ব্যবহার করবেন না, awk ব্যবহার করুন।


কি awk '/R1/ && /R2/'কেস-অবশ?
প্রমিথিউস

@ হাশিম - না এটি আপনি যে জিএনইউ এর সাথে করিয়েছেন awk -v IGNORECASE=1 '/R1/ && /R2/'এবং যে কোনও উত্তেজক দিয়ে সংবেদন-সংবেদনশীল করতেawk '{x=toupper($0)} x~/R1/ && x~/R2/'
এড মর্টন

3
grep string1\|string2 FILENAME 

জিএনইউ গ্রেপ সংস্করণ ৩.১


2

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

 cat my_file.txt | grep
 -e '^      .*(\.c$|\.cpp$|\.h$|\.log$|\.out$)' # .c or .cpp or .h or .log or .out
 -e '^      .*[0-9]\{5,9\}$' # numers between 5 and 9 digist
 > nolog.txt

2

ধরা যাক একটি ফাইল টেস্টফাইলে আমাদের একাধিক শব্দের সংখ্যা খুঁজে বের করতে হবে। এটি সম্পর্কে দুটি উপায় আছে

1) রেজেক্স ম্যাচিং প্যাটার্ন সহ গ্রেপ কমান্ড ব্যবহার করুন

grep -c '\<\(DOG\|CAT\)\>' testfile

2) egrep কমান্ড ব্যবহার করুন

egrep -c 'DOG|CAT' testfile 

উদাহরণস্বরূপ আপনাকে প্রকাশের বিষয়ে চিন্তা করতে হবে এবং পাইপের বিভাজক দ্বারা পৃথক শব্দগুলি ব্যবহার করা উচিত নয়।


2

git grep

git grepএকাধিক নিদর্শনগুলির সাথে ব্যবহার করে সিনট্যাক্সটি এখানে :

git grep --all-match --no-index -l -e string1 -e string2 -e string3 file

এছাড়াও আপনি সঙ্গে নিদর্শন একত্রিত করতে পারি বুলিয়ান ধরনের অভিব্যক্তি --and, --orএবং --not

man git-grepসাহায্যের জন্য পরীক্ষা করুন ।


--all-matchএকাধিক প্যাটার্ন এক্সপ্রেশন দেওয়ার সময়, এই পতাকাটি সমস্তটির সাথে মিলে যাওয়ার জন্য লাইন থাকা ফাইলগুলিতে ম্যাচটি সীমাবদ্ধ করার জন্য নির্দিষ্ট করা হয় ।

--no-index বর্তমান ডিরেক্টরিতে ফাইলগুলি অনুসন্ধান করুন যা গিট দ্বারা পরিচালিত নয়।

-l/ --files-with-matches/ --name-onlyকেবলমাত্র ফাইলের নামগুলি দেখান।

-eপরবর্তী প্যারামিটার হ'ল প্যাটার্ন। ডিফল্ট হ'ল বেসিক রিজেক্সপ ব্যবহার করা।

অন্যান্য প্যারাম বিবেচনা করুন:

--threads গ্রেপ কর্মী থ্রেড ব্যবহার করার জন্য সংখ্যা।

-q/ --quiet/ --silentমিলিত রেখাগুলি আউটপুট করবেন না; কোনও ম্যাচ থাকলে স্থিতি 0 দিয়ে প্রস্থান করুন।

প্যাটার্ন ধরন পরিবর্তন করতে, আপনার কাছে ব্যবহার করতে পারেন -G/ --basic-regexp(ডিফল্ট), -F/ --fixed-strings, -E/ --extended-regexp, -P/ --perl-regexp, -f fileএবং অন্যান্য।

সম্পর্কিত:

জন্য বা অপারেশন, দেখুন:


2
সর্বদা ভেবেছিল যে "গিট গ্রেপ" কেবল গিট সংগ্রহস্থলের অভ্যন্তরে চালানো যেতে পারে। আমি - না-সূচক বিকল্পটি সম্পর্কে অবগত ছিলাম না। এটা ইশারা জন্য ধন্যবাদ!
কামরাজু কুসুমঞ্চি

1

আপনি যে স্ট্রিংগুলির জন্য গ্রেপ করতে চান সেটি একটি ফাইলে রাখুন

echo who    > find.txt
echo Roger >> find.txt
echo [44][0-9]{9,} >> find.txt

তারপরে -f ব্যবহার করে অনুসন্ধান করুন

grep -f find.txt BIG_FILE_TO_SEARCH.txt 

1
grep '(string1.*string2 | string2.*string1)' filename

যে কোনও ক্রমে স্ট্রিং 1 এবং স্ট্রিং 2 এর সাথে লাইন পাবেন


কমপক্ষে শীর্ষ দুটি উত্তর থেকে কীভাবে এটি পৃথক?
luk2302

1
grep -i -w 'string1\|string2' filename

এটি সঠিক শব্দের সাথে মিল এবং মিলের ক্ষেত্রে সংবেদনশীল শব্দের সাথে কাজ করে for


0

মাল্টলাইন ম্যাচের জন্য:

echo -e "test1\ntest2\ntest3" |tr -d '\n' |grep "test1.*test3"

অথবা

echo -e "test1\ntest5\ntest3" >tst.txt
cat tst.txt |tr -d '\n' |grep "test1.*test3\|test3.*test1"

আমাদের কেবল নিউলাইন চরিত্রটি সরিয়ে ফেলতে হবে এবং এটি কাজ করে!


0

আপনার grepএই মত হওয়া উচিত :

$ grep 'string1' file | grep 'string2'

1
এটি একটি যৌক্তিক AND সম্পাদন করে। ওপি একটি যৌক্তিক ওআর চায়।
বেন হুইলার

1
@ বেনহিটার: প্রশ্ন থেকে: "তবে আমি কেবল গ্রাইপের সাথে কীভাবে দুটি স্ট্রিং যুক্ত রেখাগুলির সাথে মিল করব?"
এরিক আমি

0

আমি প্রায়শই আপনার মতো একই সমস্যায় পড়ি এবং আমি কেবল একটি স্ক্রিপ্ট লিখেছি:

function m() { # m means 'multi pattern grep'

    function _usage() {
    echo "usage: COMMAND [-inH] -p<pattern1> -p<pattern2> <filename>"
    echo "-i : ignore case"
    echo "-n : show line number"
    echo "-H : show filename"
    echo "-h : show header"
    echo "-p : specify pattern"
    }

    declare -a patterns
    # it is important to declare OPTIND as local
    local ignorecase_flag  filename linum header_flag colon result OPTIND

    while getopts "iHhnp:" opt; do
    case $opt in
        i)
        ignorecase_flag=true ;;
        H)
        filename="FILENAME," ;;
        n)
        linum="NR," ;;
        p)
        patterns+=( "$OPTARG" ) ;;
        h)
        header_flag=true ;;
        \?)
        _usage
        return ;;
    esac
    done

    if [[ -n $filename || -n $linum ]]; then
    colon="\":\","
    fi

    shift $(( $OPTIND - 1 ))

    if [[ $ignorecase_flag == true ]]; then
    for s in "${patterns[@]}"; do
            result+=" && s~/${s,,}/"
    done
    result=${result# && }
    result="{s=tolower(\$0)} $result"
    else
    for s in "${patterns[@]}"; do
            result="$result && /$s/"
    done
    result=${result# && }
    fi

    result+=" { print "$filename$linum$colon"\$0 }"

    if [[ ! -t 0 ]]; then       # pipe case
    cat - | awk "${result}"
    else
    for f in "$@"; do
        [[ $header_flag == true ]] && echo "########## $f ##########"
        awk "${result}" $f
    done
    fi
}

ব্যবহার:

echo "a b c" | m -p A 
echo "a b c" | m -i -p A # a b c

আপনি চাইলে এটি .Bashrc এ রাখতে পারেন।


0

যখন উভয় স্ট্রিং ক্রমযুক্ত থাকে তখন অন grepকমান্ডের মধ্যে একটি প্যাটার্ন রাখুন :

$ grep -E "string1(?.*)string2" file

উদাহরণস্বরূপ যদি কোনও ফাইলটিতে নিম্নলিখিত লাইনগুলি থাকে Dockerfile:

FROM python:3.8 as build-python
FROM python:3.8-slim

রেখাটি পেতে স্ট্রিংগুলি রয়েছে: FROM pythonএবং as build-pythonতারপরে ব্যবহার করুন:

$ grep -E "FROM python:(?.*) as build-python" Dockerfile

তারপরে আউটপুট কেবল উভয় স্ট্রিং যুক্ত রেখাটি প্রদর্শন করবে :

FROM python:3.8 as build-python

-2

ripgrep

এখানে উদাহরণ ব্যবহার করে rg:

rg -N '(?P<p1>.*string1.*)(?P<p2>.*string2.*)' file.txt

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

এটি ব্যবহার করুন, বিশেষত যখন আপনি একটি বড় ডেটা নিয়ে কাজ করছেন।

জিএইচ -875 এ সম্পর্কিত বৈশিষ্ট্য অনুরোধটি দেখুন ।


1
এই উত্তরটি বেশ সঠিক নয়। নামকৃত ক্যাপচারিং গ্রুপগুলি অপ্রয়োজনীয় এবং এর string2আগে উপস্থিত হওয়ার পরে এটি কেস পরিচালনা করে না string1। এই সমস্যার সহজ সমাধান হ'ল rg string1 file.txt | rg string2
বার্টসুশি 5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.