`Grep`,` egrep` और `fgrep` में क्या अंतर है?


273

किसी को भी मेरे बीच तकनीकी मतभेद बता सकते हैं grep, egrepऔर fgrepऔर प्रदान उपयुक्त उदाहरण?

जब मैं का उपयोग करने की आवश्यकता है grepसे अधिक egrepहै और इसके विपरीत?


7
superuser में grep, egrep, fgrep और pgrep के बीच के अंतर का एक बड़ा चित्रण है: superuser.com/questions/508881/…
एरिक लेसचिंस्की

जवाबों:


292
  • egrep के बराबर 100% है grep -E
  • fgrep के बराबर 100% है grep -F

ऐतिहासिक रूप से ये स्विच अलग-अलग बायनेरिज़ में प्रदान किए गए थे। कुछ वास्तव में पुरानी यूनिक्स प्रणालियों पर आप पाएंगे कि आपको अलग-अलग बायनेरिज़ को कॉल करने की आवश्यकता है, लेकिन सभी आधुनिक प्रणालियों पर स्विच पसंद किए जाते हैं। Grep के मैन पेज में इस बारे में विवरण है।

जैसा कि वे करते हैं, -Egrep को एक विशेष मोड में बदल देता है ताकि अभिव्यक्ति का मूल्यांकन 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
    

17
कुछ सिस्टम egrepया नहीं है fgrep; -Eऔर -Fमानक हैं। इसमें वास्तव में छोटी असंगतताएं हैं egrep: यह {थोड़ा अलग तरीके से व्यवहार करता है।
गिलेज़

4
fgrepAho-Corasick बैकएंड grepका उपयोग करता है , जबकि Commentz-Walter के संशोधित संस्करण का उपयोग करता है। इसका मतलब है कि grepसबसे खराब स्थिति हे (एमएन) की जटिलता है जबकि fgrepसबसे खराब ओ (एम + एन) है।
स्लाटर विक्टोरॉफ

2
गिल्स "au contraire mon capitan", कुछ सिस्टम (पुराने शायद) में मानक grep के लिए -F विकल्प नहीं हो सकता है, लेकिन एक fgrep है, कुछ ppl को इस बात की शिकायत है कि मूल धागे पर मुझे विशेष वर्णों के लिए grep का उपयोग करने के बारे में पता चला है
THESorcerer

मैं हाल ही में एक Android प्रणाली पर हुआ है जिस पर egrepऔर grep -Eविभिन्न निष्पादनयोग्य, बिजीबॉक्स और बीएसडी ग्रेप द्वारा संभाले गए। नॉन-पॉज़िक्स रेगेक्स कंस्ट्रक्शन के लिए दो वेरिएंट में व्यवहारिक अंतर था \s। इससे बहुत भ्रम हुआ ...
Lii

33

से man grep:

 egrep grep -E के समान है।
 frerep grep -F के समान है। प्रत्यक्ष आह्वान या तो egrep या के रूप में  
  fgrep को पदावनत किया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों को अनुमति देने के लिए प्रदान किया जाता है
  उन पर भरोसा करने के लिए unmodified चलाने के लिए।

आप उपयोग करते हैं fgrepया grep -Fयदि आप नहीं चाहते कि ग्रीप्ड स्ट्रिंग को एक पैटर्न के रूप में व्याख्या किया जाए।

आप का उपयोग करें egrepया grep -Eयदि आप एक विस्तारित regexp का उपयोग करने की आवश्यकता है।


13

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.)

त्रुटि संदेश हालांकि भिन्न हो सकते हैं।


2
ठीक है, लेकिन एक विस्तारित नियमित अभिव्यक्ति क्या है ? यह वास्तव में नीचे की व्याख्या नहीं करता है। कुछ उदाहरण अच्छे होंगे ...
isomorphismes

@isomorphismes: यह वाइकबुक लिंक इसे अच्छी तरह से समझाता है ...
zb226

8

"मैन ग्रीप" से:

तीन प्रकार के कार्यक्रम जैसे क्रेप, fgrep और rgrep उपलब्ध हैं। egrep grep -E के समान है। frerep grep -F के समान है। rgrep grep -r के समान है। अहं या frerep के रूप में प्रत्यक्ष आह्वान को पदावनत किया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों की अनुमति देने के लिए प्रदान किया जाता है जो उन पर भरोसा करते हैं जो उन्हें अनमॉडिफाइड चलाते हैं।


2
प्रश्न एक उपयुक्त उदाहरण के लिए पूछता है।
isomorphismes

3

यदि आप एक शब्दशः स्ट्रिंग की खोज करते हैं, और यह सुनिश्चित करना चाहते हैं कि आपके द्वारा पास किया गया स्ट्रिंग शब्दशः व्याख्या की गई है (अर्थात बिना रिस्क लिए हुए कि डॉट या प्रश्न चिह्न की व्याख्या किसी और चीज के रूप में की जाएगी) fgrep या egrep -F का उपयोग करें।

जैसे कि egrep और grep के बीच के अंतर के लिए, मुझे लगता है कि egrep ज्यादातर समय वह चीज है जो आप चाहते हैं। GNU मैनुअल साइट grep और egrep के बीच के अंतर को सूचीबद्ध करती है जो वाक्य रचना में लगता है: कुछ चीजों को स्लैश की आवश्यकता होती है जबकि अन्य की नहीं। मुझे लगता है कि egrep perl regexps और जावास्क्रिप्ट regexps के साथ अधिक "संगत" है, इसलिए मेरे लिए egrep का उपयोग करना आसान है।

Btw। मैं वास्तव में देने के लिए प्रोत्साहित पावती एक कोशिश - यह PREGs का समर्थन करता है, और अधिक उपयोगी चूक (है यानी रंग, .svn, सिमलिंक का पालन करने की क्षमता की तरह शायद-नहीं-क्या-यू-अभाव निर्देशिका लंघन, और यह टाइप करने के लिए थोड़ा आसान है grep -E से ack)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.