Я кодирую сценарий для проверки mysql баз данных с помощью сценария удара, я хотел бы проверить, не ли состояние таблицы 'в порядке', возвратит имя таблицы и сделает еще некоторые действия:
check.log
table1 OK
table2 Some error here
table3 OK
table4 OK
table5 Another error
table6 OK
table7 Broken
table8 A very long error which take a 2 lines
of multiple errors
check.sh
# check and repair tables
mysqlcheck -u $hostUser -p$hostPasswd --all-databases --check --auto-repair >> check.log
# grep tables status, should return OK
cat check.log | grep 'OK' | awk '{print $2}'| while read status; do
# if any table does not contain OK
if [ "$status" != "OK" ]
then
##### HERE WHERE I am stuck
#### It loops and return all the table
# grep to get the table name
cat check.log | grep 'OK' | awk '{print $1}'| while read table; do
echo $tblName' is BROKEN'
done
else
echo $tblName' is FINE'
fi
done
// here I need to mail the tables that have problems in one single mail
Поиск вывода как:
tableName: error
tableName: error
table2: Some error here
table5: Another error
and so on
Эти строки будут выводом в файл журнала (result.txt)
Спасибо за Вашу поддержку
С тех пор awk
поведение по умолчанию состоит в том, чтобы распечатать сплошную линию, когда Истинное условие происходит, можно сказать что-то настолько простое:
awk '$NF != "OK"' file
, Который возвращает следующее для Вашего данного входа:
table2 Some error here
table5 Another error
table7 Broken
table8 A very long error which take a 2 lines
of multiple errors
NF
обозначает количество полей, таким образом $NF
обозначает поле номер NF
. Таким образом, последнее поле на каждой строке. $NF != "OK"
мы проверяем, ли последнее поле на строке" OK
" или нет. Если это не, условие верно, и строка печатается автоматически. Вы не должны читать файл линию за линией с помощью удара. Awk уже делает это. Например, можно распечатать поврежденные записи с помощью этого кода
awk '$2!="OK"{print $0}' check.log
Можно также просто распечатать имя таблицы и использование, которые управляют для создания массива, затем реагируют на них:
array=( $(awk '$2!="OK"{printf "%s ",$1 }' check.log) )
Отметьте пространство рядом с %s
, это важно.
Вы упомянули также, та ошибка может быть мультилинией, точно так же, как для table8. Мы, вероятно, не хотим смешивать с этим. Таким образом, мы можем добавить проверку также, чтобы поле 1 содержало таблицу слова.
$> array=( $(awk '$1~/table/ && $2!="OK"{printf "%s ",$1 }' check.log) )
$> echo ${array[@]}
table2 table5 table7 table8
$> echo ${array[0]}
table2