在ssh上运行时,awk脚本运行不正常

时间:2014-08-19 20:43:13

标签: bash ssh awk

当通过ssh运行awk脚本时,我得到的输出更准确地被过滤:

$ ssh -q hostname '(awk "!/^#/ && \$3 ~ /ext/ && \$2 != "/" && \$2 != "/opt" { print \$2 }" /proc/mounts)'
/
/boot
/opt
/apps
/log
/data 

$ ssh -q hostname 'awk "!/^#/ && \$3 ~ /ext/ && \$2 != "/" && \$2 != "/opt" { print \$2 }" /proc/mounts'
/
/boot
/opt
/apps
/log
/data

2 个答案:

答案 0 :(得分:3)

将代码作为带引号的heredoc传递,避免在传递给awk之前将其解析为远程shell:

ssh -q hostname 'awk -f - /proc/mounts' <<'EOF'
  !/^#/ && $3 ~ /ext/ && $2 != "/" && $2 != "/opt" { print $2 }
EOF

答案 1 :(得分:1)

调试它的一种方法是在命令参数上使用evalecho

eval 'echo "!/^#/ && \$3 ~ /ext/ && \$2 != "/" && \$2 != "/opt" { print \$2 }"'

输出:

!/^#/ && $3 ~ /ext/ && $2 != / && $2 != /opt { print $2 }

这表明它不是有效的awk命令参数。您仍需要添加引号:

eval 'echo "!/^#/ && \$3 ~ /ext/ && \$2 != \"/\" && \$2 != "\"/opt\"" { print \$2 }"'

输出:

!/^#/ && $3 ~ /ext/ && $2 != "/" && $2 != "/opt" { print $2 }

这似乎是正确的。现在把它们放在一起:

ssh -q hostname 'awk "!/^#/ && \$3 ~ /ext/ && \$2 != \"/\" && \$2 != "\"/opt\"" { print \$2 }" /proc/mounts'