当通过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
答案 0 :(得分:3)
将代码作为带引号的heredoc传递,避免在传递给awk之前将其解析为远程shell:
ssh -q hostname 'awk -f - /proc/mounts' <<'EOF'
!/^#/ && $3 ~ /ext/ && $2 != "/" && $2 != "/opt" { print $2 }
EOF
答案 1 :(得分:1)
调试它的一种方法是在命令参数上使用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'