首页 > 解决方案 > Grep 前一场比赛

问题描述

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

我有这个 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

标签: kubernetesgrep

解决方案


如果AWK是您的选择,请尝试以下方法:

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

作为替代方案,您可以用bashas 表示:

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

希望这可以帮助。


推荐阅读