जवाबों:
बस regexp एंकर निर्दिष्ट करें।
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Grep मैन पेज से:
-F, --fixed-strings
PATTERN को एक (निश्चित) की सूची के रूप में व्याख्या करें
-x, --line-regexp
केवल उन मैचों का चयन करें जो पूरी लाइन से मेल खाते हैं।
-F
? क्या आप सोलारिस पर हैं? यदि ऐसा है तो/usr/xpg4/bin/grep
grep
बैश स्क्रिप्ट के अंदर उपयोग कर रहा हूं और यह विकल्प नियमित अभिव्यक्ति का उपयोग करने से बेहतर है जैसा कि स्वीकृत उत्तर में सुझाया गया है। क्योंकि चर के अंदर मेरा कुछ विशेष चरित्र है, जिसे मैं खोज रहा हूं (जैसे .
) और कमांड का उपयोग करते समय मुझे उनसे बचना नहीं चाहिए।
यहाँ मैं क्या कर रहा हूँ, हालांकि एंकर का उपयोग करना सबसे अच्छा तरीका है:
grep -w "ABB.log " a.tmp
ABB.log
, जो सामान्य मामला नहीं है, अर्थात यह ज्यादातर समय विफल रहेगा।
अधिकांश सुझाव विफल हो जाएंगे यदि एक ही अग्रणी या अनुगामी स्थान के रूप में बहुत कुछ है, जो कि अगर फ़ाइल को हाथ से संपादित किया जा रहा है, तो कोई फर्क नहीं पड़ेगा। यह उस मामले में कम संवेदनशील होगा:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
खोल में पढ़ा जाने वाला एक सरल लूप यह अंतर्निहित रूप से करेगा:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
इसी तरह जागरण के साथ
awk '/^ABB\.log$/' file
मैं ओपी के प्रयासों और अन्य उत्तरों के संबंध में कुछ अतिरिक्त स्पष्टीकरण जोड़ना चाहता हूं।
आप इस तरह से भी जॉन कुगेलमन्स के समाधान का उपयोग कर सकते हैं :
grep -x "ABB\.log" a.tmp
स्ट्रिंग को उद्धृत करना और डॉट से बचना ( .
) से -F
ध्वज को किसी भी अधिक की आवश्यकता नहीं है ।
आपको .
(डॉट) से बचने की जरूरत है (क्योंकि यह किसी भी पात्र से मेल खाता है (न केवल .
) यदि बच नहीं गया है) या -F
grep के साथ ध्वज का उपयोग करें । -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
-x
पूरी लाइन से मेल खाने के लिए मजबूर करता है।.
बिना -F
ध्वज के भागे हुए गैर का उपयोग करने के उत्तर गलत हैं।-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
अगर .
सही तरीके से बच गया तो इसकी आवश्यकता क्यों नहीं होगी ।
-F
जब आप यह लिखा था तब उपलब्ध था? यदि नहीं, तो आप किस प्रणाली का उपयोग कर रहे थे? मुझे अब तक आपके उत्तर में वह जानकारी नहीं मिल पाई है, जो अब भी है जब मैंने इसे फिर से पढ़ा। तो वास्तव में यकीन है, मैंने आपके उत्तर को कम से कम दो बार पूरी तरह से पढ़ा। ;)
-F
उपलब्ध था। (मैंने कहा: "या -F
ध्वज का उपयोग करें grep
")
-F
उत्तर है, तो भागने के बारे में क्यों परेशान हैं? उस बारे में आपकी क्या राय है?
जब मैंने कुछ ऐसा ही करने की कोशिश की तो यह मेरे लिए अच्छा रहा:
grep -F ABB.log a.tmp
$ 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
$
यह HPUX के साथ है, यदि फ़ाइलों की सामग्री में शब्दों के बीच जगह है, तो इसका उपयोग करें:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
मुझे इस सुविधा की आवश्यकता थी, लेकिन यह भी सुनिश्चित करना चाहता था कि मैं ABB.log से पहले एक उपसर्ग के साथ लाइनें नहीं लौटाऊंगा:
grep "\WABB.log$" -w a.tmp
\W
संतुष्ट है, जो कि कोई भी गैर व्हाट्सएप चरित्र है, इसलिए xABBxlog
।