1

Solaris 10 SPARCマシンでスクリプトを開発して、パッチ配信中に正常にインストールされたパッチの数を計算しています。ユーザーに表示したい:

(X)33個のパッチが正常にインストールされました

「X」を動的に置き換えてスクリプトを出力し、ユーザーがアクティビティが発生していることを認識できるようにします。カウンターのようなものです。カウントを表示することはできますが、改行でのみ表示できます。スクリプトがチェックを実行するときにブラケットを動的に更新するにはどうすればよいですか?「合格/不合格」について心配する必要はありません...私は主に、括弧内の出力更新を行うことに関心があります。

for x in `cat ${PATCHLIST}`
do
    if ( showrev -p $x | grep $x > /dev/null 2>&1 ); then
        touch /tmp/patchcheck/* | echo "pass" >> /tmp/patchcheck/$x
        wc /tmp/patchcheck/* | tail -1 | awk '{print $1}'
    else
        touch /tmp/patchcheck/* | echo "fail" >> /tmp/patchcheck/$x
        wc /tmp/patchcheck/* | tail -1 | awk '{print $1}'
    fi
done
4

2 に答える 2

2

これを行う通常の方法は、\rある時点でキャリッジリターン(CR)を発行し、行末の\n改行または改行(LF)を省略することです。を使用しているのでawk、次のことを試すことができます。

awk '{printf "\r%s", $1} END {print ""}'

ほとんどの行では、キャリッジリターンとフィールド1のデータを出力します(末尾に改行はありません)。入力の最後に、空の文字列とそれに続く改行を出力します。

awkもう1つの可能性は、スクリプトをforループの外側に配置する必要があることです。

for x in `cat ${PATCHLIST}`
do
    if ( showrev -p $x | grep $x > /dev/null 2>&1 ); then
        touch /tmp/patchcheck/* | echo "pass" >> /tmp/patchcheck/$x
        wc /tmp/patchcheck/* | tail -1
    else
        touch /tmp/patchcheck/* | echo "fail" >> /tmp/patchcheck/$x
        wc /tmp/patchcheck/* | tail -1
    fi
done | awk '{ printf "\r%s", $1} END { print "" }'

よくわかりませんが、スクリプト内の残りの繰り返しコードに同様の合理化を適用できると思います。

for x in `cat ${PATCHLIST}`
do
    if showrev -p $x | grep -s $x
    then echo "pass"
    else echo "fail"
    fi >> /tmp/patchcheck/$x
    wc /tmp/patchcheck/* | tail -1
done | awk '{ printf "\r%s", $1} END { print "" }'

touchこれにより、 (あまり効果がないように見えます)が排除されます。特に、の空の出力touchがパイプさechoれ、標準の入力が無視される場合は排除されます。行のサブシェルを削除しifます。それはそれを静かに保つための-sオプションを使用します。grep

私はまだwcラインについて少し疑わしいです。で識別されるファイルにパッチを2回リストしない限り、各ファイルには1行(合格または不合格)が含まれている必要があるため、実際にはファイルの数を数えようとしていると思います${PATCHLIST}。その場合、私はおそらく以下を使用します:

for x in `cat ${PATCHLIST}`
do
    if showrev -p $x | grep -s $x
    then echo "pass"
    else echo "fail"
    fi >> /tmp/patchcheck/$x
    ls /tmp/patchcheck | wc -l
done | awk '{ printf "\r%s", $1} END { print "" }'

これにより、/ tmp / patchcheck内のファイルが一覧表示され、出力された行数がカウントされます。これは、とが同じであるため$0awkスクリプトで簡単に印刷できることを意味します。効率が重要である限り(それほど多くはありません)、各ファイルを開くのではなく、ディレクトリのみをスキャンするため、これはより効率的です。しかし、それはあなたがやろうとしていることのより具体的なより正確な説明です。後でパスをカウントする場合は、次を使用できます。$0$1lswc

for x in `cat ${PATCHLIST}`
do
    if showrev -p $x | grep -s $x
    then echo "pass"
    else echo "fail"
    fi >> /tmp/patchcheck/$x
    grep '^pass$' /tmp/patchcheck/* | wc -l
done | awk '{ printf "\r%s", $1} END { print "" }'

もちろん、これは各ファイルの読み取りに戻りますが、現在はファイルからより洗練された情報を取得しています(これは、より洗練された情報に対するペナルティです)。

于 2012-03-19T23:34:10.513 に答える
1

パッチインストールスクリプトを希望どおりに機能させる方法は次のとおりです。

while read pkgline
do
    patchadd -d ${pkgline} >> /var/log/patch_install.log 2>&1
    # Create audit file for progress indicator
    for x in ${pkgline}
    do
        if ( showrev -p ${x} | grep -i ${x} > /dev/null 2>&1 ); then
            echo "${x}" >> /tmp/pass
        else
            echo "${x}" >> /tmp/fail
        fi
    done
    # Progress indicator
    for y in `wc -l /tmp/pass | awk '{print $1}'`
    do
        printf "\r${y} out of `wc -l /patchdir/master | awk '{print $1}'` packages installed for `hostname`.  Last patch installed: (${pkgline})"
    done
done < /patchdir/master
于 2012-04-25T21:48:25.477 に答える