किसी को भी मेरे बीच तकनीकी मतभेद बता सकते हैं grep
, egrep
और fgrep
और प्रदान उपयुक्त उदाहरण?
जब मैं का उपयोग करने की आवश्यकता है grep
से अधिक egrep
है और इसके विपरीत?
किसी को भी मेरे बीच तकनीकी मतभेद बता सकते हैं grep
, egrep
और fgrep
और प्रदान उपयुक्त उदाहरण?
जब मैं का उपयोग करने की आवश्यकता है grep
से अधिक egrep
है और इसके विपरीत?
जवाबों:
ऐतिहासिक रूप से ये स्विच अलग-अलग बायनेरिज़ में प्रदान किए गए थे। कुछ वास्तव में पुरानी यूनिक्स प्रणालियों पर आप पाएंगे कि आपको अलग-अलग बायनेरिज़ को कॉल करने की आवश्यकता है, लेकिन सभी आधुनिक प्रणालियों पर स्विच पसंद किए जाते हैं। Grep के मैन पेज में इस बारे में विवरण है।
जैसा कि वे करते हैं, -E
grep को एक विशेष मोड में बदल देता है ताकि अभिव्यक्ति का मूल्यांकन ERE (एक्सटेंडेड रेगुलर एक्सप्रेशन) के रूप में किया जा सके जो इसके सामान्य पैटर्न से मेल खाता हो। इस सिंटैक्स का विवरण मैन पेज पर है।
-E, --extended-regexp
PATTERN को एक विस्तारित नियमित अभिव्यक्ति के रूप में व्याख्या करें
-F
स्विच जहां यह एक पैटर्न मिलान करने के लिए स्वीकार करता है एक अलग विधा में ग्रेप स्विच, लेकिन फिर उस पैटर्न ऊपर विभाजन प्रत्येक पंक्ति में एक खोज स्ट्रिंग में और किसी विशेष पैटर्न मिलान कर बिना तार से किसी पर एक या खोज करता है।
-F, --fixed-strings
PATTERN को निश्चित स्ट्रिंग्स की एक सूची के रूप में व्याख्या करें, जिसे नई सूचियों द्वारा अलग किया गया है, जिनमें से किसी का मिलान किया जाना है।
यहाँ कुछ उदाहरण परिदृश्य हैं:
आपके पास सादे पाठ में दस यूनिक्स उपयोगकर्ता नाम कहने की एक सूची है। आप अपनी मशीन पर समूह फ़ाइल खोजना चाहते हैं, यह देखने के लिए कि सूचीबद्ध दस उपयोगकर्ता किसी विशेष समूह में हैं या नहीं:
grep -F -f user_list.txt /etc/group
-F
यहां स्विच करने में मदद करने का कारण यह है कि आपके पैटर्न फ़ाइल में उपयोगकर्ता नाम को सादे पाठ स्ट्रिंग के रूप में व्याख्या किया गया है। उदाहरण के लिए डॉट्स की व्याख्या वाइल्ड-कार्ड के बजाय डॉट्स के रूप में की जाएगी।
आप एक फैंसी अभिव्यक्ति का उपयोग करके खोज करना चाहते हैं। उदाहरण के लिए, कोष्ठक का ()
उपयोग उन समूहों को इंगित करने के लिए किया जा सकता |
है जिन्हें OR ऑपरेटर के रूप में उपयोग किया जाता है। आप इस खोज को चला सकते हैं -E
:
grep -E '^no(fork|group)' /etc/group
... उन पंक्तियों को वापस करने के लिए जो "nofork" या "nogroup" से शुरू होती हैं। -E
स्विच के बिना आपको शामिल विशेष पात्रों से बचना होगा क्योंकि सामान्य पैटर्न मिलान के साथ वे बस उस सटीक पैटर्न की खोज करेंगे;
grep '^no\(fork\|group\)' /etc/group
egrep
या नहीं है fgrep
; -E
और -F
मानक हैं। इसमें वास्तव में छोटी असंगतताएं हैं egrep
: यह {
थोड़ा अलग तरीके से व्यवहार करता है।
fgrep
Aho-Corasick बैकएंड grep
का उपयोग करता है , जबकि Commentz-Walter के संशोधित संस्करण का उपयोग करता है। इसका मतलब है कि grep
सबसे खराब स्थिति हे (एमएन) की जटिलता है जबकि fgrep
सबसे खराब ओ (एम + एन) है।
egrep
और grep -E
विभिन्न निष्पादनयोग्य, बिजीबॉक्स और बीएसडी ग्रेप द्वारा संभाले गए। नॉन-पॉज़िक्स रेगेक्स कंस्ट्रक्शन के लिए दो वेरिएंट में व्यवहारिक अंतर था \s
। इससे बहुत भ्रम हुआ ...
से man grep
:
egrep grep -E के समान है। frerep grep -F के समान है। प्रत्यक्ष आह्वान या तो egrep या के रूप में fgrep को पदावनत किया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों को अनुमति देने के लिए प्रदान किया जाता है उन पर भरोसा करने के लिए unmodified चलाने के लिए।
आप उपयोग करते हैं fgrep
या grep -F
यदि आप नहीं चाहते कि ग्रीप्ड स्ट्रिंग को एक पैटर्न के रूप में व्याख्या किया जाए।
आप का उपयोग करें egrep
या grep -E
यदि आप एक विस्तारित regexp का उपयोग करने की आवश्यकता है।
egrep
और fgrep
मूल रूप से के बराबर हैं grep -E
और grep -F
(क्रमशः):
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below). (-E is specified by POSIX.)
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
त्रुटि संदेश हालांकि भिन्न हो सकते हैं।
"मैन ग्रीप" से:
तीन प्रकार के कार्यक्रम जैसे क्रेप, fgrep और rgrep उपलब्ध हैं। egrep grep -E के समान है। frerep grep -F के समान है। rgrep grep -r के समान है। अहं या frerep के रूप में प्रत्यक्ष आह्वान को पदावनत किया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों की अनुमति देने के लिए प्रदान किया जाता है जो उन पर भरोसा करते हैं जो उन्हें अनमॉडिफाइड चलाते हैं।
यदि आप एक शब्दशः स्ट्रिंग की खोज करते हैं, और यह सुनिश्चित करना चाहते हैं कि आपके द्वारा पास किया गया स्ट्रिंग शब्दशः व्याख्या की गई है (अर्थात बिना रिस्क लिए हुए कि डॉट या प्रश्न चिह्न की व्याख्या किसी और चीज के रूप में की जाएगी) fgrep या egrep -F का उपयोग करें।
जैसे कि egrep और grep के बीच के अंतर के लिए, मुझे लगता है कि egrep ज्यादातर समय वह चीज है जो आप चाहते हैं। GNU मैनुअल साइट grep और egrep के बीच के अंतर को सूचीबद्ध करती है जो वाक्य रचना में लगता है: कुछ चीजों को स्लैश की आवश्यकता होती है जबकि अन्य की नहीं। मुझे लगता है कि egrep perl regexps और जावास्क्रिप्ट regexps के साथ अधिक "संगत" है, इसलिए मेरे लिए egrep का उपयोग करना आसान है।
Btw। मैं वास्तव में देने के लिए प्रोत्साहित पावती एक कोशिश - यह PREGs का समर्थन करता है, और अधिक उपयोगी चूक (है यानी रंग, .svn, सिमलिंक का पालन करने की क्षमता की तरह शायद-नहीं-क्या-यू-अभाव निर्देशिका लंघन, और यह टाइप करने के लिए थोड़ा आसान है grep -E से ack)।