猫、awk、すべて同じsed

すべての人に良い一日を!



古いスクリプトをいじってみると、次のようなスクリプトが見つかりました。



#!/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))
      
      





その中で、ファイルの先頭からアーカイブされたデータの末尾までの行のオフセットを取得します。

私が最初に目を引いたのは、パイプと猫とawkの使用でした。 当然、私はすぐにコピーしました

 SKIP=$((`awk '/#!\/bin\/sh/,/^#END/{print}' $0|wc -l`+1))
      
      





しかし、これでさえ十分ではないように思えました。 すでにawkを使用している場合にwcを使用すると、さらに多くのことができます。 toで何かが起こった

 SKIP=$(awk 'BEGIN{comp_str=0} /#!\/bin\/sh/,/^#END/{comp_str++} END{print ++comp_str}' $0)
      
      





繰り返しになりますが、文字が多すぎて読みにくいため、結果として

 SKIP=$(awk '/^#END/{print ++NR}' $0)
      
      





ただし、#END文字が最初に出現するまではここで満たされないという条件。 500 MBを超えるテキストデータで実行するスクリプトを起動したことは興味のあることですが、私には適していますが、スクリプトが約25秒間実行されていることがわかりました。 私はawkでexit関数を探し始めました(後でoxpa habermanからアドバイスされました)が、その瞬間、不注意のために、それを機能させることができませんでした。 結局、こうなった

 SKIP=$((`sed -n '/^#END/{=}' $0` + 1))
      
      





500メガバイトの同じファイルをチェックしたところ、2秒未満のランタイムが見られました。 すばらしいですが、なぜファイル全体を監視する必要があるのですか。また、最初のバージョンでは、ファイルへの最初のエントリの前に条件がありました。 そのようなオプションに書き換える以外に選択肢はありませんでした

 SKIP=$((`sed -n '/^#END/{=;q;}' $0` + 1))
      
      





まあ、またはawkでできます

 SKIP=$(awk '/^#END/{print ++NR; exit;}' $0)
      
      





ご清聴ありがとうございました!



PS:habracheloveka oxpaから(彼は本当にありがとう !)そのようなオプションを受け取った

 SKIP=$(grep -A1 -n "^#END" $0 | tail -1 | cut -f 1 -d -)
      
      





このオプションは、sedオプションの2倍の速さで動作します。もちろん、ファイルが大きく、ラベルが最後にある場合について説明しています。



All Articles