当通过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
调试它的一种方法是在命令参数中使用eval
和echo
:
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'