2013-02-10 56 views
1

以下是日常報告腳本中的一個片段,用於檢查磁盤的SMART狀態。在'else'中清除正確的值

但是,我希望將$ STATUS的全部值打印在'else'子句中,但是現在將它截斷爲僅第一個單詞($ 3)。

我該如何克服這個問題?

echo "SMART STATUS" >> $LOGS 
echo "--------------------------" >> $LOGS 
DISKS=(0 1 2 3 4 5 6 7) 

for i in "${DISKS[@]}" ; 

do 

STATUS=`diskutil info /dev/disk$i | grep SMART | awk '{ print $3 }'` 

if [ "$STATUS" = "Verified" ]; then 
     echo "SMART STATUS OK FOR DISK $i" >> $LOGS 
else 

     echo "** SMART STATUS $STATUS FOR DISK $i **" >> $LOGS 
fi 
done 

echo " " >> $LOGS 
echo " " >> $LOGS 

例如:

$ diskutil info /dev/disk8 | grep SMART      
    SMART Status:    Not Supported 
$ diskutil info /dev/disk2 | grep SMART 
    SMART Status:    Verified 

理想的劇本要重申 「不支持」 像disk8情況。我認爲「SMART Status:」的值在一個字和幾個字之間可能會有所不同。我沒有在手冊頁上看到所有的可能性,所以我沒有明確的答案。

+0

而不是做的''回聲等等等等>> $ LOGS''考慮包裝所有的代碼在''{... ALL-YOUR-CODE ...} >> $ LOGS 2>&1''然後你可以刪除所有''>> $ LOGS'',那麼所有到stdout和stderr的東西都會被記錄在日誌中。 – sotapme 2013-02-10 19:47:34

回答

2

可以保存grep,並把所有的東西在AWK:

試試這個:

STATUS=$(diskutil info /dev/disk$i|awk -F': *' '/SMART/{print $2}') 
+0

你是最完美的答案!精彩的工作。謝謝! – Dan 2013-02-10 18:34:04

1

這是否適合您的需求?

disks="0 1 2 3 4 5 6 7" 

for i in $disks; do 
    status=$(diskutil info /dev/disk$i | awk '/SMART/{$1=$2="";print}') 

    if [[ $status == *Verified* ]]; then 
      echo "SMART status OK for disk $i" 
    else 
      echo "** SMART status $status for disk $i **" 
    fi 
done 
0

cut解決方案

如果你能依靠的diskutil打印的空格數,你可以開始在狀態的第一個字符切割:

STATUS=`diskutil info /dev/disk$i | grep SMART | cut -c 30-` 

awk解決方案

單詞Supported被捕獲爲$4,所以我們可以使用if語句來檢查,這個詞是否被填充:

STATUS=`diskutil info /dev/disk$i | grep SMART | awk '{ if($4 != "") print $3,$4; else print $3; }'` 
+2

'awk'能夠自己加油,不需要管道,看到我的迴應。 – 2013-02-10 18:19:19

0

如果你有GNU的grep,你可以這樣做:

STATUS=$(diskutil info /dev/disk$i | grep -oP '(?<=SMART Status:).*') 

該變量的內容將包含前導空格。但是,你如果條件可以容納說:

shopt -s extglob 
if [[ ${STATUS##*([[:space:]])} == Verified ]]; then 
+0

你可以匹配Perl風格的正則表達式中的空格,也許可以通過使用'\ w。*'來匹配一個字符後面跟着任何東西來使尾部'。*'少一些貪婪,不是嗎? – 2013-02-10 18:33:01

+1

外觀斷言必須固定寬度。你不能把'\ s *'放在那裏。 – 2013-02-10 21:15:18

+0

噢......麻煩......你可能是對的(關於可變長度後視)。我很少用它們,所以我忘記了。 – 2013-02-10 21:48:04