Grep का उपयोग करके सटीक स्ट्रिंग का मिलान करें


63

मेरे पास एक टेक्स्ट फाइल है:

deiauk 1611516 afsdf 765
minkra 18415151 asdsf 4152
linkra sfsfdsfs sdfss 4555
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4
deiauk 1611516 afsdf ddfgfgd
luktol1 4545 4 9
luktol 1

और मैं बिल्कुल मैच करना चाहता हूं deiauk। जब मैं ऐसा करता हूं:

grep "deiauk" file.txt

मुझे यह परिणाम मिले:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

लेकिन मुझे केवल इसकी आवश्यकता है:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

मुझे पता है कि एक -wविकल्प है, लेकिन फिर मेरे तार को पूरी लाइन को मचाना है।


4
क्या आपने वास्तव में कोशिश की है grep -w? (यह विकल्प वास्तव में उस उद्देश्य के लिए है, और यह मेरे लिए काम करता है।) - नोट: विकल्प -xपूरी रेखा से मेल खाता है।
Janis

"मैं ठीक से मिलान करना चाहता हूंdeiauk / " मुझे केवल इसकी आवश्यकता है: deiauk 1611516 afsdf 765" - जो आपको चाहिए?
एलेक्स

जवाबों:


127

इनमें से एक आज़माएँ:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
यदि आपके पास स्ट्रिंग के अंत में एक डैश ( - ) है तो यह स्क्रिप्ट परिणाम के रूप में लाएगा, जिसकी उम्मीद नहीं थी।
एविस

सही @Evert: शब्दों में केवल अल्फा वर्ण, अंक और अंडरस्कोर शामिल हैं, इसलिए यदि आपके पास संक्षिप्त या अन्य आइटम हाइफ़न हैं, तो यह काम नहीं करता है।
ingyhere

@ साइरस मैंने *शब्दों पर vi / vim कमांड का उपयोग करते हुए दूसरा सीखा ।
शुवा

यह किसी भी विशेष चरित्र के लिए काम नहीं करता है, उदाहरण के लिए org.apache.avro avroइसके साथ greped org.apache.avro avro+mapred(* के साथ की कोशिश की)
विश्रांत

12

GNU के साथ इसे आज़माएँ grepऔर शब्द सीमाओं को चिह्नित करें \b:

grep "\bdeiauk\b" file

आउटपुट:

डीआयूक 1611516 एफएसडीएफ 765

देखें: http : //www. अनियमित-expressions.info/wordboundaries.html


धन्यवाद, लेकिन यह मेरे लिए काम क्यों नहीं कर रहा है? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

कोशिश करेंgrep "\b${vard}\b" file.txt
साइरस

1
अभी भी काम नहीं करता है: /
user3334375

आपको आवश्यकता होगी read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
साइरस

7

यदि आपका grepसमर्थन -P(PCRE), आप कर सकते हैं:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

4
यह एकमात्र उत्तर है जो हाइफ़न शब्दों के साथ काम करता है।
ingyhere

5

आपके वास्तविक डेटा के आधार पर, आप एक स्थान के बाद आने वाले शब्द की तलाश कर सकते हैं:

grep 'deiauk ' file.txt 

यदि आपको पता है कि यह लाइन के शुरू में होना है, तो इसके लिए जाँच करें:

grep '^deiauk ' file.txt 

अफसोस की बात है कि इसके अलावा अन्य सभी उत्तर गलत हैं।
शतु

@ शत्रु धन्यवाद! तो देखते हैं कि इसे "ऊपर तक बुलबुला" होने में कितना समय लगता है ... मैं उत्सुक हूं क्योंकि मैं पुराने सवालों के जवाब जोड़ना पसंद करता हूं ... मुझे लगता है कि यह माना जाता है कि यह करता है, लेकिन मुझे संदेह है। यह मेरे लिए अच्छा होगा, लेकिन वास्तव में पाठकों के लिए उपयोगी है। इसे एक अच्छा उदाहरण बनाने के लिए, क्या मैं आपसे एक टिप्पणी लिखने के लिए कह सकता हूँ जिसमें अन्य उत्तर गायब हैं?
वोल्कर सिएगल

(1) 10K प्रतिनिधि तक पहुंचने पर बधाई। अब आपको यह देखने का सौभाग्य मिला है कि यह उत्तर पहले दिया गया था, और हटा दिया गया था। (२) इस प्रश्न का उत्तर देना हमेशा बेहतर होता है कि जो कहा गया है, उसके आधार पर संभव है, और उस उत्तर को न दें जो सिर्फ नमूना डेटा के लिए काम करता है। ऐसा प्रतीत होता है, उदाहरण के डेटा से सवाल में, कि कॉलम रिक्त स्थान द्वारा अलग किए गए हैं - लेकिन यह निर्दिष्ट नहीं है। अन्य सभी उत्तर टैब से अलग किए गए कॉलम के लिए भी काम करेंगे। (3) आपने टैकोमी के (हटाए गए) उत्तर में घातक दोष को जोड़कर बचा लिया ^- लेकिन अन्य सभी उत्तर काम करते हैं ... (Cont'd)
G-Man

(Cont'd) ... यदि स्ट्रिंग पहले वाले के अलावा किसी अन्य फ़ील्ड में दिखाई देती है। (४) इसके अलावा, अन्य सभी उत्तर काम करते हैं यदि) डेयूक ’अंतिम क्षेत्र है (यानी, इसके बाद कुछ भी नहीं है)।
जी-मैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.