मैं grep के साथ एक शब्द कैसे छोड़ सकता हूं?


जवाबों:


801

आप का उपयोग कर ऐसा कर सकते हैं -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

2
क्या होगा अगर मैं "अवांछित शब्द" के साथ लाइन के बाद भी एन लाइनों को बाहर करना चाहता हूं? -v 'unwanted_word' --after Nमदद नहीं करता क्योंकि यह लाइन और एन लाइनों को शामिल करता है।
एंड्री रेजेंटोव

-vया --invert-matchगैर-मिलान लाइनों का चयन करें। आपके मामले में grep -v 'unwanted_word' fileया grep --invert-match 'unwanted_word' file
adamski.pro

मैं एक लाइन ऊपर और एक लाइन नीचे पैटर्न मिलान के साथ अनदेखा करना चाहता हूं तो मैं इसे कैसे प्राप्त कर सकता हूं?
कांजी विरोजा

बहुत बढ़िया, मैं इसका उपयोग अपने रेपो की स्थिति को जल्दी से करने के लिए एक आकर्षण की तरह काम करता हूं:git status -s |grep -v "folder_I_dont_care"
बेंजामिन

3
अजीब, यह शीर्ष उत्तर है, लेकिन कुछ मामलों में यह गलत है! अगर मैं खोजना चाहता हूंsun , तो जब यह होता है sunrise, तब छोड़ देता है , grep sun|grep -v sunriseजिसमें रेखाएं होती हैं sunऔर दोनों sunriseएक ही बार में होती हैं, यही वह नहीं है जो मैं चाहता हूं। grep -P 'sun(?!rise)'ज़्यादा बेहतर है।
ग्रीन

86

मैंने इस सवाल को समझा कि "मैं किसी शब्द से कैसे मेल खाता हूं, लेकिन दूसरे को बाहर करता हूं", जिसके लिए एक समाधान श्रृंखला में दो greps है: पहला grep "word1", दूसरा grep "word2" को छोड़कर:

grep "word1" | grep -v "word2"

मेरे मामले में: मुझे "प्लॉट" और "# प्लॉट" के बीच अंतर करने की आवश्यकता है जो कि grep का "शब्द" विकल्प नहीं करेगा ("#" अल्फ़ान्यूमेरिकल नहीं है)।

उम्मीद है की यह मदद करेगा।


16
आपको हाइलाइटिंग प्राप्त करने के लिए आदेश को उल्टा करना चाहिए word1
मैथ्यू पढ़ें

1
मुझे लगता है कि यह फ़ाइल नाम के लिए प्लेसहोल्डर को उस उदाहरण में जोड़ने के लिए स्पष्ट करेगा
पैट्रिक

39

यदि आप विकल्प के 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
$ 

इसके लिए धन्यवाद, बहुत उपयोगी! मैं यह उल्लेख करना चाहूंगा कि
ग्रीप

2
ध्यान दें कि grep -v -Pनियमित अभिव्यक्ति में बिना नकार के भी काम करता है।
साइबर स्पेस

"अगर बैश ... आपको भागने की आवश्यकता होगी !" । धन्यवाद धन्यवाद धन्यवाद! यही तो मैं चाहता था!
गेब्रियल स्टेपल्स

36

सही समाधान का उपयोग करना है 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

आदि।


2
यह grep -Pबड़ी फ़ाइलों पर समाधान की तुलना में बहुत तेज़ प्रतीत होता है ।
एमबीआर

@ एमबीआर का grep -Pअर्थ है पर्ल रीजेक्सपी का उपयोग करना, इसलिए उस पैकेज को लोड करना सामान्य से अधिक महंगा होने जा रहा है grep
फेडोरक्वी 'एसओ ने नुकसान पहुँचाया'


6

गैर-मिलान लाइनों का चयन करने के लिए 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 'अवांछित_पाटन') से जोड़ने के लिए शेल को बताएगा।


4

-vविकल्प आपको सारे लाइनों है कि पैटर्न से मेल नहीं खाते दिखाई देंगे।

grep -v ^unwanted_word

-5

मैं फ़ाइलों की एक गुच्छा के साथ एक निर्देशिका है। मैं उन सभी फाइलों को खोजना चाहता हूं जिनमें स्ट्रिंग "स्पीडअप" नहीं है, इसलिए मैंने निम्नलिखित कमांड का सफलतापूर्वक उपयोग किया है:

grep -iL speedup *

1
मैन पेज से: "-L, --files-without-match सामान्य आउटपुट को दबाएं; इसके बजाए प्रत्येक इनपुट फ़ाइल का नाम प्रिंट करें, जिसमें से कोई भी आउटपुट सामान्य रूप से प्रिंट नहीं होगा। स्कैनिंग पहले मैच पर रुक जाएगी। " (जोर मेरे द्वारा) तो इस से सावधान रहें!
xuiqzy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.