【问题标题】:awk command not working with kubectl execawk 命令不适用于 kubectl exec
【发布时间】:2021-01-29 13:45:53
【问题描述】:

从外部容器:

$ kubectl exec -it ui-gateway-0 -- bash -c "ps -ef | grep entities_api_svc | head -1"
root         14      9  0 10:34 ?        00:00:02 /svc/bin/entities_api_svc

$ kubectl exec -it ui-gateway-0 -- bash -c "ps -ef | grep entities_api_svc | head -1 | awk '{print $2}'"
root         14      9  0 10:34 ?        00:00:02 /svc/bin/entities_api_svc

从容器内部:

[root@ui-gateway-0 /]# ps -ef | grep entities_api_svc | head -1 | awk '{print $2}'
14

【问题讨论】:

    标签: awk


    【解决方案1】:

    我发现在 sh/bash 命令参数上使用单引号更容易,因此它更接近您在 shell 中键入的内容:

    kubectl exec -it ui-gateway-0 -- \
      bash -c 'ps -ef | grep entities_api_svc | head -1 | awk "{print \$2}"'
    

    这意味着awk 使用双引号,这需要对shell 变量标记$ 进行转义。

    在原始命令中,运行 kubectl 的 shell 将 $2 替换为长度为零的字符串,因此 awk 只会看到 print,它会打印整行

    多层嵌套

    嵌套的 shell 转义很快就会变得非常晦涩难懂:

    $ printf '%q\n' 'echo "single nested $var" | awk "print $2"'
    echo\ \"single\ nested\ \$var\"\ \|\ awk\ \"print\ \$2\"
    
    $ printf '%q\n' "$(printf '%q\n' 'echo "double nested $var" | awk "print $2"')"
    echo\\\ \\\"double\\\ nested\\\ \\\$var\\\"\\\ \\\|\\\ awk\\\ \\\"print\\\ \\\$2\\\"
    

    如果在容器中添加文件grep-entities.sh

    #!/bin/bash
    set -uex -o pipefail
    ps -ef | grep entities_api_svc | head -1 | awk '{print $2}'
    

    这样你就不用担心逃跑了

    pid=$(sshpass -p "password" ssh vm@10.10.0.1 kubectl exec ui-gateway-0 -- /grep-entities.sh)
    

    pgrep 也为您完成脚本工作

    kubectl exec ui-gateway-0 -- pgrep entities_api_svc
    

    【讨论】:

    • 是的,这行得通。我有 2 个问题。在我原来的命令中,为什么要替换 $2.我认为单引号中的任何内容都不会被替换。其次,按照你的正确方式,如果我需要另一组报价,你会怎么做。说:pid=$(sshpass -p "password" ssh vm@10.10.0.1 "kubectl exec ui-gateway-0 -- bash -c 'ps -ef | grep entities_api_svc | head -1 | awk \"{print \$2}\"'")
    • 外部的双引号对你的本地shell来说是最重要的,当它进行第一层变量替换时。然后单引号在容器 shell 中按照您的预期执行,但是 $2 到那时已经消失了。
    • 另一个级别的转义是我开始编写脚本以部署到 VM 或容器,因此我不必处理转义。
    • 获得了第一个。第二个是什么意思:/
    • 添加了一个例子
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2020-10-30
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多