উত্তর:
grep -l string2 `grep -l string1 /path/*`
যা একই হিসাবে
grep -l string2 $(grep -l string1 /path/*)
সম্পাদনা করুন grep string1 /path/* | grep string2 আমি alwbtc কি মনে করি কি না।
$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$
কিছুই পাওয়া যায়নি, কিন্তু ফাইল বি উভয় স্ট্রিং রয়েছে।
আমি alwbtc কি মনে হয় এখানে
$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b
-l উভয় কমান্ডের জন্য বিকল্প সমান বিবেচিত হবে।
পাইপ এক grep অন্য মধ্যে:
grep "string1" /path/to/files/* | grep "string2"
এখানে সমতুল্য ACK কমান্ড RedGrittyBrick এর উত্তর :
ack string2 $(ack string1 -l)
একই ভাবে কাজ করে (ছাড়া ack ডিফল্টরূপে বর্তমান ডিরেক্টরি অনুসন্ধান করে)। মধ্যে বিষয়বস্তু $() জন্য অনুসন্ধান string1 কিন্তু -l আউটপুট শুধুমাত্র ফাইল নাম যেখানে যে স্ট্রিং পাওয়া যায় নি। তারপর বাইরের কমান্ডের মধ্যে আর্গুমেন্ট হিসাবে পাস করা হয়, যার অর্থ string2 শুধুমাত্র ফাইলের তালিকাগুলির মধ্যে অনুসন্ধান করা হয়।
comm -12 <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort) <(grep --fixed-strings --files-with-matches "STRING1" /path/to/files/* 2>/dev/null | sort)
বা কম redundantly:
search_files () { str="$1"; shift; grep -Fl "$str" "$@" 2>/dev/null | sort; }
comm -12 <(search_files "STRING1" /path/to/files/*) <(sf "STRING2" /path/to/files/*)
স্ট্রিংগুলি যদি একই ফাইলের বিভিন্ন লাইনগুলিতে থাকে তবে এটি কাজ করবে এবং যদি একটি ফাইলের নাম স্ট্রিংগুলির মধ্যে থাকে তবে মিথ্যা ইতিবাচকগুলি এড়ানো হবে।
@ RedGrittyBrick এর সমাধানটি সম্প্রসারিত করার জন্য যা কমান্ডটি অপ্রত্যাশিত প্লাসটি চালানোর সময় ত্রুটি আউটপুট দমন করার উদ্দেশ্যে এবং ফাইলগুলিকে পুনরাবৃত্তি করার জন্য পুনরাবৃত্তি করতে পারে তখন আপনি এটি বিবেচনা করতে পারেন
grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)
-s অপশন ত্রুটি বার্তা দমন করা হবে
-r অপশন ইচ্ছাকৃতভাবে nested ডিরেক্টরি মধ্যে স্ট্রিং জন্য অনুসন্ধান করতে পারবেন
! সংযুক্ত && echo /dev/null কমান্ড ঝুলানো হবে না যে গ্যারান্টি। অন্যথায়, যদি inner grep কোন ফাইল খুঁজে পাওয়া যায় না তাই এটি আউটপুট কিছু হবে না outer grep অনির্দিষ্টকালের জন্য অনুসন্ধান ইনপুট জন্য অপেক্ষা করবে। এই সমাধান আউটপুট /dev/null এই ক্ষেত্রে তাই outer grep জন্য অনুসন্ধান করা হবে STRING1 মধ্যে /dev/null যেখানে এটি কিছু খুঁজে না অনুমিত হয়।
-lলাইন পরিবর্তে ফাইল নাম ফেরত বিকল্প। তারপরে তিনি সেই লেনদেনটি পাস করতে ডলার চিহ্ন বা ব্যাক কোট ব্যবহার করছেনFILEদ্বিতীয় grep মধ্যে যুক্তি। এটি দ্বিতীয় grep আমার সমাধান হিসাবে পৃথক লাইন পরিবর্তে পাওয়া প্রতিটি ফাইল সম্পূর্ণতা অনুসন্ধান করতে পারবেন।