Ожидайте побега с Awk - PullRequest
       28

Ожидайте побега с Awk

0 голосов
/ 10 января 2012

Мне нужно обработать вывод запроса psql с одной записью через awk, прежде чем присваивать ему значение в моем ожидаемом скрипте.

Соответствующий код:

spawn $env(SHELL)
send "psql -U safeuser -h db test -c \"SELECT foo((SELECT id FROM table where ((table.col1 = \'$user\' AND table.col2 IS NULL) OR table.col2 = \'$user\') AND is_active LIMIT 1));\" | /bin/awk {{NR=3}} {{ print $1 }}; \r"
expect "assword for user safeuser:"
send "$safeuserpw\r"
expect -re '*'
set userpass $expect_out(0, string)

Когда я запускаю скрипт, я получаю:

spawn / bin / bash не могу прочитать "1": нет такой переменной "send" psql -U safeuser -h db test -c \ "SELECT foo ((SELECT id ИЗ таблицы где ((table.col1 = \ '$ user \' AND table.col2 ..."

Есть что-то вопиющее, что я здесь скучаю? У меня сложилось впечатление, что двойные фигурные скобки защищают блок кода awk.

Ответы [ 2 ]

1 голос
/ 12 августа 2015

Ваша строка отправки оценивается tcl, потому что она в кавычках "".если вы хотите передать его так, как должно быть, вы должны изменить свою часть awk, чтобы избежать $:

... |/ bin / awk \ 'NR == 3 {print \ $ 1} \';\ Г "

1 голос
/ 11 января 2012

Скрипт awk покажет все строки, потому что вы используете '=' вместо '==' в условном выражении. Попробуйте следующее:

spawn $env(SHELL)
send "psql -U safeuser -h db test -c \"SELECT foo((SELECT id FROM table where ((table.col1 = \'$user\' AND table.col2 IS NULL) OR table.col2 = \'$user\') AND is_active LIMIT 1));\" | /bin/awk \'NR==3 { print $1 }\'; \r"
expect "assword for user safeuser:"
send "$safeuserpw\r"
expect -re '*'
set userpass $expect_out(0, string)
...