我最终在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转义,则加分(例如,查看初始命令的颜色),
如果精度(例如小数位数)可以配置,那就更好了。
答案 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