Вы можете использовать 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'
.
Поймать строки с разными размерами немного сложнее, и потребуется знать все форматы, чтобы избежать ложных срабатываний.Следующая команда перехватит альтернативный формат, указанный в вашем комментарии:
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
allachan@IBM-L3F3936 ~
$ 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;