myfile.txt 文件的内容如下:
| dbname |
| dbname1 |
| dbname2 |
以下命令应生成输出,如下所示:
cat myfile.txt | awk '{print "mysql -uroot -Bse \"call mysql.p_check_fk_constraint_violations('\'$2\'','\''%'\'')\""}'
预期产出:
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname','%')"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname1','%')"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname2','%')"
但实际输出是:
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('','%')"
如何在awk语句中添加数据库名称?
答案 0 :(得分:2)
这应该这样做 -
[jaypal~/Temp]$ cat db.file
| dbname |
| dbname1 |
| dbname2 |
这里我们用你的文字替换第二个字段并使用“&”匹配被替换的字段。
[jaypal~/Temp]$ awk -F\| '{sub($2,"mysql \-uroot \-Bse \"call mysql.p_check_fk_constraint_violations\(&,\%\)\""); print $2}' db.file
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations( dbname ,%)"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations( dbname1 ,%)"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations( dbname2 ,%)"
或者如Teudimundo建议的那样,你可以做 -
[jaypal~/Temp]$ cat db.file | awk '{print "mysql -uroot -Bse \"call mysql.p_check_fk_constraint_violations("$2",'%')\""}'
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations(dbname,%)"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations(dbname1,%)"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations(dbname2,%)"
<强>更新强>
[jaypal~/Temp]$ cat db.file | awk '{print "mysql -uroot -Bse \"call mysql.p_check_fk_constraint_violations('"'"'"$2"'"'"', '"'"'%'"'"')"}'
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname', '%')
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname1', '%')
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname2', '%')
[jaypal~/Temp]$ awk '{ print $2 }' db.file | awk '{sub($1,"mysql \-uroot \-Bse \"call mysql.p_check_fk_constraint_violations\('"'"'&'"'"','"'"'%'"'"'\)\""); print $0}'
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname','%')"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname1','%')"
mysql -uroot -Bse "call mysql.p_check_fk_constraint_violations('dbname2','%')"
答案 1 :(得分:1)
这里:'" $2 "'
你正在关闭第一个awk '
字符,所以shell解释了“$ 2”。
答案 2 :(得分:1)
'
的每个单引号'"'"'
,并提供此awk命令:
awk '{print "mysql -uroot -Bse \"call mysql.p_check_fk_constraint_violations('"'"'$2'"'"', '"'"'%'"'"')"}'
这是有效的,因为'"'"'
首先结束了awk命令的单引号字符串,开始一个包含单引号的新双引号字符串,然后用其余的awk启动一个新的单引号字符串命令。由于相邻的字符串在shell中连接在一起,这种看似奇怪的方法会产生您需要的字符串。
答案 3 :(得分:0)
假设使用 mysql 过程会更好,而不是使用 shell 脚本来跳出 mysql 。 。 我不熟悉 mysql 的过程语言,但我确信如果你搜索互联网 你可以快速提出一个简单的程序,如下所示:
delimiter //
drop procedure run_proc //
create procedure run_proc()
begin
declare done boolean default 0;
declare l_db_name varchar(100);
declare cur_db_names cursor
for
select
schema_name
from
information_schema.schemata;
declare continue handler for
sqlstate '02000' set done=1;
open cur_db_names;
repeat
fetch cur_db_names into l_db_name;
call mysql.p_check_fk_constraint_violations(l_db_name,'%');
until done end repeat;
close cur_db_names;
end;
//
delimiter ;
call run_proc;