Grep बनाम awk का उपयोग करना


17

एक विशेष पैटर्न पर कब्जा करने के लिए, awkऔर grepइसका इस्तेमाल किया जा सकता है। हमें एक का उपयोग दूसरे पर क्यों करना चाहिए? कौन सा तेज है और क्यों?

अगर मेरे पास एक लॉग फ़ाइल थी और मैं एक निश्चित पैटर्न को हथियाना चाहता था, तो मैं निम्नलिखित में से एक कर सकता था

awk '/pattern/' /var/log/messages

या

grep 'pattern' /var/log/messages

मैंने कोई बेंचमार्किंग नहीं की है, इसलिए मुझे नहीं पता होगा। क्या कोई इसे विस्तृत कर सकता है? इन दो साधनों के आंतरिक कामकाज को जानना बहुत अच्छा है।


किसी भी कमांड को, यहां तक ​​कि शेल स्क्रिप्ट को, timeकमांड को समय-समय पर कमांड को चलाने में कितना समय लगता है। उदाहरण के लिए: time ls -l
सरकंडा

जवाबों:


26

grep की संभावना सबसे तेज़ होगी:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

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

(नोट - मैंने दोनों आदेशों को दो बार चलाया ताकि कैशिंग परिणाम को संभावित रूप से कम न करें)

विकिपीडिया पर व्याख्या की गई भाषाओं के बारे में अधिक जानकारी ।

जैसा कि स्टीफन ने टिप्पणियों में सही बताया है, आपके द्वारा उपयोग किए जा रहे grep और awk के लागू होने के कारण आपका माइलेज अलग-अलग हो सकता है, यह जिस ऑपरेटिंग सिस्टम पर है और जो कैरेक्टर आप प्रोसेस कर रहे हैं।


2
यह कहे बिना कि आप किस grep या awk कार्यान्वयन का उपयोग कर रहे हैं और किस कंप्यूटर आर्किटेक्चर पर, और किस सिस्टम वर्ण के साथ सेट किया गया है, उन टाइमिंग का बहुत कम मूल्य है।
स्टीफन चेज़लस

1
दूसरा कमांड भी नए कैश्ड संस्करण का उपयोग करेगा। मुझे शक नहीं है कि grep तेज है, लेकिन उतना नहीं जितना कि आपके नंबर दिखाते हैं।
Exussum

(इसलिए awk, grep, awk, grep को चलाना और awk और grep के दूसरे सेट से परिणाम पोस्ट करना :) और FYI करें, मैं UTF8 लोकेल में रहता हूं।
Drav Sloan

1
बीएसडी टूल्स (एक मैक पर) के साथ मज़ेदार पर्याप्त, awk (31.74s) sed (33.34s) की तुलना में थोड़ा तेज़ है, जो कि grep (34.21s) से थोड़ा तेज़ है। Gnu awk उन सभी का मालिक है 5.24s, मेरे पास परीक्षण करने के लिए gnu grep या sed नहीं है।
केविन

1
grep थोड़ा तेज़ होना चाहिए क्योंकि awk प्रत्येक इनपुट लाइन के साथ अधिक करता है, बस इसमें regexp की खोज होती है, उदाहरण के लिए यदि किसी फ़ील्ड को स्क्रिप्ट में संदर्भित किया जाता है (जो कि इस मामले में नहीं है) awk प्रत्येक इनपुट लाइन को फ़ील्ड के आधार पर विभाजित करेगा फ़ील्ड-सेपरेटर मान और यह बिलिन चर को पॉप्युलेट करता है। लेकिन आपने जो पोस्ट किया है, उसमें लगभग कोई अंतर नहीं होना चाहिए। अब तक ग्रेप और awk wrt मिलान regexps के बीच सबसे महत्वपूर्ण अंतर एक से मिलता जुलता स्ट्रिंग के लिए कि ग्रेप खोज पूरी लाइन awk विशिष्ट फ़ील्ड की खोज कर सकते हैं और इतने अधिक परिशुद्धता और कम झूठी मैचों प्रदान करते हुए है।
एड मॉर्टन

14

सबसे विशिष्ट और अभिव्यंजक उपकरण का उपयोग करें। वह उपकरण जो आपके उपयोग के मामले में सबसे उपयुक्त है, वह सबसे तेज़ होने की संभावना है।

एक मोटे गाइड के रूप में:

  • एक सबरिंग या regexp से मेल खाते लाइनों के लिए खोज? Grep का उपयोग करें।
  • एक सीमांकित फ़ाइल से कुछ स्तंभों का चयन करना? कट का उपयोग करें।
  • पैटर्न-आधारित प्रतिस्थापन या ... अन्य सामान सेड का प्रदर्शन यथोचित रूप से कर सकते हैं? सेड का प्रयोग करें।
  • उपरोक्त 3 के कुछ संयोजन की आवश्यकता है, या प्रिंटफ प्रारूपण, या सामान्य प्रयोजन लूप और शाखाएं? Awk का उपयोग करें।

के perlबजाय उपयोग को छोड़कर +1 awk। अगर आपको grep / cut / sed की तुलना में कुछ अधिक जटिल चाहिए, तो संभावना काफी नहीं होगी और आपको कुछ "पूर्ण विकसित" चाहिए
sds

@ इसके बजाय अजगर क्यों नहीं
रेट्रोडकोड

