использование переменных в awk print - PullRequest
2 голосов
/ 25 ноября 2011

Содержимое файла 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 ]

2 голосов
/ 25 ноября 2011

Это должно сделать это -

[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                ,%)"

В качестве альтернативы, как предложил Теудимундо, вы можете сделать -

[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 голос
/ 25 ноября 2011

У вас проблемы с одинарными кавычками, как сказал Теудимундо.Чтобы исправить это, вам нужно заменить каждую одиночную кавычку ', которую вы хотели бы вставить, на эту '"'"', давая команду awk:

awk '{print "mysql -uroot -Bse \"call mysql.p_check_fk_constraint_violations('"'"'$2'"'"', '"'"'%'"'"')"}'

Это работает, потому что '"'"' сначала заканчиваетсястрока в одинарных кавычках для команды awk начинает новую строку в двойных кавычках, содержащую одинарные кавычки, а затем начинает новую строку в одинарных кавычках с остальной частью команды awk.Поскольку соседние строки объединяются в оболочке, этот странный подход создает необходимую строку.

1 голос
/ 25 ноября 2011

здесь: '" $2 "' вы закрываете первый символ awk ', поэтому оболочка интерпретирует "$ 2".

0 голосов
/ 25 ноября 2011

Предполагается, что будет гораздо лучше использовать процедуру mysql вместо того, чтобы прыгать в mysql с использованием сценариев shell ... Я не знаком с процедурным языком 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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...