2009-11-30 12 views
5
#!/bin/bash 

for ((var=0; var<20; var++)) 
do 
echo " Number is: $(grep 'Multiple_Frame = echo **$var**' 20mrf.txt | wc -l)" >>statisic.txt 

done 

यह खोल प्रोग्राम सही परिणाम नहीं दे सकता है जो शायद दूसरे grep कमांड में गलत वैरिएबल लौटने का कारण हो सकता है।शैल प्रोग्राम में एक चर को grep कैसे करें?

मैं दूसरे इको वाक्य के भीतर एक चर को कैसे घुमा सकता हूं? var बदलते हुए विभिन्न चीजों को grep करने के लिए?

बहुत धन्यवाद!

उत्तर

4

जैसा कि अन्य ने कहा है, समस्या यह है कि एकल उद्धरण चर के विस्तार को रोकते हैं। हालांकि, $() का उपयोग कर आप दोहरे उद्धरण चिह्नों का उपयोग करने की अनुमति देता है:

echo " Number is: $(grep "Multiple_Frame = echo **$var**" 20mrf.txt | wc -l)" >>statisic.txt 

हालांकि मैं कुछ इस तरह संदेह है कि आप क्या मतलब है:

echo " Number is: $(grep "Multiple_Frame = $var" 20mrf.txt | wc -l)" >>statisic.txt 

तुम भी जानते हैं कि grep उत्पादन का विकल्प होता है किया जाना चाहिए गिनती ताकि आप wc छोड़ सकते हैं:

echo " Number is: $(grep -c "Multiple_Frame = $var" 20mrf.txt)" >>statisic.txt 
1

आपको प्रत्येक प्रतिस्थापन को एक चर में स्टोर करना होगा। इस तरह:

#!/bin/bash 

for ((var=0; var < 20; var++)) 
do 

count=`grep "Multiple_Frame = $var" 20mrf.txt | wc -l` 
echo " Number is: $count" >> statisic.txt 

done
+0

जब मैंने आपको बताया कि आदेश को विभाजित करने के बाद, मुझे निम्न त्रुटि जानकारी मिलती है। ./loop_count_reference_frame_no.sh: पंक्ति 10: grep "एकाधिक_फ्रेम = $ var" 20mrf.txt | wc -l: कमांड नहीं मिला – MaiTiano

+0

शायद एकल कोट सही grep परिणाम उत्पन्न नहीं कर सकता है और इसे नए "गिनती" चर में भेज सकता है। – MaiTiano

+0

मुझे पता है कि गलत जगह क्या है ... मुझे एसीसी का उपयोग सरल एकल उद्धरण नहीं करना चाहिए। फिर भी धन्यवाद। – MaiTiano

0

स्ट्रिंग $ (...) के अंदर एक सिंगल कोट्स ('...') इस हवाले से चर विस्तार से बचाता है के साथ उद्धृत किया गया है। इसके बजाए डबल कोट्स का प्रयोग करें। आपके मामले में:

#!/bin/bash 

for ((var=0; var<20; var++)) 
do 
echo " Number is: $(grep 'Multiple_Frame = echo **'"$var"'**' 20mrf.txt | wc -l)" >>statisic.txt 

done 

ध्यान दें कि इस उदाहरण में, यह echo आदेश के लिए दोहरे उद्धरण चिह्नों की तरह लगता है पहले से ही खोल रहे हैं, लेकिन आप ध्यान देना चाहिए कि $(...) पहले मूल्यांकन किया जाता है, और वहाँ इसके अंदर कोई दोहरे उद्धरण चिह्नों है । तो यहां परिवर्तन grep के एकल कोट को इसके बजाय डबल डबल कोट को बंद करना है, और डबल कोट्स को बंद करें और बाद में सिंगल कोट को दोबारा खोलें।

यह लंबी व्याख्या अभिव्यक्ति को तोड़ने के लाभ को अलग करती है, जैसा कि अन्य उत्तरों द्वारा सुझाया गया है।

+0

grep के एकल उद्धरण को बंद करने से यह सही परिणाम उत्पन्न करने में मदद नहीं कर सकता है। वैसे भी, धन्यवाद ~ – MaiTiano

1

ठीक है, दूसरी [एसआईसी] समस्या लाइन 5 पर आपके उद्धरण के साथ है। $ Var का संदर्भ कभी भी विस्तारित नहीं किया जाएगा क्योंकि यह सिंगल कोट्स के भीतर है। आप डबल कोट्स (\") से बचने के साथ सिंगल कोट्स (') को प्रतिस्थापित करके इसे ठीक कर सकते हैं।

पहली [एसआईसी] समस्या यह है कि आप एक ही पंक्ति में बहुत अधिक करने की कोशिश कर रहे हैं, जो उद्धरण के साथ आपकी घोंसले की समस्या का कारण बनता है। आवश्यकतानुसार मध्यस्थ परिणामों को संग्रहीत करने, कई आदेशों में लाइन को तोड़ दें। हाँ, यह एक पतला धीमा हो सकता है, लेकिन आप एक बहुत समय से डिबगिंग और इसे बनाए रखेंगे।

व्यापारी का दूसरा कानून: यदि आपको प्रदर्शन के लिए अनुकूलित करने और रखरखाव के अनुकूलन के बीच चयन करना है, तो हमेशा अपना कोड अधिक रखरखाव करने का चयन करें। कंप्यूटर हर समय तेजी से मिलता है; प्रोग्रामर नहीं करते हैं।

2

@OP, क्या आपको लगता है कि डब्ल्यू करना अरे बल्कि अक्षम है। आप एक ही फाइल पर grep और wc 20 बार कॉल कर रहे हैं। फ़ाइल को केवल एक बार खोलें, और उन सभी चीजों को प्राप्त करें जिन्हें आप फ़ाइल सामग्री के 1 पुनरावृत्ति में चाहते हैं। बैश 4 में उदाहरण।0

declare -A arr 
while read -r line 
do 
    case "$line" in 
     *"Multiple_Frame ="*) 
      line=${line#*Multiple_Frame = } 
      num=${line%% *} 
      if [ -z ${number_num[$num]} ] ;then 
       number_num[$num]=1 
      else 
       number_num[$num]=$((number_num[$num]+1)) 
      fi 
      ;; 
    esac  
done <"file" 
for i in "${!number_num[@]}" 
do 
    echo "Multiple_Frame = $i has ${number_num[$i]} counts" 
done 

इसी प्रकार, आप इस कार्य को करने में आपकी सहायता के लिए गॉक में सहयोगी सरणी का उपयोग कर सकते हैं।

gawk '/Multiple_Frame =/{ 
    sub(/.*Multiple_Frame = /,"") 
    sub(/ .*/,"") 
    arr["Multiple_Frame = "$0]=arr["Multiple_Frame = "$0]+1 
}END{ 
    for(i in arr) print i,arr[i] 
}' file 
+0

ओएमजी, आपका प्रोग्राम अद्भुत है। चूंकि मैं उन लिनक्स प्रोग्रामिंग के लिए ऐसी नौसिखिया हूं, इसलिए आप वास्तव में मुझे एक अच्छा सबक दे रहे हैं। धन्यवाद। ~ – MaiTiano

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