बिल्ली, awk और सभी एक ही सीड

सभी को शुभ दिन!

अपनी पुरानी लिपियों पर घूमते हुए, मुझे निम्नलिखित सामग्री के साथ एक स्क्रिप्ट मिली:

#!/bin/sh #           PKCS if [ -f /etc/openvpn/ssl/vars ]; then . /etc/openvpn/ssl/vars >/dev/null else echo " /etc/openvpn/ssl/vars  " exit 1 fi MAILTO="root" SKIP=$((`cat $0 | awk '/#!\/bin\/sh/,/^#END/{print}'|wc -l`+1)) Dialog=${Dialog=dialog} CWD=$(pwd) cd $KEY_DIR Files=`ls -1 *.p12` cd $CWD Spisok="" for i in $Files; do Spisok="$Spisok $i -"`basename $i .p12` done Choice=`$Dialog --stdout --clear --menu " " 20 71 14 $Spisok` retval=$? User=`basename $Choice .p12` case $retval in 0) TEMP="/tmp/$User.vpn" if [ -e $TEMP ]; then rm -rf $TEMP fi mkdir -p $TEMP 2>/dev/null mkdir -p $TEMP/yyy 2>/dev/null config="$TEMP/YYY-$User.ovpn" cat << EOF_CONFIG > $config client remote xxxxx port 1194 proto udp dev tun ns-cert-type server tls-client reneg-sec 60 mtu-test cipher AES-256-CBC comp-lzo persist-key persist-tun keysize 256 nobind explicit-exit-notify 2 pkcs12 yyy/$Choice EOF_CONFIG cp $KEY_DIR/$Choice $TEMP/yyy 2>/dev/null tail -n +$SKIP $0 | gzip -cd | tar xvf - -C $TEMP >/dev/null cd $TEMP tar zcvf ${User}_YYY.tgz `basename $config` `basename $TEMP/Readme-OpenVPN.doc` yyy >/dev/null . . . . exit 0 #END           

सिद्धांत रूप में, स्क्रिप्ट कंटेनर फ़ाइल का चयन करने के लिए एक मेनू प्रदान करती है जिसमें यह फ़ाइल निर्दिष्ट पते पर निर्देशों के साथ भेजती है। स्क्रिप्ट को विभिन्न सर्वरों में स्थानांतरित करना संभव है और निर्देशों के बारे में न सोचने के लिए, मैंने निर्देशों को निष्पादन योग्य स्क्रिप्ट में डाल दिया और, जब मैंने इसे निष्पादित किया, तो मैंने इसे बाहर निकाल दिया, इसे अनज़िप कर दिया और इसे वहां से भेज दिया। लेकिन नोट स्वयं निर्देशों के बारे में नहीं है, बल्कि कुछ आदेशों के गैर-इष्टतम उपयोग के बारे में है।
वह टीम जो मुझे पसंद नहीं थी और जिसे मैं अनुकूलित करना चाहता था वह इस तरह दिखती है
 SKIP=$((`cat $0 | awk '/#!\/bin\/sh/,/^#END/{print}'|wc -l`+1)) 

इसमें, हमें फ़ाइल के आरंभ से लेकर फ़ाइल के अंत में संग्रहीत डेटा तक की पंक्तियों में ऑफसेट मिलता है।
मेरी आंख को पकड़ने वाली पहली चीज बिल्ली का उपयोग थी और पाइप के माध्यम से जागती थी। स्वाभाविक रूप से, मैंने तुरंत इसकी प्रतिलिपि बनाई
 SKIP=$((`awk '/#!\/bin\/sh/,/^#END/{print}' $0|wc -l`+1)) 

लेकिन यह भी मुझे पर्याप्त नहीं लग रहा था। यदि हम पहले से ही awk का उपयोग करते हैं, तो wc का उपयोग क्यों करें, जो बहुत कुछ कर सकता है। टोगा में कुछ हुआ है
 SKIP=$(awk 'BEGIN{comp_str=0} /#!\/bin\/sh/,/^#END/{comp_str++} END{print ++comp_str}' $0) 

और फिर, बहुत सारे पात्र, और पढ़ने में बहुत कठिन हैं, परिणामस्वरूप हमारे पास है
 SKIP=$(awk '/^#END/{print ++NR}' $0) 

लेकिन, यह शर्त कि जब तक #END पात्रों की पहली घटना यहां पूरी नहीं होती है। हालाँकि यह मुझे सूट करता है, हित के लिए, 500 मेगाबाइट से अधिक के पाठ डेटा पर निष्पादित करने के लिए एक स्क्रिप्ट लॉन्च की, मैंने पाया कि स्क्रिप्ट लगभग 25 सेकंड तक चली। मैंने एग्जिट फंक्शन की तलाश शुरू कर दी थी (जैसा कि ऑक्सपा हैबरमैन ने बाद में मुझे सलाह दी थी) जागने पर, लेकिन उस समय, असावधानी के कारण, मुझे यह काम करने के लिए नहीं मिला, यह कितना मजेदार नहीं था, और मैं सीड की तरफ शुरू हो गया। अंत में, यह इस तरह निकला
 SKIP=$((`sed -n '/^#END/{=}' $0` + 1)) 

500 मेगाबाइट की एक ही फाइल पर जाँच करने के बाद, मैंने 2 सेकंड से कम का रनटाइम देखा। महान, लेकिन हमें पूरी फ़ाइल देखने की आवश्यकता क्यों है, और फिर से, पहले संस्करण में, फ़ाइल में पहले प्रवेश से पहले एक शर्त थी। इस तरह के विकल्प को फिर से लिखने के अलावा कोई चारा नहीं था
 SKIP=$((`sed -n '/^#END/{=;q;}' $0` + 1)) 

अच्छी तरह से, या आप जाग सकते हैं
 SKIP=$(awk '/^#END/{print ++NR; exit;}' $0) 

आपका ध्यान के लिए धन्यवाद!

पुनश्च: habracheloveka oxpa से (जिसके लिए वह बहुत धन्यवाद!) इस तरह के एक विकल्प प्राप्त किया
 SKIP=$(grep -A1 -n "^#END" $0 | tail -1 | cut -f 1 -d -) 

यह विकल्प सेड विकल्प की तुलना में दोगुना तेजी से काम करता है, निश्चित रूप से हम इस बारे में बात कर रहे हैं कि फाइल बड़ी है और लेबल अंत में है।


Source: https://habr.com/ru/post/In152183/


All Articles