से man grep(Debian पर) पेज:
विवरण
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
पहले मामले में, grepफ़ाइल खोलता है; दूसरे में, शेल फ़ाइल को खोलता है और इसे मानक इनपुट को असाइन करता है grep, और grepकिसी भी फ़ाइल नाम तर्क को पारित नहीं किया जा रहा है मान लेता है कि इसे अपने मानक इनपुट को प्राप्त करने की आवश्यकता है।
1 का लाभ:
grep एक से अधिक file¹ grep कर सकते हैं।
grepवह फ़ाइल नाम प्रदर्शित कर सकता है जहाँ प्रत्येक घटना lineपाई जाती है।
2 के पेशेवरों:
- यदि फ़ाइल नहीं खोली जा सकती है, तो शेल एक त्रुटि देता है जिसमें अधिक प्रासंगिक जानकारी शामिल होगी (जैसे स्क्रिप्ट में लाइन नंबर) और अधिक सुसंगत तरीके से (यदि आप शेल को अन्य कमांड के लिए भी फाइल खोलने दें) कब से
grepइसे खोलता है। और अगर फ़ाइल को खोला नहीं जा सकता है, grepतो उसे भी नहीं बुलाया जाता है (जो कुछ कमांड के लिए - शायद नहीं grep- एक बड़ा अंतर कर सकता है)।
- में
grep line < in > out, अगर inकर सकते हैं खोला नहीं जा, outनहीं बनाया जाएगा या छोटा कर दिया।
- असामान्य नाम वाली कुछ फ़ाइलों के साथ कोई समस्या नहीं है (जैसे
-या फ़ाइल नाम जिनके साथ शुरू हो रहा है -) files ।
- कॉस्मेटिक: आप
<fileकमांड प्रवाह पर कहीं भी रख सकते हैं ताकि कमांड प्रवाह को अधिक स्वाभाविक रूप से दिखा सके, जैसे <in grep line >outकि आप चाहें।
कॉस्मेटिक: जीएनयू के साथ grep, आप यह चुन सकते हैं कि मिलान रेखा के सामने किस लेबल का उपयोग करना है, बजाय फाइल के नाम के:
<file grep --label='Found in file at line' -Hn line
प्रदर्शन के संदर्भ में, यदि फ़ाइल नहीं खोली जा सकती है, तो आप grepपुनर्निर्देशन का उपयोग करते समय निष्पादन को बचाते हैं , लेकिन अन्यथा grepमैं बहुत अंतर की उम्मीद नहीं करता।
पुनर्निर्देशन के साथ, आप के लिए एक अतिरिक्त तर्क पारित करने के लिए होने को बचाने grepके लिए, आप कर grepतर्क थोड़ा आसान पार्स करने। दूसरी ओर, शेल को dup2()फ़ाइल डिस्क्रिप्टर 0 पर फ़ाइल डिस्क्रिप्टर पर एक अतिरिक्त सिस्टम कॉल की आवश्यकता होगी (कम से कम) ।
में { grep -m1 line; next command; } < file, grep(यहाँ GNU grep) seek()मिलान रेखा के ठीक बाद वापस आना चाहेगा इसलिए next commandबाकी फ़ाइल को देखता है (यह भी निर्धारित करना होगा कि फ़ाइल खोजने योग्य है या नहीं)। दूसरे शब्दों में, स्टड के भीतर की स्थिति एक और grepआउटपुट है। इसके साथ grep -m1 line file, यह है कि बाहर के grepबारे में देखभाल करने के लिए एक कम बात है कि अनुकूलन कर सकते हैं।
टिप्पणियाँ
Can zsh, आप कर सकते हैं:
grep line < file1 < file2
लेकिन यह cat file1 file2 | grep line( catउपयोगिता को शामिल किए बिना ) के बराबर काम कर रहा है और इसलिए यह कम कुशल है, भ्रम पैदा कर सकता है यदि पहली फ़ाइल किसी नई पंक्ति में समाप्त नहीं होती है और आपको यह नहीं बताएगी कि किस फ़ाइल में पैटर्न पाया गया है।
² के मामले में ksh93और bashयद्यपि, /dev/tcp/host/port(और /dev/fd/xकुछ प्रणालियों में bash) जैसी फाइलें हैं , जिनका उपयोग जब पुनर्निर्देशन के लक्ष्य में किया जाता है, तो फ़ाइल सिस्टम पर फ़ाइल को वास्तव में खोलने के बजाय विशेष उद्देश्यों के लिए शेल इंटरसेप्ट करता है (हालांकि आम तौर पर, वे फाइलें फाइल सिस्टम पर मौजूद नहीं है)। /dev/stdinउसी उद्देश्य से कार्य करता है, जिसे -मान्यता प्राप्त है grep, लेकिन कम से कम, यहां यह अधिक सही तरीके से नामांकित है (कोई -भी किसी भी निर्देशिका में नामक एक फ़ाइल बना सकता है , जबकि केवल व्यवस्थापक ही एक फ़ाइल बना सकते हैं /dev/tcp/host/portऔर प्रशासकों को बेहतर पता होना चाहिए)।