Правильное значение Grepping в 'else'

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:" может варьироваться между одним словом и несколькими. Я не вижу всех возможностей на странице руководства, поэтому у меня нет окончательного ответа на это.

спросил(а) 2013-02-10T21:05:00+04:00 6 лет, 9 месяцев назад
4
4 ответа
2

Вы можете сохранить grep и поместить все вещи в awk:

попробуй это:

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

ответил(а) 2013-02-10T21:19:00+04:00 6 лет, 9 месяцев назад
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-10T21:16:00+04:00 6 лет, 9 месяцев назад
0

Если у вас есть GNU grep, вы можете сделать:

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

Содержимое переменной будет содержать ведущие пробелы. Однако ваше условие if может соответствовать этому:

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

ответил(а) 2013-02-10T21:27:00+04:00 6 лет, 9 месяцев назад
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-10T21:16:00+04:00 6 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема