अगर पूरी लाइन मेल खाती है तो केवल grep का मिलान कैसे करें?


104

मेरे पास ये हैं:

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123

मैं ABB.log का एक सटीक मैच खोजना चाहता था।

लेकिन जब मैंने किया

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123

यह उन सभी को दर्शाता है।

क्या मुझे वह मिल सकता है जो मैं grep का उपयोग करना चाहता था?

जवाबों:


105

बस regexp एंकर निर्दिष्ट करें।

grep '^ABB\.log$' a.tmp

2
दोनों एंकर (^ और $) की जरूरत है।
user562374

2
अच्छा है! और अगर मैं एक फ़ाइल से मिलान के लिए regex का उपयोग कर रहा हूं? "grep -f पैटर्न a.tmp" ??
ग्रीन 69

@ ग्रीन 69 कई साल देरी से, लेकिन आप पैटर्न को पास करने से पहले एंकर को जोड़ने के लिए sed का उपयोग कर सकते हैं:sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Randoms

155
grep -Fx ABB.log a.tmp

Grep मैन पेज से:

-F, --fixed-strings
PATTERN को एक (निश्चित) की सूची के रूप में व्याख्या करें
-x, --line-regexp
केवल उन मैचों का चयन करें जो पूरी लाइन से मेल खाते हैं।


2
दुर्भाग्य से -F का उपयोग करने में सक्षम नहीं था।
जॉनी

@ जॉनी नहीं -F? क्या आप सोलारिस पर हैं? यदि ऐसा है तो/usr/xpg4/bin/grep
स्क्रूटिनाइज़र

9
मैं grepबैश स्क्रिप्ट के अंदर उपयोग कर रहा हूं और यह विकल्प नियमित अभिव्यक्ति का उपयोग करने से बेहतर है जैसा कि स्वीकृत उत्तर में सुझाया गया है। क्योंकि चर के अंदर मेरा कुछ विशेष चरित्र है, जिसे मैं खोज रहा हूं (जैसे .) और कमांड का उपयोग करते समय मुझे उनसे बचना नहीं चाहिए।
गुस्तावो स्ट्राबे

1
सर्वश्रेष्ठ उत्तर IMO क्योंकि यह भागने के बिना विशेष वर्णों की अनुमति देता है
ReneGAED

1
यह बेहतर है क्योंकि यह चर के साथ भी काम करता है।
यबेनजिरा

23

यहाँ मैं क्या कर रहा हूँ, हालांकि एंकर का उपयोग करना सबसे अच्छा तरीका है:

grep -w "ABB.log " a.tmp

इस तरह .. यह
user765443

1
इसके बाद एक स्थान की आवश्यकता होती है ABB.log, जो सामान्य मामला नहीं है, अर्थात यह ज्यादातर समय विफल रहेगा।
जाहिद

3

अधिकांश सुझाव विफल हो जाएंगे यदि एक ही अग्रणी या अनुगामी स्थान के रूप में बहुत कुछ है, जो कि अगर फ़ाइल को हाथ से संपादित किया जा रहा है, तो कोई फर्क नहीं पड़ेगा। यह उस मामले में कम संवेदनशील होगा:

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp

खोल में पढ़ा जाने वाला एक सरल लूप यह अंतर्निहित रूप से करेगा:

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp


1

मैं ओपी के प्रयासों और अन्य उत्तरों के संबंध में कुछ अतिरिक्त स्पष्टीकरण जोड़ना चाहता हूं।

आप इस तरह से भी जॉन कुगेलमन्स के समाधान का उपयोग कर सकते हैं :

grep -x "ABB\.log" a.tmp

स्ट्रिंग को उद्धृत करना और डॉट से बचना ( .) से -Fध्वज को किसी भी अधिक की आवश्यकता नहीं है ।

आपको .(डॉट) से बचने की जरूरत है (क्योंकि यह किसी भी पात्र से मेल खाता है (न केवल .) यदि बच नहीं गया है) या -Fgrep के साथ ध्वज का उपयोग करें । -Fध्वज इसे एक निश्चित स्ट्रिंग बनाता है (रेगेक्स नहीं)।

यदि आप स्ट्रिंग को उद्धृत नहीं करते हैं, तो आपको डॉट ( .) से बचने के लिए डबल बैकस्लैश की आवश्यकता हो सकती है :

