私は、標準入力の各行の前に標準入力を生成するのにかかる時間に関する情報を追加するスクリプトが必要です。デフォルトでは入力用:
foo
bar
baz
持ちたい
0 foo
10 bar
5 baz
10はfooの印刷とバーの印刷にかかる10秒です。 5と同様に、バーを印刷してからbazを印刷するのに5秒かかります。
ts
タイムスタンプを表示できるユーティリティがあることがわかります。https://github.com/paypal/gnomonしかし、これを行うためにJavaScriptを使用したくありません。
標準ツールはありますか?それとも、これにはawkを使用する必要がありますか?
ベストアンサー1
出力を生成するスクリプトがあるとしますgenerate
。次に、各行を作成するのにかかる時間(秒単位)を表示します。
$ generate | ( t0=$(date +%s); while read -r line; do t1=$(date +%s); echo " $((t1-t0)) $line"; t0=$t1; done )
2 foo
0 foo
5 foo
3 foo
複数行にまたがる同じコマンドは次のとおりです。
generate | ( t0=$(date +%s)
while read -r line
do
t1=$(date +%s)
echo " $((t1-t0)) $line"
t0=$t1
done
)
または、便宜上、次のコードを含むシェル関数を定義できます。
timer() { t0=$(date +%s); while read -r line; do t1=$(date +%s); echo " $((t1-t0)) $line"; t0=$t1; done; }
この機能は次のように使用できます。
$ generate | timer
0 foo
2 foo
4 foo
3 foo
どのように動作しますか?
t0=$(date +%s)
スクリプトが開始された現在の時刻を秒単位でキャプチャします。
while read -r line; do
標準入力でループの読み出しが開始されます。
t1=$(date +%s)
これは、現在行がキャプチャされてからの秒数をキャプチャします。
echo " $((t1-t0)) $line"
現在の行にかかった時間を秒単位で印刷します。
t0=$t1
これにより、
t0
次の行が更新されます。done
これはサイクルの終わりを示します
while
。