【问题标题】:awk script not behaving correctly when run over ssh在 ssh 上运行时,awk 脚本行为不正确
【发布时间】:2014-08-20 05:36:42
【问题描述】:

当通过 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 运算符,而不是 bash 运算符。

标签: bash ssh awk


【解决方案1】:

将您的代码作为引用的 heredoc 传递可避免在传递给 awk 之前由远程 shell 解析它:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢,很好的回答。对调试选项也很有帮助。
    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多