对 bash 输出中未找到的字符串执行 PIPE
Execute PIPE on string not found in bash output
我想要的结果流程是 below:but 我不确定如何在这里使用 for-loop。请在我的表达式中观察每个节点的输出中是否存在试图验证 string1 的地方。
获取匹配 DISABLED 字符串的命令输出,它给出了匹配节点的列表。
例如:
kubectl get nodes | grep -i DISABLED
示例:输出为
node1-DISABLED node2-DISABLED node3-DISABLED
对于我在上面得到的每个节点,我正在对它们进行描述
例如:
kubectl describe nodes
然后在 describe 的输出中,我想查看所有节点在其 describe 输出命令中没有 "string1" 字符串的内容,然后如果没有找到,echo/print节点
所以我完整的表情是这样的
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
中我们捕获姓氏(如果已设置)。
我想要的结果流程是 below:but 我不确定如何在这里使用 for-loop。请在我的表达式中观察每个节点的输出中是否存在试图验证 string1 的地方。
获取匹配 DISABLED 字符串的命令输出,它给出了匹配节点的列表。 例如:
kubectl get nodes | grep -i DISABLED
示例:输出为
node1-DISABLED node2-DISABLED node3-DISABLED
对于我在上面得到的每个节点,我正在对它们进行描述 例如:
kubectl describe nodes
然后在 describe 的输出中,我想查看所有节点在其 describe 输出命令中没有 "string1" 字符串的内容,然后如果没有找到,echo/print节点
所以我完整的表情是这样的
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
.
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
中我们捕获姓氏(如果已设置)。