Grep के साथ awk और cut में क्या अंतर हैं? [बन्द है]


30

हम जानते हैं कि हम इन दोनों तकनीकों का उपयोग करके किसी फ़ाइल से प्राप्त लाइन का दूसरा कॉलम प्राप्त कर सकते हैं:

awk '/WORD/ { print $2 }' filename

या

grep WORD filename| cut -f 2 -d ' '

मेरे प्रश्न हैं:

  • ऊपर दिए गए दोनों आदेशों के बीच क्या अंतर हैं?
  • सबसे अच्छा प्रदर्शन किसका है?
  • उपयोग करने awkसे अधिक लाभ क्या हैंcut , और इसके विपरीत?
  • क्या विकल्प awkहमें cutऔर इसके विपरीत देते हैं?

वह यह है कि echo filenameया cat filename?
अविनाश राज

@ एविनाशराज खेद संपादित
नेटवर्कर

जवाबों:


35

आपकी दो लाइनों के बीच सबसे प्रमुख अंतर इनपुट के आधार पर होगा। cutकिसी एक पात्र -dको क्षेत्र परिसीमनकर्ता (डिफ़ॉल्ट TAB) के रूप में लेता है , और उस चरित्र की प्रत्येक एक घटना एक नया क्षेत्र शुरू करती है। awkहालाँकि, अधिक लचीला है। विभाजक FSचर में है और एक रिक्त स्ट्रिंग (प्रत्येक इनपुट चरित्र एक अलग फ़ील्ड बनाता है), एक एकल वर्ण या एक नियमित अभिव्यक्ति हो सकता है। सिंगल स्पेस कैरेक्टर (डिफ़ॉल्ट) का विशेष मामला व्हाट्सएप के किसी भी क्रम पर विभाजित होने का मतलब है । इसके अलावा, awkप्रमुख व्हाट्सएप को डिफ़ॉल्ट रूप से दबा देता है।

कृपया तुलना करें:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

यहाँ, awkबीच abcऔर बीच में रिक्त स्थान के अनुक्रम पर विभाजन defहोता हैcut हर स्थान को विभाजक के रूप में लेता है।

आप जो लेते हैं वह इस बात पर निर्भर करेगा कि आप क्या हासिल करना चाहते हैं। अन्यथा, मैं cutतेजी से होने की उम्मीद करूंगा क्योंकि यह एक छोटा, एकल उद्देश्य उपकरण है, जबकि awkइसकी अपनी प्रोग्रामिंग भाषा है।


कि मैं एक उत्तर के रूप में क्या चाहता हूं, धन्यवाद मैं इस प्रश्न का उत्तर दूंगा @Dubu के रूप में चिह्नित करूंगा
Networker

1
cutअकेले अवाक की तुलना में तेज़ होने की संभावना है , लेकिन यह इतना निश्चित नहीं है कि grep ... | cutशुद्ध अवाक की तुलना में तेज़ होगा।
वाइल्डकार्ड

8

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

अधिक जटिल साधनों का लाभ यह है कि वे अधिक चीजें कर सकते हैं।

आपकी आज्ञाओं का उपयोग बिल्ली अनावश्यक रूप से करती है। इसके बजाय पुनर्निर्देशन का उपयोग करें (खासकर यदि आप गति के बारे में चिंतित हैं, हालाँकि आपको शायद तब तक गति के बारे में चिंतित नहीं होना चाहिए जब तक कि आप बेंचमार्क नहीं चला लेते)।

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

ये कमांड लगभग बराबर हैं। अंतर हैं:

  • awk और grep में अलग-अलग रीजैक्स सिंटैक्स होते हैं । जाग औरgrep -E लगभग समान रेगेक्स सिंटैक्स (नियमित अभिव्यक्ति को विस्तारित) करें।
  • cut -d ' 'प्रत्येक व्यक्ति अंतरिक्ष चरित्र को एक सीमांकक के रूप में मानता है। Awk का डिफ़ॉल्ट सीमांकक कोई भी व्हाट्सएप अनुक्रम है, जो कई रिक्त स्थान, एक टैब आदि हो सकता है। आप मनमाने ढंग से व्हाट्सएप अनुक्रमों को विभाजकों के रूप में उपयोग नहीं कर सकते हैं cut। जाग में विभाजक के रूप में अलग-अलग रिक्त स्थान का उपयोग करने के लिए, फ़ील्ड विभाजक को एक एकल स्पेस से मेल खाने वाले regexp पर सेट करें, जो एकल स्थान से regexp के अलावा (जो कि कोई विशेष मामला है जिसका अर्थ है "कोई भी व्हाट्सएप अनुक्रम", यानी डिफ़ॉल्ट) awk -F '[ ]' '/WORD/ {print $2}':।

¹ कार्यक्रम अनुकूलन के प्रथम नियम: यह मत करो। कार्यक्रम अनुकूलन का दूसरा नियम (केवल विशेषज्ञों के लिए!): अभी तक ऐसा न करें। - माइकल ए जैक्सन


1

आपकी आज्ञा,

cat fileName | awk '/WORD/ { print $2 }'

आपको catकमांड की भी आवश्यकता नहीं है । आप कोशिश कर सकते हैं,

awk '/WORD/ { print $2 }' filename

और नीचे की कमान बिल्ली से grep तक के उत्पादन को फिर से कटौती करती है,

cat fileName | grep WORD | cut -f 2 -d ' '

सबसे शायद हमें आउटपुट पुनर्निर्देशन से बचना चाहिए। ऑक एक लाइन में काम करता है लेकिनcutgrep केवल उन पंक्तियों को प्राप्त करने के लिए एक कमांड की आवश्यकता होती है जिसमें विशेष शब्द होते हैं और यह सीमांकक के अनुसार कॉलम 2 को प्रिंट करता है।

यदि आप कटौती करने में विफल रहते हैं तो आप awk में चीजें कर सकते हैं।


3
PS आपको grep के लिए कैट कमांड की आवश्यकता नहीं है। आप बस कर सकते हैं grep WORD filename
फूप्स

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