2010-08-17 4 views
1

Запись коррумпированной таблицы записывается в файл ошибок что-то вроде этого ...Две переменные из строки

/USR/местные/MySQL/бен/MYSQLD: Некорректное файл ключа для таблицы ». /accounts/headers.MYI '; попробуйте его ремонт

Я хочу написать запрос, который отремонтирует эту таблицу.

REPAIR TABLE accounts.headers;

Что мне нужно сделать, это найти первый экземпляр «./» и выбрать первое слово i.e. «accounts» и выбрать следующее слово «headers». Теперь используйте эти две переменные, чтобы написать оператор, как показано выше. Должен ли я писать сценарий оболочки для этой цели?

ответ

2

Вы можете использовать grep и sed сделать это:

pax> cat qq.in 
/blah: Incorrect key file for table './accounts/headers.MYI'; try blah 
/blah: Incorrect key file for table './pax/diablo.myi'; try blah 

pax> grep 'Incorrect key file for ' qq.in | sed 
    -e 's/.*\.\//REPAIR TABLE /g' 
    -e 's/\//./' 
    -e 's/\.[Mm][Yy][Ii].*/;/g' 
REPAIR TABLE accounts.headers; 
REPAIR TABLE pax.diablo; 

Обратите внимание, что я положил все эти -e разделов на разных строках для удобства чтения. Они должны быть на одной линии для тестирования.

Если ваша версия sed поддерживает поиск без учета регистра (например, GNU), вы можете заменить эту последнюю замену на 's/\.myi.*/;/Ig'.


Поймать линии с различным foramts немного сложнее и требует, чтобы все форматы, чтобы быть известными, чтобы избежать ложных срабатываний. Следующая команда будет поймать альтернативный формат, поступающую в ваш комментарий:

pax> cat qq.in 
/blah: Incorrect key file for table './accounts/headers.MYI'; try blah 
/blah: Incorrect key file for table './linus/torvalds.myi'; try blah 
/usr/local/mysql/bin/mysqld: Table './beta/search_data' is marked as crashed 

[email protected] ~ 
$ egrep 'Incorrect key|as crashed' qq.in | sed 
    -e "s/.*\.\//REPAIR TABLE /g" 
    -e "s/[\\.'].*/;/g" 
    -e "s/\//./" 
REPAIR TABLE accounts.headers; 
REPAIR TABLE linus.torvalds; 
REPAIR TABLE beta.search_data; 
+0

/usr/local/mysql/bin/mysqld: Таблица «./beta/search_data» помечена как разбитая и должна быть исправлена. Ошибка, подобная этой, не генерирует требуемый оператор. Что мне нужно сделать, так это заменить последний '; и удалить все после этого. – shantanuo

+0

] При чтении таблицы получена ошибка 126 ./kumar/headers ' # Другая ошибка, которую необходимо обработать. – shantanuo

+0

@shantanuo, вам нужно _fully_ указать, какие строки вы ищете. У вашей оригинальной спецификации была только форма, содержащая 'Неверный файл ключа для таблицы'. Пока это не будет сделано, никакое решение не может дать вам то, что вы хотите, без возможности ложных срабатываний. – paxdiablo

0
#!/bin/bash 
while read -r line 
do 
case "$line" in 
    *repair*) 
    line="${line##*for table}" 
    line="${line%%;*}" 
    line=${line#*.\/} 
    IFS="/" 
    set -- $line 
    echo "REPAIR TABLE $1.${2%.MYI*}" 
esac 
done <"file" 

или просто СЭД

$ sed 's|.*\.\/|REPAIR TABLE |;s|\/|.|;s|\.MYI.*||' file 
REPAIR TABLE accounts.headers 
+0

Операция таблицы ремонта должна заканчиваться; Сценарий не обрабатывает другие типы ошибок, упомянутых выше. – shantanuo

0

Следующая делает то, что я ожидаю, что это сделать. Но я не слишком доволен этим и хотел бы знать лучшее решение.

awk -F"'./" '{print $2}' | replace "'" ';' | replace "/" "." | replace '.MYI' '' | sed 's/^/; REPAIR TABLE /' 

Он будет выводить заявления, как это ...

; REPAIR TABLE kumar.headers;; try to repair it 
; REPAIR TABLE raju.headers;; try to repair it 

Текст после; будет вызывать ошибку при выполнении mysql, но я могу игнорировать ее.

Смежные вопросы