कैसे grep, कुछ पैटर्न को छोड़कर?


84

मैं कुछ पैटर्न की घटना और कुछ अन्य पैटर्न की अनुपस्थिति के साथ फाइलों में लाइनें ढूंढना चाहता हूं। उदाहरण के लिए, मुझे उन सभी फ़ाइलों / लाइनों को खोजने की आवश्यकता है, loomजिनके साथ कोई अपवाद नहीं है gloom। इसलिए, मैं loomकमांड के साथ पा सकता हूं :

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

अब, मैं loomबहिष्कृत खोज करना चाहता हूँ gloom। हालाँकि, निम्नलिखित दोनों आदेश विफल रहे:

grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)

मुझे अपना लक्ष्य प्राप्त करने के लिए क्या करना चाहिए?

संपादित 1: मेरा मतलब है किloomऔरgloomचरित्र अनुक्रम हैं (जरूरी नहीं कि शब्द)। इसलिए, मुझे उदाहरण के लिए,bloombergकमांड आउटपुट में और आवश्यकता नहीं हैungloomy

EDIT 2: मेरी उम्मीदों का नमूना है। निम्नलिखित दोनों लाइनें कमांड आउटपुट में हैं:

मैं प्रतीक है कि सामना करना पड़ा छाया हुआ था धूप का घूंघट के माध्यम से।

आर्टि है slooming एक में उदास दिन।

निम्नलिखित दोनों लाइनें कमांड आउटपुट में नहीं हैं:

यह ग्‍लोमैटिन 'ऑवर भयानक - महान मैकल डोलर्स ओ' फ्लड है।

दक्षिण पश्चिम में हेयट पाइनटिट हॉल


क्या आप उन फ़ाइलों की तलाश कर रहे हैं जो आपके मानदंड से मेल खाने वाली लाइनों के मानदंड से मेल खाती हों?
जूटो

मैं अपने मापदंड से मेल खाने वाली लाइनों की फाइल खोज रहा हूँ। और मैं सभी सेटों की सूची का नाम + मिलान लाइन + मिलान लाइन की संख्या देखना चाहता हूं।
लूम

यदि रेखा होती there is a loom in the gloom- तो क्या आप उस पंक्ति को मुद्रित करना चाहते हैं? बस यह समझने की कोशिश कर रहे हैं कि क्या आप उन लाइनों की तलाश कर रहे हैं, जहां करघा के हिस्से के अलावा करघा होता है या यदि आप वास्तव में जब रेखा पर कहीं और खुद ही दिखाई देते हैं तो भी उदासी से भरी लाइनों को छोड़ना चाहते हैं। कुछ नमूना इनपुट और अपेक्षित आउटपुट पोस्ट करने से मदद मिलेगी।
एड मॉर्टन

तो आपका प्रश्न वास्तव में है How do I find lines containing the string "loom" where "loom" is not preceded by the letter "g"? यदि आप कुछ नमूना इनपुट और वांछित आउटपुट पोस्ट करते हैं जो बहुत मदद करेगा। उस प्रश्न का उत्तर नीचे दिए गए उत्तरों में शामिल है।
एड मॉर्टन

1
@EdMorton - हां, आप सही हैं - मुझे सभी लाइनों की आवश्यकता है, जहां loomपूर्ववर्ती के बिना होता है g। (मुझे खेद है। मैं कल टिप्पणी करना शुरू कर दिया था, लेकिन कभी समाप्त नहीं हुआ। संयोग से यह टिप्पणी भेजी गई थी।)
लूम

जवाबों:


102

कैसे के बारे में सिर्फ greps का पीछा?

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

13
सही समय पर। अच्छी तरह से काम। -v को बाहर करने का विकल्प है। साभार
रवि कृष्ण पी

2
प्रश्न से: तो, मुझे उदाहरण के लिए, bloombergकमांड आउटपुट में और आवश्यकता नहीं है ungloomy यदि एक एकल पंक्ति में '... और ब्लूमबर्ग संभावनाओं के बारे में अस्पष्ट है ...', तो आप उस पंक्ति को समाप्त कर देंगे, लेकिन यह वांछित है (क्योंकि यदि शामिल है bloomberg)।
जोनाथन लेफलर

23

जंजीर के बिना एक और समाधान grep:

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

कोष्ठक के बीच, आप gकिसी भी घटना से पहले वर्ण को बाहर कर देते हैं loom, जब तक loomकि पंक्ति का पहला वर्ण नहीं होता है।


9

थोड़ा पुराना, लेकिन ओह अच्छा ...

@Houbysoft से सबसे अधिक मतदान वाला समाधान काम नहीं करेगा क्योंकि इसमें "ग्लोम" के साथ किसी भी रेखा को बाहर रखा जाएगा, भले ही "लूम" हो। ओपी की अपेक्षाओं के अनुसार, हमें "लूम" के साथ लाइनें शामिल करने की आवश्यकता है, भले ही उनके पास "ग्लोम" भी हो। इस पंक्ति को आउटपुट में होना चाहिए "आर्टी एक उदास दिन में घट रहा है।", लेकिन इसे एक जंजीर की तरह बाहर रखा जाएगा

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

इसके बजाय, बेंटॉय 13 का एग्रेप रेगेक्स उदाहरण बेहतर काम करता है

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

क्योंकि इसमें "लूम" के साथ कोई भी रेखा शामिल होगी, भले ही "ग्लोम" हो या न हो। दूसरी ओर, यदि इसमें केवल उदासी है, तो इसमें वह शामिल नहीं होगा, जो ठीक वही व्यवहार है जिसे ओपी चाहता है।


8

बस awk का उपयोग करें, यह स्पष्ट रूप से यौगिक स्थितियों को व्यक्त करने में grep की तुलना में बहुत सरल है।

यदि आप उन लाइनों को छोड़ना चाहते हैं जिनमें दोनों हैं loomऔर gloom:

awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

या यदि आप उन्हें प्रिंट करना चाहते हैं:

awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

और अगर वास्तविकता यह है कि आप केवल वे ही रेखाएँ चाहते हैं जहाँ loomएक शब्द के रूप में प्रकट होता है:

awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

3
कैसे आप एक ग्रेप आदेश लिखते हैं लाइनों, जिनमें शामिल है पाने के लिए के बारे में सोचो abcऔर defऔर ghiकिसी भी क्रम में। अब उस से तुलना करें awk '/abc/ && /def/ && /ghi/'। अब awk '/loom/ && !/gloom/'इस पृष्ठ के उत्तर में grep कैसे लिखा जा रहा है, इसके बारे में सोचें ।
एड मॉर्टन

मैं awk से बहुत परिचित नहीं हूं, जाहिरा तौर पर इस कमांड के बारे में किताबें हैं। अभी के लिए मैं grep के साथ ठीक हूं, शायद एक दिन मैं वही कहूंगा जो आपने किया था। :)
जूटो

2
awk मानक UNX उपकरण है (यानी सभी UNIX प्रतिष्ठानों पर उपलब्ध) पाठ फ़ाइलों को संसाधित करने के लिए। यही इसे करने के लिए आविष्कार किया गया था और यह इस पर बहुत अच्छा है। यदि आप UNIX पर हैं और पाठ फ़ाइलों को पार्स कर रहे हैं, तो अर्नोल्ड रॉबिन्स की पुस्तक इफेक्टिव ऑक प्रोग्रामिंग, थर्ड एडिशन से जागना सीखें। condition { action }सिंटैक्स को संबंधित करने के लिए एक छोटा सा बदलाव है, लेकिन फिर यह किसी भी सी या अन्य अल्गोल-भाषा के अनुभव वाले किसी के लिए एक हवा है।
एड मॉर्टन

बोनस: आउटपुट जैसे grep -Hn --color:awk '/loom/ && !/gloom/ { gsub(/loom/, color("1;31") "&" color(0)); print color(35) FILENAME color(36) ":" color(32) FNR color(36) ":" color(0) $0; }; function color(c) { return "\033[" c "m"; }'
उलझन

6

-v "उलटा मिलान" ध्वज है, इसलिए पाइपिंग एक बहुत अच्छा तरीका है:

grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"


5

/ * आप इस तरह से कुछ देख रहे होंगे?

grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`

BACKQUOTES का उपयोग कमांड के लिए कोष्ठक की तरह किया जाता है, इसलिए इस मामले में -lसक्षम होने पर, BACKQUOTES में कोड आपको फ़ाइल नाम वापस कर देगा, फिर -van के साथ वही करना होगा जो आप चाहते थे: फ़ाइल नाम, लिनन्यूट्स, और वास्तविक लाइनें भी हों।

अद्यतन या xargs के साथ

grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"

उम्मीद है की वो मदद करदे।*/

कृपया ध्यान दें कि मैंने ऊपर जो लिखा है, वह बकवास है।

grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"

               #this part gets the filenames with "loom"
#this part gets the lines with "loom"
                                          #this part gets the linenumber,
                                          #filename and actual line

4

आप grep -P(perl regex) समर्थित का उपयोग कर सकते हैं negative lookbehind:

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)

मैंने \bशब्द सीमाओं के लिए जोड़ा ।


2
आपको एक खोजबीन की जरूरत नहीं है, \([^g]\|^\)काम करता है। और यह दोनों loomऔर के साथ लाइनों को बाहर नहीं करता है gloom
केविन

@ केविन: ओपी लूम के साथ लाइनों को खोजना चाहता है लेकिन not gloom
शुभ

बिल्कुल सही। यदि एक पंक्ति में दोनों हैं, तो वह इसे नहीं चाहता है लेकिन यह वैसे भी मेल खाएगा।
केविन

@ केविन: यह उदासी से मेल नहीं खाएगा लेकिन लूम से मेल खाएगा (जैसा कि ओपी चाहता है)।
अनुभा

प्रश्न से: तो, मुझे उदाहरण के लिए, bloombergकमांड आउटपुट में और आवश्यकता नहीं है ungloomy इस प्रकार, शब्द सीमाएँ प्रतिसंबंधी हैं।
जोनाथन लेफ़लर

3
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

प्रश्न से: तो, मुझे उदाहरण के लिए, bloombergकमांड आउटपुट में और आवश्यकता नहीं है ungloomy यदि एक एकल पंक्ति में '... और ब्लूमबर्ग संभावनाओं के बारे में अस्पष्ट है ...', तो आप उस पंक्ति को समाप्त कर देंगे, लेकिन यह वांछित है (क्योंकि यदि शामिल है bloomberg)।
जोनाथन लेफलर

@JonathanLeffler "मुझे उन सभी फ़ाइलों / लाइनों को खोजने की आवश्यकता है जिनमें करघा के अलावा करघा भी शामिल है।"
जुमिन

3

बस उपयोग करें! grep -vकई बार।

फ़ाइल की सामग्री

[root@server]# cat file
1
2
3
4
5

लाइन या मैच को छोड़ दें

[root@server]# cat file |grep -v 3
1
2
4
5

लाइन को अलग करें या एकाधिक का मिलान करें

[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4

0

प्रश्न: 'उदासी' को छोड़कर 'करघा' की खोज करें।
उत्तर:

grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

1
प्रश्न से: तो, मुझे उदाहरण के लिए, bloombergकमांड आउटपुट में और आवश्यकता नहीं है ungloomy मुझे नहीं लगता कि -wयह उस समस्या का समाधान है।
जोनाथन लेफ्लर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.