1

以下は、ディスクの SMART ステータスをチェックする日次レポート スクリプトのスニペットです。

$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:」の値は、1 単語から数単語の間で異なる場合があると思います。マニュアルページにすべての可能性があるわけではないので、これに対する決定的な答えはありません。

4

4 に答える 4

2

を保存してgrep、すべてを awk に入れることができます。

これを試して:

STATUS=$(diskutil info /dev/disk$i|awk -F': *' '/SMART/{print $2}')
于 2013-02-10T18:19:20.340 に答える
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
于 2013-02-10T18:16:15.277 に答える
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; }'`
于 2013-02-10T18:16:32.787 に答える
0

GNU grep がある場合は、次のことができます。

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

変数の内容には、先頭の空白が含まれます。ただし、 if 条件は次のことに対応できます。

shopt -s extglob
if [[ ${STATUS##*([[:space:]])} == Verified ]]; then
于 2013-02-10T18:27:39.590 に答える