格雷普为前一场比赛



最好用一个例子来解释我想要实现的目标。

我有这个 kubectl 输出:

app-bf7c5cdfb-x8thq   3/3     Running   0          2h
app-bf7c5cdfb-xc9nf   3/3     Running   0          2h
app-bf7c5cdfb-xwlzh   2/3     Running   0          1h
app-bf7c5cdfb-xxt46   3/3     Running   0          2h
app-bf7c5cdfb-z9s2t   2/3     Running   0          7m
app-bf7c5cdfb-zmpzs   3/3     Running   0          2h
app-bf7c5cdfb-ztfx5   3/3     Running   0          2h

我想为每一行使用 grep,其中准备好的 pod 不等于总 pod,导致:

app-bf7c5cdfb-xwlzh   2/3     Running   0          1h
app-bf7c5cdfb-z9s2t   2/3     Running   0          7m

有没有简单的方法可以做到这一点?我的方法是编写这样的函数:

function kubeNotReady {
unset tmp
while :
do 
read line
[[ $line == "" ]] && tmp="${tmp:0:$((${#tmp}-1))}" && break
total=`echo "$line" | sed -E "s|.*[[:digit:]]*/([[:digit:]]*).*|1|"`
match=`echo "$line" | grep -v "$total/$total"`
if [ "${#match}" -gt "0" ]; then
tmp="$tmp$match"$'n'
fi
done
echo "$tmp"
}
kubectl get po | kubeNotReady

如果您可以选择AWK,请尝试以下操作:

awk '{split($2, a, "/"); if (a[1] != a[2]) print}' out.txt

作为替代方案,您可以用bash说:

while IFS= read -r line; do
[[ $line =~ [[:blank:]]([[:digit:]]+)/([[:digit:]]+)[[:blank:]] ]] && (( ${BASH_REMATCH[1]} != ${BASH_REMATCH[2]} )) && echo "$line"
done < out.txt

希望这有帮助。

这是一个 grep,它类似于你想要的。

echo "4/5" | grep -vE "^(.+)/1$"

这只处理分数。要使其处理您提供的示例,只需在将其传递给我提供的 grep 之前过滤掉除第二个单词以外的所有内容。

最新更新