2013-04-13 1 views
5

मैं पाश में कई तार जोड़ और चर के लिए परिणाम सौंपने होंगे श्रेणीबद्ध करने के लिए:कैसे बैश में printf के साथ स्वरूपित तार

प्रारूपण स्ट्रिंग उदाहरण:

result=$(printf '| %-15s| %-25s| %-15s| %-15s| %-15s\n' $size $name $visits $inbound $outbound); 
मेरे विचार से

इसे इस तरह से काम करना चाहिए:

result='' 
while read somevar 
do 
    ... 
    outbound=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|awk '{ sum+=$11} END {print sum/1024/1024}'` 
    result=$(printf '%s| %-15s| %-25s| %-15s| %-15s| %-15s\n' $result $size $name $visits $inbound $outbound); 
    ... 
done 
echo $result 

लेकिन यह नहीं है :(

युपीडी:

पूर्ण कोड नीचे लिस्टिंग:

www_path='/var/www'; 
result=''; 
cd /var/www/; ls -d */ | while read i ; do basename "$i" ; done 
while read i; 
do du -sh "$i"| 
     while read size name 
     do 
       visits=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|grep -v "internal dummy connection"|awk -F ' ' '{print $1}' | sort | uniq | wc -l|tr '\n' '\t'|sed 's/$/\t/'` 
       inbound=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|grep -v "internal dummy connection"|awk '{ sum+=$10} END {print sum/1024/1024}'|tr '\n' '\t'|sed 's/$/\t\t/'` 
       outbound=`cat "$www_path/$name/access.log"|grep \`date +"%d/%b/%Y"\`|grep -v "internal dummy connection"|awk '{ sum+=$11} END {print sum/1024/1024}'`; 
       result=$(printf '%s| %-15s| %-25s| %-15s| %-15s| %-15s\n' "$result" "$size" "$name" "$visits" "$inbound" "$outbound") 
     done 
done 
echo $result 
+3

** हमेशा ** यकीन है कि कोड एक प्रश्न में पोस्ट समस्या आप कर रहे हैं reproduces बनाते हैं; आपकी मूल पोस्ट नहीं थी। कारण 'result' रिक्त है कि आप एक subshell अंदर यह करने के लिए बताए कर रहे हैं; सबहेल निकलने के बाद वे परिवर्तन गायब हो जाते हैं। आपके मूल प्रश्न के आधार पर हमें यह जानने का कोई तरीका नहीं था। – chepner

+1

एक और नोट पर - यह आश्चर्यजनक रूप से भयानक कोड है। आपको कभी भी इस तरह से 'एलएस' से उत्पादन का विश्लेषण नहीं करना चाहिए; http://mywiki.wooledge.org/ParsingLs को एक स्पष्टीकरण के लिए देखें - भी, 'बिल्ली | इनपुट की प्रत्येक पंक्ति के लिए grep' तीन बार अत्यधिक अक्षम है। –

उत्तर

7

$ परिणाम को दोहरे उद्धरण चिह्नों और अन्य सभी चर कि कारतूस और अन्य विशेष वर्ण हो सकते हैं अगर वे एक कार्यक्रम के लिए एक एकल तर्क के रूप में उपयोग किया जाता है या निर्मित समारोह हो रहे हैं का उपयोग करें:

result=$(printf '%s| %-15s| %-25s| %-15s| %-15s| %-15s\n' "$result" "$size" "$name" "$visits" "$inbound" "$outbound") 

आप तो वहाँ भी एक + = असाइनमेंट ऑपरेटर है कि बस तार करने के लिए संलग्न कर देता है (देखें बैश आदमी पेज, खंड पैरामीटर: बस एक चर करने के लिए printf का परिणाम आवंटित करने के लिए, आप भी

printf -v result '%s| %-15s| %-25s| %-15s| %-15s| %-15s\n' "$result" "$size" "$name" "$visits" "$inbound" "$outbound" 

BTW उपयोग कर सकते हैं चाहते हैं (तुमने किया था के रूप में))।

पूर्ण कोड सूची में, एक पाइप चिह्न के बाद 'पूर्ण' दूसरे से पहले याद आ रही है 'जब मैं पढ़ा।

और जब आप

echo $result 

फोन $ परिणाम की सामग्री को पहले से ही, खो दिया है के बाद से printf के बाद पाइप हस्ताक्षर के द्वारा बनाई गई एक उप प्रक्रिया में कहा जाता है 'कर डु ...'। मूल प्रक्रियाओं को उप प्रक्रिया के (पर्यावरण) चर तक पहुंच नहीं है।

मैं नहीं बल्कि कोड कुछ करने के लिए की तरह

result="" 
for name in /var/www/* ; do 
    read size __ < <(du -sh "$name") 
    name=${name##*/} 
    #insert the other stuff here and add arguments to printf 
    printf -v line '| %-15s| %-25s\n' "$size" "$name" 
    result+=$line 
done 
echo "$result" 

read < <(cmd) अभिव्यक्ति cmd | read के समान है लेकिन पूर्व बजाय उप प्रक्रिया में आदेश डालता है, जबकि पढ़ने मुख्य प्रक्रिया में निष्पादित किया जाता है फिर से लिखने चाहते हैं। इस तरह, पढ़ने के द्वारा सेट किए गए चर का उपयोग बाद के आदेशों में भी किया जा सकता है।

+0

ऐसा लगता है कि समस्या printf में नहीं है लेकिन कहीं पाइप और लूप में है। मैंने पूर्ण स्रोत कोड – user947668

+0

जोड़ा है मैंने जवाब अपडेट किया है, मुख्य बात शायद शीर्षतम पैरेंट प्रक्रिया – Jacob

+0

जैकब से परिणाम env var तक पहुंच है, धन्यवाद। आपका कोड बहुत बेहतर है! – user947668

1

आपका कोड ठीक लग रहा है। एक बात के रूप में आप यह करने के लिए जोड़ के बाद से result खाली स्थान के शामिल होंगे आप, क्या करना चाहिए, इसके विस्तार बोली है:

result=$(printf '...' "$result" "$size" "$name" ...) 

अन्य चर का हवाला देते हुए आवश्यक नहीं हो सकता है, लेकिन यह आम तौर पर एक अच्छा विचार है।

$result उद्धृत करने के लिए यह पूरी तरह से खाली होने का कारण बन नहीं करना चाहिए, लेकिन असफल। आप अपने while पाश में कोड की अधिक पोस्ट करने के लिए आवश्यकता हो सकती है।

+0

मैंने परिवर्तनीय $ आउटबाउंड का उदाहरण जोड़ा है। printf में प्रयुक्त अन्य चर समान हैं। लूप – user947668

+0

पूर्ण स्रोत कोड में कुछ और नहीं है। – user947668

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