按实际时长排序K8s事件:优化格式混乱的排序方案
优化K8s事件时间格式化与排序方案需求
我经常需要查看某些事件是否已停止发生,按时间顺序查看事件会很有帮助。
有个方案似乎可行,但格式问题仍让我头疼。
我目前“勉强能用”的方案如下:
kubectl get events | sed -E '/^[6789][0-9]s/{h; s/^(.).*/\1/; y/6789/0123/; s/^(.)/01m\1/; x; s/^.(.*)/\1/; H; x; s/\n//; }; s/^10([0-9]s)/01m4\1/; s/^11([0-9]s)/01m5\1/; s/^([0-9]s)/00m0\1/; s/^([0-9]+s)/00m\1/; s/^([0-9]m)/0\1/; s/^([0-9]+m)([0-9]s)/\10\2/; s/^L/_L/;' | sort -r
但我觉得这个方案有些小题大做。
K8s事件的时长字段为左对齐、空格分隔,无前置零:2分钟以内仅显示[0-9]+s,2到5分钟显示[0-9]+m[0-9]+s,5分钟以上仅显示[0-9]+m。
有没有更简短、易懂且有效的解决方案?
不限制工具(sed、awk、perl、原生bash等),只要能正常运行且在常用环境中已预装即可。
这不是优先级很高的需求,但算是个有趣的小挑战,我想分享出来。
测试数据
$: cat sample LAST ... 28s ... 2m22s ... 46m ... 7s ... 75s ... 119s ...
期望输出结果
$: sed -E '/^[6789][0-9]s/{h; s/^(.).*/\1/; y/6789/0123/; s/^(.)/01m\1/; x; s/^.(.*)/\1/; H; x; s/\n//; }; s/^10([0-9]s)/01m4\1/; s/^11([0-9]s)/01m5\1/; s/^([0-9]s)/00m0\1/; s/^([0-9]+s)/00m\1/; s/^([0-9]m)/0\1/; s/^([0-9]+m)([0-9]s)/\10\2/; s/^L/_L/;' sample | sort -r _LAST ... 46m ... 02m22s ... 01m59s ... 01m15s ... 00m28s ... 00m07s ...
我将格式统一为现有输出的标准化版本,方便团队成员使用。由于仅用于人工查看数据,其他易读格式也可接受。
理论上可能存在小时和天级别的事件,但这类旧事件通常不会被该工具返回,不在本次问题范围内。我已能通过相关方案实现排序,现寻求更优雅的格式化方案。
我基于awk方案做了笨拙的适配,实现了格式化:
$: awk '/^[0-9]/{ if($1!~/m/){$1="0m" $1}; split($1,arr,/m/); t=arr[1]*60+arr[2]; m=(t-(t%60))/60; s=t-(m*60); m=sprintf("%02dm",m); if(s){ s=sprintf("%02ds",s) } else s=""; $1=sprintf("%s%s",m,s); print; } /^L/{print "_"$0}' sample | sort -r _LAST ... 46m ... 02m22s ... 01m59s ... 01m15s ... 00m28s ... 00m07s ...
仍欢迎其他方案。
内容的提问来源于stack exchange,提问作者Paul Hodges
相关产品推荐
相关产品推荐

