期待与Awk逃脱

时间:2012-01-10 19:37:57

标签: awk expect

我需要通过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代码块。

2 个答案:

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