Awk 如何删除日期大于的部署?

Awk 如何删除日期大于的部署?,awk,openshift,cloud-pak-for-data,Awk,Openshift,Cloud Pak For Data,我需要删除集群上超过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-r

我需要删除集群上超过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更早的部署,在这种情况下,它将只是一个部署,但在其他集群中,它将是数百个。目前,我通过查看列表手动删除它,并通过运行(以上面为例)删除14天以前的任何内容:


这是我试图找到的关于如何自动化的答案。要列出所有超过14天的条目,请尝试:

oc get deploy --sort-by=.metadata.creationTimestamp | awk '/wml-os-rt-hybrid/ && $6+0>14 { print $1 "\t\t" $6;}'
要删除这些部署,请执行以下操作:

oc get deploy --sort-by=.metadata.creationTimestamp | awk '/wml-os-rt-hybrid/ && $6+0>14 { system("oc delete deployment "$1);}'
这里,
/wml-os-rt-hybrid/&&$6+0>14
选择(a)包含
wml-os-rt-hybrid
和(b)第六个字段大于14的所有行。然后,我们可以像第一个命令那样打印,或者像第二个命令那样运行系统命令

在将其与14进行比较之前,我们将0添加到
$6
。我们这样做是因为它告诉
awk
$6
视为一个数字,以便比较是数字而不是词汇


请注意,awk命令消除了对
grep
过程的需要。这使得生成的命令更高效(创建的过程更少)且更简洁。

awesome!非常感谢。我将在周一进行测试,然后马克会回答。在我阅读和理解的过程中,应该是这样。我真的很感激你的解释,不要把awk当作外壳。拥有一个
shell{oc;awk{system{shell{oc}}}
的调用堆栈比
shell{oc;awk;oc}
更糟糕,我在几天前向OP展示了如何做,以回答同一个问题。此外,您的代码没有考虑到某些
$6
是小时而不是天,也没有引用通过
$1
传递给shell的字符串。顺便说一句,这并没有提高代码的效率,因为每次调用
system()时,它会在每行输出中生成一个子shell
而且grep只允许某些行通过awk,可能比让awk在每一行上进行字段拆分等更有效。我投票结束这个问题,因为这是一个重复的问题
oc get deploy --sort-by=.metadata.creationTimestamp | awk '/wml-os-rt-hybrid/ && $6+0>14 { system("oc delete deployment "$1);}'