@ रिट्रोकोड: पायथन पर्ल से अधिक "सामान्य उद्देश्य" है; समतुल्य एक-लाइनर शायद बहुत लंबा होगा।
एसपी

3
जब तक आप पाठ प्रसंस्करण के अलावा कुछ करने जा रहे हैं, तब तक आपको कोई आवश्यकता नहीं है। awk सिर्फ टेक्स्ट प्रोसेसिंग सामान के लिए ठीक है जो कि grep / cut / sed की तुलना में अधिक जटिल है और perl के विपरीत सभी UNIX इंस्टॉलेशन पर मानक के रूप में बोनस आता है।
एड मॉर्टन

10

जब केवल स्ट्रिंग्स की खोज हो, और गति मायने रखती है, तो आपको लगभग हमेशा उपयोग करना चाहिए grepawkजब यह सिर्फ स्थूल खोज की बात आती है , तो यह तेजी से परिमाण का आदेश देता है ।

source sed, awk और अन्य यूनिक्स पार्सिंग उपयोगिताओं के कार्यात्मक और प्रदर्शन अंतर

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million

1
इन सभी कार्यक्रमों के इस अच्छे अवलोकन के लिए धन्यवाद। यह वास्तव में अंधेरे में प्रकाश डालता है।
होलास्ज

1
~ headtilt ~ PHP वहाँ पर है, लेकिन पर्ल नहीं है?
इज़काता

@ इज़काता - मैंने एक ही बात सोचा था जब मैंने इस तालिका को कुछ समय पहले देखा था।
स्लम

1
यह वास्तव में अन्य बर्तनों के लिए उचित नहीं है कि grep बस खोज कर रहा है और वे भी जगह ले रहे हैं।
केविन

1
वे पूरी तरह से फर्जी नंबर हैं। सेब और संतरे की तुलना करने के बारे में बात करें - यह कहने जैसा है कि आप केवल 5 सेकंड में वेब साइट ए पर एक नई कार पा सकते हैं, जबकि आप एक कार पा सकते हैं, एक मूल्य बातचीत कर सकते हैं, एक ऋण प्राप्त कर सकते हैं और 1 घंटे में साइट बी पर कार खरीद सकते हैं। इसलिए साइट A, B की तुलना में तेज़ है। आपके द्वारा उद्धृत लेख grep, sed और awk के बीच सापेक्ष निष्पादन गति के कथन में पूरी तरह से गलत है और यह भी कहता है कि awk ... has PCRE matching for regular expressionsजो पूरी तरह से असत्य है।
एड मॉर्टन

5

जबकि मैं मानता हूं कि सिद्धांत रूप में, व्यवहार में वाईएमएमवी की grepतुलना awkमें तेजी से होना चाहिए , जो आपके द्वारा उपयोग किए जाने वाले कार्यान्वयन पर बहुत अधिक निर्भर करता है।

यहाँ बिजीबॉक्स 1.20.0 के grep और awk की तुलना, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 को डेबियन / लिनक्स 7.0 amd64 (glibc 2.17 के साथ) पर UTM-8 लोकेल में 240M की 2.5M फाइल की 240M लाइनों पर ASCII- केवल वर्ण।

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

सी लोकेल में, केवल जीएनयू ग्रीप को एक महत्वपूर्ण बढ़ावा मिलता है और इससे तेज हो जाता है mawk

डेटासेट, regexp के प्रकार में भी बड़ा बदलाव हो सकता है। Regexps के लिए, के रूप में regexps REs विस्तारित कर रहे हैं के साथ awkतुलना की जानी चाहिए ।grep -Eawk

इस डेटासेट के लिए, व्यस्तबॉक्स आधारित सिस्टम या सिस्टम awkसे तेज हो सकता grepहै जहां mawkडिफ़ॉल्ट है awkऔर डिफ़ॉल्ट लोकेल UTF-8 आधारित है (IIRC, यह उबंटू में मामला हुआ करता था)।


2

संक्षेप में, grepएक बात केवल कई अन्य यूनिक्स उपकरण के रूप में होती है और यह दिए गए पैटर्न के लिए एक रेखा से मेल खाता है और यह इसे अच्छी तरह से करता है। दूसरी ओर, awkअधिक परिष्कृत उपकरण है क्योंकि यह POSIX मानक द्वारा परिभाषित एक पूर्ण प्रोग्रामिंग भाषा है, जिसमें वैरिएबल, एरे, एक्सप्रेशन, फ़ंक्शन या पैटर्न स्कैनिंग और प्रोसेसिंग के लिए नियंत्रण स्टेटमेंट जैसी विशिष्ट विशेषताएं हैं।

मेरी राय में, यह कार्यान्वयन पर निर्भर करता है कि पैटर्न मिलान के मामले में दोनों उपकरण कैसा प्रदर्शन करते हैं और कुछ इनपुट के आकार पर जिसे आप प्रोसेस करना चाहते हैं। मुझे उम्मीद है कि grep आमतौर पर awk से अधिक कुशल होता है क्योंकि यह केवल मिलान करता है। लेकिन आप अन्य उपकरणों का उपयोग किए बिना मिलान किए गए रिकॉर्ड, संगणना या मुद्रण परिणामों के आगे प्रसंस्करण जैसे अधिक जटिल कार्यों को करने के लिए एक साधारण कोड को grep के साथ नहीं लिख सकते।

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