是否有 Unix 实用程序将自命令开始以来的时间(以毫秒为单位)附加到 stdin



我最终在 NodeJS 中为此编写了一个快速的小脚本,但我想知道是否有一个实用程序可以将文本输入到其中,它将在每一行前面加上一些文本——在我的特定情况下,自程序启动以来经过的时间以毫秒为单位。理想情况下,用途如下:

longrunningprocess | prepend-timestamp

这可以帮助进行一些快速调试。

这个问题看起来与是否有Unix实用程序将时间戳附加到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 转义,则加分(例如,查看初始命令的颜色),

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

如果你使用的是 Linux,ts 命令符合要求。

如果你只需要分辨率到秒,你可以使用 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

我最终使用两个 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 %sn", diff, $0}'

例如

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

指纹:

0.00000 foo
0.97711 bar

最新更新