Получите определенное слово с помощью awk

Я кодирую сценарий для проверки 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)

Спасибо за Вашу поддержку

1
задан 30 March 2016 в 09:36

2 ответа

С тех пор 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" или нет. Если это не, условие верно, и строка печатается автоматически.
3
ответ дан 3 December 2019 в 06:22

Вы не должны читать файл линию за линией с помощью удара. 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
5
ответ дан 3 December 2019 в 06:22

Другие вопросы по тегам:

Похожие вопросы: