在awk打印中使用变量

时间:2011-11-25 11:43:15

标签: awk

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语句中添加数据库名称?

4 个答案:

答案 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)

正如Teudimundo所说,由于单引号,你遇到了问题。要解决此问题,您需要替换要嵌入此'的每个单引号'"'"',并提供此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;