通过SSH转义Awk命令的大括号

时间:2016-04-30 05:46:04

标签: bash ssh

我尝试了以下命令并收到错误:

$  ssh -q rmthost "bash -c 'cat /var/tmp/5|awk '''{print \$1}''' >/var/tmp/redirect 2>&1'"
Missing }

(注意:" bash -c'是必需的,因为rmthost上帐户的登录shell是csh)

禁用大括号扩展不起作用:

$ set +B

我也尝试过:

$  ssh -q rmthost "bash -c 'cat /var/tmp/5|awk ''''{'print \$1'}''''>/var/tmp/redirect 2>&1'"
awk: syntax error near line 1
awk: illegal statement near line 1

中间脚本文件可以,但我更喜欢单行,因为我需要在不同的时间点运行10个以上类似的命令。

在这种情况下有没有办法逃避括号?

感谢。

2 个答案:

答案 0 :(得分:3)

我玩了一会儿...而且我认为你真正想做的就是“简化”。我的本地shell是bash,我的遥控器是tcsh ...这是我提出的功能(根据你的文件名)。

ssh -q rmthost "awk '{ print \$1 }' /var/tmp/5"

Shell逃避是非常棘手的,你真的必须考虑“为什么”你想做这样的事情(例如,在利用中间脚本文件时)。

也许更好的是使用剪切?

ssh -q rmthost 'cut -f1 /var/tmp/5'

如果绝对需要shell封装和重定向......(注意&符号上的转义。)

ssh -q rmthost "sh -c \"awk '{ print $1 }' /var/tmp/5\" \&> /var/tmp/redirect"

答案 1 :(得分:0)

尝试使用heredoc语法(同样,使用cat消除无用):

 ssh -q rmthost <<'EOI'
 bash -c "awk '{print $1}' < /var/tmp/5 > /var/tmp/redirect 2>&1"
 EOI