是否有一个Unix实用程序在命令启动后以毫秒为单位添加到stdin的时间?

时间:2016-03-09 14:57:38

标签: shell unix

我最终在NodeJS中为此编写了一个快速的小脚本,但我想知道是否有一个实用程序可以提供文本,其中每行会添加一些文本 - 在我的特定情况下,时间以毫秒为单位自项目开始以来。理想情况下,使用方式如下:

longrunningprocess | prepend-timestamp

这有助于快速调试。

这个问题看起来与Is there a Unix utility to prepend timestamps to stdin?非常相似,但不一样,我想提前几毫秒,而不是当前的时间戳。

这是我使用NodeJS的版本:

#!/bin/env node

var moment = require("moment");
process.stdin.resume()

var fullData = "";
var t = +new Date();

process.stdin.on('data', function(data) {
  fullData += data;
  splitted = fullData.split("\n");
  splitted.forEach(function (part) {
    if (part === "" ) {
      return process.stdout.write("\n");
    }
    process.stdout.write( (+new Date() - t) + " " + part +  "\n");
  })
  fullData = splitted[splitted.length-1];
});

process.stdout.on('error', function(err) {
  if (err.code === 'EPIPE') return process.exit()
    process.emit('error', err)
});

如果保留ANSI转义,则加分(例如,查看初始命令的颜色),

如果精度(例如小数位数)可以配置,那就更好了。

2 个答案:

答案 0 :(得分:1)

我最后使用两个ts来打印当前时间戳,用毫秒和awk来计算差异:

#!/bin/sh
# atime <precision>

precision=${1:-"5"}
ts '%.s' |
awk -v p="$precision" 'NR == 1 {st = $1} {diff = $1 - st; sub(/^[[:digit:].]+ /,""); printf "%."p"f %s\n", diff, $0}'

例如

{  echo "foo" ; sleep 1 ; echo "bar" ; } | atime

打印:

0.00000 foo
0.97711 bar

答案 1 :(得分:0)

如果你在Linux上,ts command符合要求。

如果你只需要解决第二个问题,你可以使用bash:

start=$SECONDS
longrunningprocess | while IFS= read -r line; do
    echo "$((SECONDS - start)): $line"
done

$SECONDS变量为您提供自shell启动以来的秒数。这对于这种持续时间计算非常有用。

好的,我没有完全理解你的所有要求。这是Perl的一个版本:

atime () { 
    local precision="${1:-5}"
    perl -MTime::HiRes=time -sne '
        BEGIN {$start = time} 
        printf "%.${prec}f %s", (time - $start), $_
    ' -- -prec="$precision"
}

longrunningprocess | atime 3

演示:

$ { echo foo; sleep 1; echo bar; } | atime
0.00010 foo
0.98499 bar
$ { echo foo; sleep 1; echo bar; } | atime 3
0.000 foo
0.980 bar