grep -x ABB\\.log a.tmp


परीक्षा:

$ echo "ABBElog"|grep -x  ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x  "ABB\.log"
#returns empty string, no match


ध्यान दें:

  1. -x पूरी लाइन से मेल खाने के लिए मजबूर करता है।
  2. .बिना -Fध्वज के भागे हुए गैर का उपयोग करने के उत्तर गलत हैं।
  3. आप के -xसाथ ^और अपने पैटर्न स्ट्रिंग लपेटकर स्विच से बच सकते हैं $। इस मामले मेकअप में सुनिश्चित करें कि आप उपयोग नहीं करते -Fहैं, बजाय भागने ., क्योंकि -Fकी regex व्याख्या कर पाएगा ^और $


संपादित करें: (@ खरे के संबंध में अतिरिक्त विवरण जोड़ते हुए):

यदि आप एक स्ट्रिंग से मेल खाना चाहते हैं -, तो आपको --grep का उपयोग करना चाहिए । जो कुछ भी --इनपुट के रूप में लिया जाएगा (विकल्प नहीं)।

उदाहरण:

echo -f |grep -- "-f"     # where grep "-f" will show error
echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename

क्या आपको वास्तव में अनुभव हुआ कि -F आपके मामले में गायब था? यदि हां, तो क्या आप यह कह सकते हैं कि कौन सा मामला था?
hakre

@ ठाकरे क्या आपने मेरा जवाब पूरी तरह से पढ़ा है? मैंने समझाया (बहुत स्पष्ट रूप से) -Fअगर .सही तरीके से बच गया तो इसकी आवश्यकता क्यों नहीं होगी ।
जाहिद

ज़रूर। ज़रूर, मैं बस पूछ रहा हूँ: -Fजब आप यह लिखा था तब उपलब्ध था? यदि नहीं, तो आप किस प्रणाली का उपयोग कर रहे थे? मुझे अब तक आपके उत्तर में वह जानकारी नहीं मिल पाई है, जो अब भी है जब मैंने इसे फिर से पढ़ा। तो वास्तव में यकीन है, मैंने आपके उत्तर को कम से कम दो बार पूरी तरह से पढ़ा। ;)
हैक्रे

@ खाक का कोर्स -Fउपलब्ध था। (मैंने कहा: "या -Fध्वज का उपयोग करें grep")
जाहिद 15

अंतर्दृष्टि के लिए धन्यवाद। सिर्फ एक लिट्टल प्रश्न शेष है: यदि -Fउत्तर है, तो भागने के बारे में क्यों परेशान हैं? उस बारे में आपकी क्या राय है?
16


-1
    $ cat venky
    ABB.log
    ABB.log.122
    ABB.log.123

    $ cat venky | grep "ABB.log" | grep -v "ABB.log\."
    ABB.log
    $

    $ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
    ABB.log.122
    $

1
यह एबीबी.लॉग के साथ समाप्त होने वाली फ़ाइलों से भी मेल खाएगा और डॉट्स को बच जाना चाहिए।
स्क्रूटिनीज़र

-1

मेरे लिए काम करता है :

grep "\bsearch_word\b" text_file > output.txt  

\b संकेत / सीमा निर्धारित करता है।

बहुत तेजी से काम करने लगता है


यह किसी भी रेखा से मेल खाता है जिसमें search_wordशब्द सीमाएं अलग होती हैं। उदाहरण के लिए, यह लाइन, "फू सर्च_वार्ड बार" से मेल खाएगा।
रोहन सिंह

-2

यह HPUX के साथ है, यदि फ़ाइलों की सामग्री में शब्दों के बीच जगह है, तो इसका उपयोग करें:

egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp


ओपी पूरी लाइन से मेल खाना चाहता था, लाइन के भीतर स्पेस-सीमांकित शब्द नहीं।
कीथ थॉम्पसन


-3

मुझे इस सुविधा की आवश्यकता थी, लेकिन यह भी सुनिश्चित करना चाहता था कि मैं ABB.log से पहले एक उपसर्ग के साथ लाइनें नहीं लौटाऊंगा:

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log

grep "\WABB.log$" -w a.tmp

यह केवल तभी मैच करेगा जब अग्रणी \Wसंतुष्ट है, जो कि कोई भी गैर व्हाट्सएप चरित्र है, इसलिए xABBxlog
bschlueter
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.