为什么awk在部分ssh命令时失败?

时间:2018-03-12 16:41:33

标签: bash awk ssh

当我进入服务器并运行命令时,它可以工作:

$ssh -q postgres@XXXXX
Last login: Mon Mar 12 12:30:16 2018 from 10.101.XXX.X
[postgres@pgsdba203 ~]$ df -hP | grep pgsql | awk '{ if ($5 >= 70) print $0 }'
/dev/mapper/pgvg-pg_log  9.9G  7.2G  2.2G  77% /var/lib/pgsql/data/pg_log

但不是当它是ssh命令参数的一部分时:

$ ssh -q postgres@XXXXX "df -hP | grep pgsql | awk '{ if ($5 >= 70) print $0 }'"
awk: { if ( >= 70) print -bash }
awk:        ^ syntax error

由于awk命令是单引号,我原本期望保留$5并直接传递给服务器XXXXX。

编辑:最终目标是将服务器名称变为变量并从bash for循环中调用ssh。

2 个答案:

答案 0 :(得分:1)

我会做什么:

ssh -q postgres@XXXXX <<'EOF'
df -hP | awk '/pgsql/ && $5 >= 70'
EOF

for循环

for server in foo bar base; do
    ssh -q postgres@$server <<'EOF'
    df -hP | awk '/pgsql/ && $5 >= 70'
EOF
done

答案 1 :(得分:0)

作为一个易于定义的模式,即使你需要将stdin管道输入远程代码也能工作:定义一个shell函数,告诉shell本身发出该函数&#39; s文本文本替换为远程命令:

myfunc() { df -hP | grep pgsql | awk '{ if ($5 >= 70) print $0 }'; }
ssh -q postgres@XXXX "$(declare -f myfunc); myfunc"