2012-11-22 20 views
8

के बीच अंतर मैं नीचे 2 आदेशों के बीच अंतर जानना चाहता हूं, मुझे लगता है कि 2) का उपयोग किया जाना चाहिए, लेकिन मैं सटीक अनुक्रम को जानना चाहता हूं जो 1) और 2) मान लीजिए कि फ़ाइल नाम 200 है इसमें वर्णgrep बनाम बिल्ली और grep

1) बिल्ली फ़ाइल नाम | ग्रेप regex

2) ग्रेप regex फ़ाइल नाम

उत्तर

0

कार्यात्मक वे बराबर हैं, तथापि, खोल cat filename | grep regex के लिए दो प्रक्रियाओं कांटा और उन्हें एक पाइप के साथ कनेक्ट करेगा।

4

पहले एक:

cat filename | grep regex 

आम तौर पर बिल्ली फ़ाइल को खोलता है और stdout के लिए लाइन द्वारा इसकी सामग्री लाइन प्रिंट करता है। लेकिन यहां यह अपनी सामग्री को पाइप '|' पर आउटपुट करता है। उसके बाद जीपीई पाइप से पढ़ता है (यह पाइप को stdin के रूप में लेता है) तो यदि मैगे रेगेक्स प्रिंट स्ट्रीट को प्रिंट करता है। लेकिन यहां नई शैल प्रक्रिया में एक विवरण grep खोला गया है, इसलिए पाइप आउटपुट के रूप में आउटपुट के रूप में नई खोल प्रक्रिया में आगे बढ़ता है।

दूसरा एक:

grep regex filename 

यहाँ सीधे grep फ़ाइल से पढ़ता है (ऊपर यह पाइप से पढ़ रहा था) और regex से मेल खाता है, तो मिलान किया प्रिंट लाइन stdout करने के लिए।

+0

+1 में regex नामित सामग्री की खोज करता है: एक रूढ़िवादी (जैसे मुझे) का तर्क हो सकता है कि 'cat' हमेशा अपने मानक आउटपुट में लिखते हैं, लेकिन में पाइप का संदर्भ, इसका मानक आउटपुट एक पाइप का लेखन अंत है। इसी प्रकार, जब 'grep' को फ़ाइल नाम तर्क के साथ बुलाया जाता है, या जब यह '-' के फ़ाइल नाम तर्क को संसाधित करता है, तो यह इसके मानक इनपुट को पढ़ेगा, जो इस मामले में, पाइप का पढ़ा हुआ अंत है। ध्यान दें कि 'पाइप' या '|' एक आदेश नहीं है; यह बिल्कुल स्पष्ट नहीं है कि आप पहचानते हैं कि 'इतनी पाइप आगे नई इनपुट प्रक्रिया के रूप में आउटपुट के रूप में इनपुट को आगे बढ़ाती है'। –

14

कार्यात्मक रूप से (आउटपुट के मामले में), वे दोनों समान हैं। पहला वास्तव में एक अलग प्रक्रिया cat बनाता है जो फ़ाइल की सामग्री को मानक आउटपुट में भेजता है, जो grep के मानक इनपुट पर दिखाई देता है, क्योंकि खोल ने दोनों को पाइप से जोड़ा है।

उस अर्थ में grep regex <filename भी बराबर है लेकिन एक कम प्रक्रिया के साथ।

आप देख अंतर वेरिएंट में है जब अतिरिक्त जानकारी (फ़ाइल नाम) इस तरह के साथ के रूप में grep द्वारा इस्तेमाल किया, है कहाँ शुरू करेंगे:

grep -n regex filename1 filename2 

कि और के बीच अंतर:

cat filename1 filename2 | grep -n regex 

कि पूर्व जानता अलग-अलग फ़ाइलों के बारे में जबकि बाद के रूप में एक फ़ाइल इसे देखता है (बिना किसी नाम के)।

पूर्व आप दे सकते हैं:

filename1:7:line with regex in 10-line file 
filename2:2:another regex line 

बाद हो जाएगा और अधिक की तरह:

7:line with regex in 10-line file 
12:another regex line 

एक और निष्पादन योग्य है कि अलग तरह से काम करता है अगर यह फ़ाइल नाम जानता है wc है, शब्द काउंटर प्रोग्राम:

$ cat qq.in 
1 
2 
3 

$ wc -l qq.in   # knows file so prints it 
3 qq.in 

$ cat qq.in | wc -l  # does not know file 
3 

$ wc -l <qq.in   # also does not know file 
3 
1

आप वास्तविक निष्पादन समय diffrence जाँच करने के लिए, पहले 100000 लाइनों के साथ एक फ़ाइल बनाने चाहते हैं:

[email protected] ~ $ for i in $(seq 1 100000); do echo line${1} >> test_f; done 
[email protected] ~ $ wc -l test_f 
100000 test_f 

अब मापने:

[email protected] ~ $ time grep line test_f 
#... 
real 0m1.320s 
user 0m0.101s 
sys  0m0.122s 

[email protected] ~ $ time cat test_f | grep line 
#... 
real 0m1.288s 
user 0m0.132s 
sys  0m0.108s 

हम देख सकते हैं, diffrence बहुत बड़ा नहीं है। ..

+0

क्या दूसरा 'टाइम' कमांड 'बिल्ली' या पूरी पाइपलाइन का समय देता है? –

+3

स्क्रीन पर लिखे गए छोड़े गए आउटपुट के कारण आपने कितना समय देखा था? मैंने 'grep' के आउटपुट के साथ'/dev/null' पर रीडायरेक्ट की कोशिश की और 10-50 एमएस रेंज में समय मिला, न कि 1 सेकंड रेंज। अब, मेरी मशीन कोई स्लच नहीं है, लेकिन 20 गुना तेज़ जितना तेज़ लगता है (यहां तक ​​कि यह अनुमति देता है कि फाइल शायद स्मृति में है, डिस्क पर नहीं)। अच्छा बेंचमार्किंग करना बहुत मुश्किल है। मुझे लगता है कि आप माप रहे हैं कि 'grep' बनाम बिल्ली' के कच्चे प्रदर्शन की बजाय, आपके टर्मिनल पर 100,000 लाइनें लिखने का समय है। grep'। –

+0

आप सही हो सकते हैं, मैंने इसे ध्यान में नहीं लिया है। – dstronczak

0

वास्तव में, हालांकि आउटपुट समान हैं;

-$cat filename | grep regex 

यह आदेश फ़ाइल "फ़ाइल नाम" की सामग्री को देखता है, फिर इसमें रेगेक्स प्राप्त करता है; जबकि

-$grep regex filename 

यह आदेश सीधे फ़ाइल "फ़ाइल नाम"

 संबंधित मुद्दे