对 bash 输出中未找到的字符串执行 PIPE

Execute PIPE on string not found in bash output

我想要的结果流程是 below:but 我不确定如何在这里使用 for-loop。请在我的表达式中观察每个节点的输出中是否存在试图验证 string1 的地方。

所以我完整的表情是这样的

kubectl get nodes | grep -i DISABLED | 
awk -F ' ' '{print }' | 
xargs -l1 -- sh -c 'kubectl describe node ""' | 
for grep -e "string1" == 0; do 
xargs -l1 -- sh -c 'echo ""' --; done

部分命令的示例输出:

bash$ kubectl get nodes | grep -i DISABLED
10.4.5.15-59fa4f88   Ready,SchedulingDisabled   node      20d       v1.10.9   <none>        Ubuntu 16.04.4 LTS   4.15.0-15-generic   docker://18.3.1

10.4.5.16-59fa4f88   Ready,SchedulingDisabled   node      20d       v1.10.9   <none>        Ubuntu 16.04.4 LTS   4.15.0-15-generic   docker://18.3.1


bash$ kubectl get nodes | grep -i DISABLED | awk -F ' ' '{print }'
10.4.5.15-59fa4f88
10.4.5.16-59fa4f88

预期输出为:

10.4.5.15-59fa4f88

因为节点 10.4.5.15-59fa4f88 在其描述输出中没有 string1 并且 10.4.5.16 没有回显,因为它的描述在其描述输出中有 string1。

基本上,我正在尝试构建一个表达式来描述每个节点并检查其中的 string1,如果不存在,它将将该节点回显到终端。

的输出
kubectl describe node 

Name:               10.4.5.15-59fa4f88
Roles:              node
Labels:             beta.kubernetes.io/arch=amd64
                beta.kubernetes.io/instance-type=gdd5_8dd.dd2xlarge
                beta.kubernetes.io/os=linux
                failure-domain.beta.kubernetes.io/zone=sdjcd2d01-sw-05
                kops.k8s.io/instancegroup=nodes-test
                kubernetes.io/hostname=10.4.5.15-59fa4f88
                kubernetes.io/role=node
                node-role.kubernetes.io/node=
Annotations:        d.volume.kubernetes.io/nodeid={"d-d":"10.4.5.15-59fa4f88"}
                node.alpha.kubernetes.io/ttl=0
                volumes.kubernetes.io/controller-managed-attach-detach=true
CreationTimestamp:  Wed, 28 Nov 2018 07:37:39 -0800
Taints:             <none>

我认为您的代码可以大大简化。试试这个:

kubectl get nodes |
# Awk can do everything grep can do, and then some
awk 'toupper([=10=]) ~ /DISABLED/ { print  }' |
# loop over results
while read -r node; do
    kubectl describe node "$node" |
    grep -q "string1" || echo "$node"
done

如果 kubectl describe node 的输出在某处包含节点名称(例如,第一个字段?),那么 while 循环可能会被替换为

# xargs already knows how to run a command
xargs -n 1 kubectl describe node |
# Simply filter out anything with string1
awk '! /string1/ { print  }'

如果你想清除重复项,添加 | sort -u 或在后一种情况下在 Awk 脚本中实现简单的重复项删除(提示:保留你看到的值的关联数组,并且仅在数组中还没有东西)。

根据编辑更新:这是一个 Awk 尝试,如果输出的 none 包含 start1.

,则提取并打印 Name: 字段
kubectl get nodes |
awk 'toupper([=12=]) ~ /DISABLED/ { print  }' |
xargs -n 1 kubectl describe node |
awk '/^Name: / { if (NR>1 && name) print name
        name= }
    /string1/ { name="" }
    END { if (name) print name }'

Awk 脚本会在看到新输出的开头时分配 name。如果设置了之前的 name 那么我们首先打印它(之前的记录)。如果第二个正则表达式看到 string1,则取消设置 name,这样当我们到达下一条记录时就不会打印它。最后,在 END 中我们捕获姓氏(如果已设置)。