2012-03-19 31 views
1

我正在Solaris 10 SPARC計算機上開發腳本以計算在修補程序交付過程中成功安裝的修補程序數量。我想向用戶顯示:Shell腳本的動態修補程序計數器

(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 

回答

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 
2

通常的方式做到這一點是發射在某一時刻一個\r回車(CR)和省略在該行的末尾的換行符\n或換行(LF)。由於您使用的awk,你可以嘗試:

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

對於大多數行,它輸出一個回車和外地1中的數據(不包括在最後一個換行符)。在輸入結束時,它會打印一個空字符串,後跟一個換行符。其他

一種可能性是,你應該把awk腳本您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其中IG優於其標準輸入。它消除了if行中的子shell;它使用grep-s選項來保持安靜。

我對wc這條線還是有點懷疑。我認爲你需要統計文件的數量,因爲每個文件都應該包含一行(通過或失敗),除非您在${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的文件和統計線輸出的數量。這意味着您可以簡單地在awk腳本中打印$0,因爲$0$1是相同的。在效率方面很重要(不是很多),這是更高效的,因爲ls只掃描一個目錄,而不是讓wc打開每個文件。但它更特別是對你正在嘗試做什麼的更準確的描述。如果你以後要算通行證,您可以使用:

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 "" }' 

當然,這要追溯到讀取每個文件,但你現在出了它越來越完善的信息(這就是爲點球更精緻的信息)。

+0

謝謝喬納森,這是非常有幫助的!欣賞優秀的反饋。 – Christopher 2012-03-20 02:29:14

相關問題