Две переменные из строки - PullRequest
1 голос
/ 17 августа 2010

Поврежденная запись таблицы заносится в файл ошибок примерно так ...

/ usr / local / mysql / bin / mysqld: неверно ключевой файл для таблицы './Accounts/headers.MYI'; пробовать отремонтируйте это

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

REPAIR TABLE account.headers;

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

Ответы [ 3 ]

2 голосов
/ 17 августа 2010

Вы можете использовать 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;
0 голосов
/ 17 августа 2010

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

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 выполнит ее, но я могу проигнорировать ее.

0 голосов
/ 17 августа 2010
#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...