मुझे इनपुट पुनर्निर्देशन का उपयोग कब करना चाहिए?


21

मैंने एक ही परिणाम उत्पन्न करने के लिए निम्नलिखित दो आदेशों का उपयोग किया: -

[root@localhost ~]# grep line comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

[root@localhost ~]# grep line <comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

यदि कोई भी मुझे किसी भी पेशेवरों / विपक्ष को समझा सकता है, अगर इन 2 में से कोई एक दूसरे से संपर्क करता है।

जवाबों:


28

से 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और प्रशासकों को बेहतर पता होना चाहिए)।


+1, अच्छी व्याख्या के लिए। मुझे एक संदेह है: 2 के मामले में जब शेल फ़ाइल को खोलती है तो क्या यह खोले हुए फ़ाइल की सामग्री को मानक इनपुट (कीबोर्ड) से पास करता है ?? (मैं 'grep के मानक इनपुट' शब्द के साथ भ्रमित हो गया)।
अंकित

1
@Ankit, stdin वह जगह है जहां एप्लिकेशन डिफॉल्ट रूप से अपने इनपुट को पढ़ते हैं, फाइल डिस्क्रिप्टर 0. जब टर्मिनल में होता है, तो fd 0 टर्मिनल डिवाइस पर पढ़ने से खोला जाता है (कुछ इस तरह का / dev / ttyxx या / dev / pts / n)। यह है कि वे अंत में क्या आप कीबोर्ड पर टाइप हो रही है। कमांड के स्टैडिन का शेल पुनर्निर्देशन कमांड को निष्पादित करने से पहले fd 0 को किसी अन्य फाइल में खोलता है।
स्टीफन चेज़लस

6

स्टेफेनचैलेज द्वारा कवर grep(1), और अधिकांश यूनिक्स वंश कमांड इस तरह से काम करते हैं, लेकिन सभी नहीं। यह मानक इनपुट (कीबोर्ड से, एक फ़ाइल के माध्यम से पुनर्निर्देशित < file, या किसी अन्य कमांड, बेवकूफ उदाहरण द्वारा पाइप किए गए आउटपुट से ls * | grep '^ab*c$') या तर्क के रूप में दी गई फ़ाइल (ओं) से पढ़ने के लिए मानक है grep comment file1 file2 file3। कुछ कमांड वहां कन्वेंशन का उपयोग करते हैं कि नामित फ़ाइल -मानक इनपुट है, इसलिए आप इसके make-middle | cat head - tailसाथ एक स्ट्रीम प्राप्त करने के लिए कह सकते हैं head, जो भी gen-middleउत्पन्न होता है, उसके बाद tail। यह डिज़ाइन द्वारा है, कमांड के उपयोग में लचीलापन देने के लिए।

कौनसा अच्छा है? जब तक यह काम करता है, तब तक इससे cmd fileकम है cmd < file; वहाँ एक हो सकता है छोटे खोल (फ़ाइल frobbing कर के बीच के समय में अंतर <) और आदेश अपने आप में यह कर रही है, लेकिन शायद unnoticeable जब तक आप दिन भर कुछ नहीं करते हैं। यह स्टीफन के जवाब में उल्लिखित पेशेवरों की तरह विचारों पर निर्भर करेगा।


cmd filecmd<fileहालांकि कम नहीं है ।
स्टीफन चेज़लस

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