损坏的表条目记录在错误文件中,如下所示......
/ usr / local / mysql / bin / mysqld:不正确 表的密钥文件 './accounts/headers.MYI';尝试 修理它
我想编写一个修复此表的查询。
REPAIR TABLE accounts.headers;
我需要做的是搜索“./”的第一个实例并选择第一个单词,即“accounts”,然后选择下一个单词“headers”。 现在使用这两个变量来编写如上所示的语句。 我应该为此目的编写Shell脚本吗?
答案 0 :(得分: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'
替换最后一次替换。
要捕捉具有不同物品的线条有点棘手,并且需要知道所有格式以避免误报。以下命令将捕获注释中提供的备用格式:
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;
答案 1 :(得分: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
$ sed 's|.*\.\/|REPAIR TABLE |;s|\/|.|;s|\.MYI.*||' file
REPAIR TABLE accounts.headers
答案 2 :(得分: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执行它时会抛出一个错误,但我可以忽略它。