Awk脚本在ssh上运行时行为不正确



当通过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

将您的代码作为引号传入,可以避免在传递给awk之前被远程shell解析:

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

调试它的一种方法是在命令参数中使用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'

相关内容

最新更新