使用awk/sed解析MySQL错误中的多个字符串

使用awk/sed解析MySQL错误中的多个字符串,mysql,bash,sed,Mysql,Bash,Sed,我有一个bash脚本,需要识别从终端运行的SHOW SLAVE STATUS\G命令生成的MySQL错误中的一些重要子字符串。特别是,以Last\u Error:…开头的行非常重要。例如,如果该行已读取(为便于读取,将其分成多行): 假设错误字符串存储在变量$LAST_error中,我使用了以下三个变量来存储user_id、表中带有FK约束的字段、users、FK引用的表以及users中被引用的键id: FIELD=`echo $LAST_ERROR | sed 's/.*FOREIGN KEY

我有一个bash脚本,需要识别从终端运行的
SHOW SLAVE STATUS\G
命令生成的MySQL错误中的一些重要子字符串。特别是,以
Last\u Error:…
开头的行非常重要。例如,如果该行已读取(为便于读取,将其分成多行):

假设错误字符串存储在变量$LAST_error中,我使用了以下三个变量来存储
user_id
、表中带有FK约束的字段、
users
、FK引用的表以及
users
中被引用的键
id

FIELD=`echo $LAST_ERROR | sed 's/.*FOREIGN KEY [\(\`]*\([0-9a-zA-Z_-]*\)[\`\)]*.*/\1/'`
TABLE=`echo $LAST_ERROR | sed 's/.*REFERENCES \`\([0-9a-zA-Z_-]*\)\`.*/\1/'`
COLUMN=`echo $LAST_ERROR | sed 's/.*REFERENCES \`['$TABLE']*\` [\(\`]*\([0-9a-zA-Z_-]*\)[\`\)]*.*/\1/'`
这三个变量及其sed命令是一种可接受的查找值的方法吗?定义了这些变量后,我需要通过错误中的SQL查询进行解析。与此特定情况相关的唯一变量(其余变量在脚本的其他地方使用)是
$FIELD
。在这种情况下,我需要确定SQL查询中指定的字段是否为:

(session_id,user_id,lastused,ip)
$FIELD
是SQL查询中列出的第四个字段,它的对应值为:

('749d9d494c31ab8ee76bf6b6b1127fd2','15389','2011-09-27 14:04:59','172.16.11.31')

is
15389
。哪些sed/awk命令可以引用SQL查询中列出的字段,并在查询的后半部分找到相应的值?

表面上看,这个
sed
脚本将列出您请求的部分:

sed 's/.* FOREIGN KEY (\([^)]*\)) REFERENCES \([^(]*\) (\([^)]*\)) .*/(\1) \2 (\3)/'

假设表名和列名中既不使用开括号也不使用闭括号,这并非完全不可信。输出是明确的,并且处理引用另一列列表的列列表。

这是一个相当广泛的问题。到目前为止,您尝试了什么?我已经编辑了我的问题,到目前为止,我已经找到了使用awk的
user\u id
id
的值,尽管我不完全确定这是否是解决这个问题的首选方法。这将为您提供用户id:cat error.txt | tr'\n''sed s/'.*值'/| awk-F'{print$2,$3,$4}| tr''''.\tr tr“”“| awk'{print$1}”'我尽力解析出了我需要的三个变量。我不能完全确定我采用的方法是否理想。现在我只需要使用
$FIELD
变量解析SQL查询并确定插入的
$FIELD
值。我设法将它们分成三个单独的sed命令ands,并编辑了我的原始问题以反映它们。虽然我不完全相信我的方法是理想的。你的想法是什么?我可能会对这一项使用像我一样的单个命令-可能使用适当的模式来替换匹配的行,可能使用
sed-n
来抑制n正常打印,然后在替换后添加一个
p
,以打印三部分匹配。
sed 's/.* FOREIGN KEY (\([^)]*\)) REFERENCES \([^(]*\) (\([^)]*\)) .*/(\1) \2 (\3)/'