我可以在awk中进行基于时间的进度吗?

问题描述:

我目前使用awk脚本审查控制台输出,并为每条审查线打印一个点。我可以在awk中进行基于时间的进度吗?

我想更新此代码,以避免每分钟打印多个点(或类似的东西)。很显然,如果我没有取得任何进展(新的线条流传),那么不会有更新发生。

当前的代码版本是https://gist.github.com/ssbarnea/f7b72491af524fa364d9fc328cd43f2a

注:我知道我可以打印带有“国防部10”或类似的换行,以限制输出,但这种方法并不好,因为线路的不收到一致的速度,有时我得到很多,有时我只得到一两个。由于这个原因,我需要使用基于计时器的方法,如“如果最后一个打印超过x秒前打印新行”

使用GNU awk时间函数,您可以不再频繁地打印点每分钟通过由于当与所述时间处理的当前输入线划时代以秒简单地比较时,当先前点印刷:

awk ' 
function prtDot() { 
    currTime = systime() 
    if ((currTime - prevTime) > 60) { 
     printf "." | "cat>&2" 
     prevTime = currTime 
    } 
} 
{ print $0; prtDot() } 
END { print "" | "cat>&2" } 
' 

例如打印.每10秒的数字流内:

$ cat tst.awk 
function prtDot() { 
    currTime = systime() 
    if ((currTime - prevTime) > 10) { 
     printf "." | "cat>&2" 
     prevTime = currTime 
    } 
} 
{ printf "%s",$0%10 | "cat>&2"; prtDot() } 
END { print "" | "cat>&2" } 

$ i=0; while ((i < 50)); do echo $((++i)); sleep 1; done | awk -f tst.awk 
1.2345678901.23456789012.3456789012.34567890123.4567890 

$ i=0; while ((i < 50)); do echo $((++i)); sleep 3; done | awk -f tst.awk 
1.2345.6789.0123.4567.8901.2345.6789.0123.4567.8901.2345.6789.0 

印刷和预期的实际位数之间的细微差别是由于多久while循环的其它部件添加到回声等小之间的总间隔imprecisions影响shell循环打印数字的时间,因此当systime()在awk中被调用时。

+1

谢谢!在MacOS上,我必须安装gawk。现在看来,我可以通过https://github.com/pycontribs/powertape/blob/master/vars/sh2.groovy#L106提供友好的进度线 – sorin