2010-11-25 13 views
18

के लिए निर्देशिका में सभी फ़ाइलों को खोजें BOTH शब्दों वाली सभी फ़ाइलों को खोजने के लिए मैं साइगविन में grep का उपयोग कैसे कर सकता हूं।Grep स्ट्रिंग 1 और स्ट्रिंग 2

grep -r "db-connect.php" . 

कैसे मैं ऊपर विस्तार कर सकते हैं फ़ाइलों कि दोनों "db-connect.php" शामिल हैं देखने के लिए और ":

यह मैं रिकर्सिवली एक शब्द के लिए एक निर्देशिका में सभी फ़ाइलों को खोज करने के लिए का उपयोग क्या है संस्करण "।

मैंने यह कोशिश की: grep -r "db-connect.php\|version" . लेकिन यह एक है यानी यह फ़ाइल प्राप्त करता है जिसमें एक या दूसरे शामिल होते हैं।

सब किसी भी मदद

+0

तुम सिर्फ दो greps कर सकता है। एक के लिए एक शब्द और एक दूसरे के लिए और फिर मिलान की गई फ़ाइलों का चौराहे ढूंढें। यह * वह * तुच्छ नहीं है लेकिन मुझे नहीं पता कि यह करने का एक बेहतर तरीका है या नहीं। –

उत्तर

20
grep -r db-connect.php . | grep version 
+0

शानदार, धन्यवाद। लौटाई गई फ़ाइलों की अपेक्षा से कम लगता है। जांच कर रहा है ... – Abs

+0

ठीक है, यह काम करता है! – Abs

+11

यह मिस केस नहीं है जहां वे दोनों फाइल में हैं लेकिन विभिन्न लाइनों पर हैं? – lathomas64

3

grep "db-connect.php" के लिए धन्यवाद * | कट-डी: -एफ 1 | xargs grep "संस्करण"

मैंने इसे रिकर्सिव मोड में नहीं आज़माया लेकिन यह वही होना चाहिए।

+0

यह उन फ़ाइलों को वापस नहीं करता है जहां दोनों स्ट्रिंग्स हैं, यह इसे एक या दूसरे के लिए देता है। सही? – Abs

+1

ठीक है, नहीं, इसे दो तारों वाली सभी फ़ाइलों को वापस करना चाहिए (विभिन्न पंक्तियों पर तारों को थ्रॉज करना)। कोशिश करें: grep "db-connect.php" * | कट-डी: -एफ 1 | xargs grep "संस्करण" | cut -f1 -d: केवल फ़ाइल नाम रखने के लिए ... – jzrk

+0

वह अंतिम आदेश उपयोगी है, जिस फाइल को चेक करने के लिए आवश्यक है उसकी पुष्टि करने में मदद मिली। इसलिए आपका धन्यवाद। +1। – Abs

1

क्या आपका मतलब "स्ट्रिंग 1" और "स्ट्रिंग 2" एक ही पंक्ति पर है?

grep 'string1.*string2' 

उसी पंक्ति पर लेकिन अनिश्चित आदेश में?

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

या दोनों स्ट्रिंग कहीं भी फ़ाइल में दिखाई देनी चाहिए?

grep -e string1 -e string2 
+1

वह अंतिम 'grep' string1 \ string2 जैसा ही है '' और '' '' '' 'नहीं है। –

1

बहु मिलान के साथ PCRE (पर्ल-संगत रेगुलर एक्सप्रेशन) का उपयोग करता है और फ़ाइलों है कि दोनों तार (AND बजाय OR) होते हैं की फ़ाइल नाम देता है।

grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' . 
3

and एक साथ एक से अधिक खोजें करने के लिए, कई अग्रदर्शी कथनों का उपयोग करें, बात प्रति एक पिछले एक से अलग के लिए देखा: बजाय

grep -P A * | grep B 

लिखने की

आप लिखते हैं

grep -P '(?=.*A)B' * 

grep -Pr '(?=.*db-connect\.php)version' . 

लिखें

grep -P 'A.*B|B.*A' * 

क्योंकि यह ओवरलैप पर विफल रहता है, जबकि (?=…)(?=…) तकनीक नहीं है।

आप NOT ऑपरेटरों में भी जोड़ सकते हैं। X से मेल खाने वाली लाइनों की खोज करने के लिए, आप आमतौर पर कमांड लाइन पर -v का उपयोग करते हैं। लेकिन आप ऐसा नहीं कर सकते हैं अगर यह एक बड़े पैटर्न का हिस्सा है। जब ऐसा होता है, तो आप के साथ कुछ भी बाहर करने के लिए पैटर्न में (?=(?!X).)*$) जोड़ते हैं।

तो कल्पना करें कि आप सभी तीन ए, बी, और फिर सी या डी, के साथ लाइनों से मेल खाना चाहते हैं, लेकिन जिनमें एक्स या वाई नहीं है।आपको बस यह चाहिए:

grep -P '(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D' * 

कुछ गोले और कुछ सेटिंग्स में। यदि आपको अपना इतिहास-प्रतिस्थापन चरित्र है तो आपको ! से बचना होगा।

वहां, क्या यह बहुत अच्छा नहीं है?

3

मेरी Cygwin दिए गए उत्तर में काम नहीं किया है, लेकिन निम्नलिखित किया:

grep -l firststring `grep -r -l secondstring . ` 
4

आप एक फ़ाइल में कई श्रृंखलाएं जिनमें अलग लाइनों के लिए grep के लिए, निम्न आदेश का उपयोग करना चाहते हैं:

grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3 

यह आपको उन फ़ाइलों की सूची देगा जिनमें expr1, expr2, और expr3 शामिल हैं।

ध्यान दें कि यदि निर्देशिका में मौजूद किसी फ़ाइल नाम में रिक्त स्थान हैं, तो ये फ़ाइलें त्रुटियां उत्पन्न करेंगी। इसे जोड़कर तय किया जा सकता है -0 मुझे लगता है कि grep और xargs।

+0

व्हाइटस्पेस वर्णों के साथ फ़ाइल नामों को संभालने के लिए शून्य डिलीमीटर का उपयोग करने के लिए: 'grep -rl -Z expr1 | xargs -0 grep -l -Z expr2 | xargs -0 grep -Z -l expr3'। –

0

क्यों केवल ग्रेप से चिपक:

perl -lne 'print if(/db-connect.php/&/version/)' * 
संबंधित मुद्दे