我需要通过awk处理单个记录psql查询的输出,然后再将其分配给我的expect脚本中的值。
相关代码:
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”:没有这样的变量 “发送”psql -U safeuser -h db test -c \“SELECT foo((SELECT id FROM table where((table.col1 = \'$ user \'AND table.col2 ...”
我在这里遗失了一些明显的东西吗?我的印象是双花括号保护了awk代码块。
答案 0 :(得分:1)
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)
答案 1 :(得分:1)
您的发送行正在由tcl评估,因为它在引号""中。如果你想传递它应该是你应该改变你的awk部分以逃避$:
... | / bin / awk \' NR == 3 {print \ $ 1} \&#39 ;; \ R"