将变量匹配到条件

时间:2017-11-30 11:01:49

标签: bash

我想写一个新脚本,但我绝对是bash脚本中的n00b 例如,我希望该脚本执行kubectl获取cs(检查群集运行状况)和kubectl获取cs的stdout在这里:

administrator@rgv:~$ kubectl get cs 
NAME                 STATUS    MESSAGE              ERROR
etcd-0               Healthy   {"health": "true"}   
scheduler            Healthy   ok                   
controller-manager   Healthy   ok 

我如何解析STATUS列?

如果群集中有三个节点且群集正常,我想只打印"cluster healthy."。如果一个节点是向下打印"cluster is to die."

3 个答案:

答案 0 :(得分:0)

您可以使用名为awk的工具。

kubectl get cs | awk 'NR>1 && $2=="Healthy"{count++}
                END{if(count==3){print "All healthy"}
                else{
                print "Cluster(s) dead"
                }
                }'

答案 1 :(得分:0)

在您的示例中,STATUS字段的状态为Healthy

如果要解析它以找出包含字符串的行,可以使用grep

对于您的示例,它将是:kubectl get cs | tr -s ' ' | cut -f2 -d ' ' | grep Healthy,它会显示第二列中包含healthy字符串的所有行STATUS

要检查群集是否已关闭,您可以使用:kubectl get cs | tr -s ' ' | cut -f2 -d ' ' | grep Down

注意:tr -s ' '挤压空格,然后用管道将其剪切为cut -f2 -d ' ',这将为您提供整个列。两个单引号之间有空格('')感谢您注意@ilkkachu。

如果要在脚本中使用它,可以使用以下命令创建文件:

vim cluster_check.sh

#!/bin/bash

if kubectl get cs | tr -s ' ' | cut -f2 -d ' ' | grep -q  'Healthy'; 
then
    echo 'cluster healthy!'
else
    echo 'cluster is to die!'
fi

然后使用ESC :wq退出vim 更改chmod +x cluster_check.sh的执行标记。

然后你可以通过:./cluster_check.sh

执行它

答案 2 :(得分:0)

简单方法:

if kubectl get cs | tail -n +2 | grep -vq Healthy ; then
    echo "It's dead, Jim"
else
    echo "All is fine in the realm!"
fi

tail -n +2跳过第一行,grep查找包含字符串Healthy的行。也就是说,即使没有它的一行也会触发警告。

这当然会完全忽略列,所以如果一个死的成员可以在该行的其他地方包含相同的字符串,它将会失败。