已编辑
我发现自己经常查看是否有事情停止发生。为此,按时间顺序查看事件会有所帮助...
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
。
谁有一个简短的,甚至可能是简单的,更容易阅读的有效解决方案?
没有偏好的工具(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 ...
我已经任意转换为现有通用输出格式的标准化版本,只是为了使其易于转移给团队的其他成员。无论哪种方式,它都仅用于“观察”数据,因此只要易于阅读,其他格式都不是问题。
虽然理论上可能包括数小时和数天,但此工具通常不会报告此类旧事件,并且超出此问题的范围,如果需要,我可能可以推断出所提供的任何解决方案。因为我可以从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/