按格式不一致的耗时字段排序(k8s 事件按事件发生后的实际时间)

标签 sorting kubernetes language-agnostic

已编辑

我发现自己经常查看是否有事情停止发生。为此,按时间顺序查看事件会有所帮助...

This solution 似乎 可以工作,但格式仍然让我抓狂...

我“有点”有效的解决方案 -

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

...这对我来说有点矫枉过正。

以空格分隔的左对齐字段没有前导零,仅报告 2 米以内的秒为 [0-9]+s,然后报告为 [0-9]+ m[0-9]+s 最多 5m,之后似乎只报告 [0-9]+m

谁有一个简短的,甚至可能是简单的,更容易阅读的有效解决方案?
没有偏好的工具(sedawkperl、原生 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 ...

我已经任意转换为现有通用输出格式的标准化版本,只是为了使其易于转移给团队的其他成员。无论哪种方式,它都仅用于“观察”数据,因此只要易于阅读,其他格式都不是问题。

虽然理论上可能包括数小时和数天,但此工具通常不会报告此类旧事件,并且超出此问题的范围,如果需要,我可能可以推断出所提供的任何解决方案。因为我可以this approach得到订单我真的只是在寻找优雅的格式设置选项。

对 Daweo 的 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 ...

其他人仍然赞赏。

最佳答案

我会先将所有内容转换为秒,然后将其打印为 HH:MM:SS,例如:

$ cat tst.awk
BEGIN {
    split("h m s",denoms)
    fmts["s"] = fmts["m"] = fmts["h"] = "%02d"
    mults["s"] = 1
    mults["m"] = 60
    mults["h"] = 60 * 60
}
sub(/^L/,"_L") {
    print
    next
}
{
    time = $1

    secs = 0
    while ( match(time,/[0-9]+./) ) {
        value = substr(time,1,RLENGTH-1)
        denom = substr(time,RLENGTH)
        time  = substr(time,RLENGTH+1)
        secs += value * mults[denom]
    }

    for ( i=1; i in denoms; i++ ) {
        denom = denoms[i]
        out = (i>1 ? out ":" : "") sprintf(fmts[denom],int(secs/mults[denom]))
        secs %= mults[denom]
    }

    $1 = out

    print | "sort -r"
}

$ awk -f tst.awk sample
_LAST ...
00:46:00 ...
00:02:22 ...
00:01:59 ...
00:01:15 ...
00:00:28 ...
00:00:07 ...

如果您想包括天数,显然要在 BEGIN 部分添加 "d" 的定义,对于其他更长的持续时间也类似。

关于按格式不一致的耗时字段排序(k8s 事件按事件发生后的实际时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74790350/

相关文章:

kubernetes - 观看Kubernetes作业输出直到完成

kubernetes - Helm 图表失败并显示所需值

floating-point - 为什么 NaN 不等于 NaN?

language-agnostic - 电子游戏如何出现在我的屏幕上?

kubernetes - Kubernetes入口Json补丁失败

math - 如何存储多项式?

algorithm - 仅使用可以对 n 个数字进行排序的函数对 n^2 个数字进行排序

javascript - 在我的快速排序中递归

c# - ListView 按列排序

javascript - 不知道如何排序这个 JSON 对象 jQuery/JavaScript