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