一行中的两个变量

时间:2010-08-17 04:16:30

标签: shell sed awk

损坏的表条目记录在错误文件中,如下所示......

  

/ usr / local / mysql / bin / mysqld:不正确   表的密钥文件   './accounts/headers.MYI';尝试   修理它

我想编写一个修复此表的查询。

  

REPAIR TABLE accounts.headers;

我需要做的是搜索“./”的第一个实例并选择第一个单词,即“accounts”,然后选择下一个单词“headers”。 现在使用这两个变量来编写如上所示的语句。 我应该为此目的编写Shell脚本吗?

3 个答案:

答案 0 :(得分:2)

您可以使用grepsed执行此操作:

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执行它时会抛出一个错误,但我可以忽略它。