如何从 awk 列表中删除大于日期的部署

如何从 awk 列表中删除大于日期的部署

我需要删除集群上超过 14 天的部署。如果我跑:

oc get deploy --sort-by=.metadata.creationTimestamp | grep wml-os-rt-hybrid | awk '{ print $1 "\t\t" $6;}'

它为我提供了这些部署的列表及其使用年限:

wml-os-rt-hybrid0.1-gz3vczfc        15d
wml-os-rt-hybrid0.1-fj167pbt        8d
wml-os-rt-hybrid0.1-bdzkqi7z        7d
wml-os-rt-hybrid0.1-g4hclw4v        7d
wml-os-rt-hybrid0.1-j6x9tzt6        7d
wml-os-rt-hybrid0.1-qplkkilw        4d
wml-os-rt-hybrid0.1-sadgz9cz        6h

我对此是全新的,无法弄清楚我需要添加什么,以便它也会删除任何早于 14d 的内容,在这种情况下,它只是一行,但在其他集群中它将是数百行。

答案1

尝试这个:

oc get deploy --sort-by=.metadata.creationTimestamp |
awk '/wml-os-rt-hybrid/ && !(($6 ~ /d$/) && (($6+0) > 14)){print $1 "\t\t" $6}'

假设首先打印的内容是您的“部署”,并且要删除“部署”,您可以oc delete deployment <deployment>按照下面的评论中所述使用,并且您要删除的是不符合上述条件的“部署”,那么像这样的事情应该这样做:

oc get deploy --sort-by=.metadata.creationTimestamp |
awk '!( /wml-os-rt-hybrid/ && !(($6 ~ /d$/) && (($6+0) > 14)) ){print $1}' |
xargs -n 1 oc delete deployment

如果您愿意,您可以进行布尔代数来消除这种情况下的双重否定。

答案2

delfile=delete_file_names
... | awk -v delfile="$delfile" 'BEGIN { printf "","" >delfile }; '\
'{ value=$6; sub(".$","",value); '\
'if($6 ~ "h$") value=int(value/24); else value=int(value); }; '\
'value<15 { print $1 "\t\t" $6;}; '\
'value>14 { print $1 >delfile; }'

wml-os-rt-hybrid0.1-fj167pbt            8d
wml-os-rt-hybrid0.1-bdzkqi7z            7d
wml-os-rt-hybrid0.1-g4hclw4v            7d
wml-os-rt-hybrid0.1-j6x9tzt6            7d
wml-os-rt-hybrid0.1-qplkkilw            4d
wml-os-rt-hybrid0.1-sadgz9cz            6h

if [ -s "$delfile" ]; then
    IFS=$'\n' rm -- $(< "$delfile")
fi

相关内容