जवाबों:
आप का उपयोग कर ऐसा कर सकते हैं -v(के लिए --invert-match) के रूप में ग्रेप का विकल्प:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" fileउन पंक्तियों को फ़िल्टर करेगा जिनमें- unwanted_wordऔर grep XXXXXXXXपैटर्न के साथ केवल लाइनें सूचीबद्ध होंगीXXXXXXXX ।
संपादित करें:
आपकी टिप्पणी से ऐसा लगता है कि आप बिना सभी लाइनों को सूचीबद्ध करना चाहते हैं unwanted_word। उस मामले में आप सभी की जरूरत है:
grep -v 'unwanted_word' file
-v 'unwanted_word' --after Nमदद नहीं करता क्योंकि यह लाइन और एन लाइनों को शामिल करता है।
-vया --invert-matchगैर-मिलान लाइनों का चयन करें। आपके मामले में grep -v 'unwanted_word' fileया grep --invert-match 'unwanted_word' file।
git status -s |grep -v "folder_I_dont_care"
sun , तो जब यह होता है sunrise, तब छोड़ देता है , grep sun|grep -v sunriseजिसमें रेखाएं होती हैं sunऔर दोनों sunriseएक ही बार में होती हैं, यही वह नहीं है जो मैं चाहता हूं। grep -P 'sun(?!rise)'ज़्यादा बेहतर है।
मैंने इस सवाल को समझा कि "मैं किसी शब्द से कैसे मेल खाता हूं, लेकिन दूसरे को बाहर करता हूं", जिसके लिए एक समाधान श्रृंखला में दो greps है: पहला grep "word1", दूसरा grep "word2" को छोड़कर:
grep "word1" | grep -v "word2"
मेरे मामले में: मुझे "प्लॉट" और "# प्लॉट" के बीच अंतर करने की आवश्यकता है जो कि grep का "शब्द" विकल्प नहीं करेगा ("#" अल्फ़ान्यूमेरिकल नहीं है)।
उम्मीद है की यह मदद करेगा।
word1।
यदि आप विकल्प के grepसाथ पर्ल रेगुलर एक्सप्रेशन का समर्थन -Pकरते हैं, तो आप कर सकते हैं (यदि bash; यदि tsh को आपको भागने की आवश्यकता होगी !):
grep -P '(?!.*unwanted_word)keyword' file
डेमो:
$ cat file
foo1
foo2
foo3
foo4
bar
baz
अब हम सभी fooको छोड़कर सूची देंfoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -Pनियमित अभिव्यक्ति में बिना नकार के भी काम करता है।
!" । धन्यवाद धन्यवाद धन्यवाद! यही तो मैं चाहता था!
सही समाधान का उपयोग करना है grep -v "word" file, इसके awkसमकक्ष:
awk '!/word/' file
हालाँकि, यदि आपके पास एक और अधिक जटिल स्थिति है जिसमें आप चाहते हैं, कहते हैं, XXXप्रकट होना और प्रकट YYY नहीं होना है, तो awkकई grepएस पाइप करने के बजाय काम आता है :
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^
# I want it |
# I don't want it
आप कुछ अधिक जटिल भी कह सकते हैं। उदाहरण के लिए: मैं उन पंक्तियों को या तो शामिल करना चाहता हूं XXXया YYYनहीं ZZZ:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
आदि।
grep -Pबड़ी फ़ाइलों पर समाधान की तुलना में बहुत तेज़ प्रतीत होता है ।
grep -Pअर्थ है पर्ल रीजेक्सपी का उपयोग करना, इसलिए उस पैकेज को लोड करना सामान्य से अधिक महंगा होने जा रहा है grep।
गैर-मिलान लाइनों का चयन करने के लिए grep '-v' या '--invert-match' विकल्प प्रदान करता है।
जैसे
grep -v 'unwanted_pattern' file_name
यह फ़ाइल file_name से सभी पंक्तियों को आउटपुट करेगा, जिसमें 'अवांछित_पाटन' नहीं है।
यदि आप किसी फ़ोल्डर के अंदर कई फ़ाइलों में पैटर्न खोज रहे हैं, तो आप निम्नानुसार पुनरावर्ती खोज विकल्प का उपयोग कर सकते हैं
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
यहाँ grep वर्तमान में निर्देशिका से सभी फाइलों में 'चाहता था_पाटन' की सभी घटनाओं को सूचीबद्ध करने का प्रयास करेगा और 'अवांछित_पाटन' को फ़िल्टर करने के लिए इसे दूसरे grep में उत्तीर्ण करेगा। '|' - पाइप बाएं प्रोग्राम के मानक आउटपुट (grep -r 'वांट_पैटर्न' *) को राइट प्रोग्राम के स्टैंडर्ड इनपुट (grep -v 'अवांछित_पाटन') से जोड़ने के लिए शेल को बताएगा।
मैं फ़ाइलों की एक गुच्छा के साथ एक निर्देशिका है। मैं उन सभी फाइलों को खोजना चाहता हूं जिनमें स्ट्रिंग "स्पीडअप" नहीं है, इसलिए मैंने निम्नलिखित कमांड का सफलतापूर्वक उपयोग किया है:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"