各行の前にその行を作成するのにかかる時間を追加します。

各行の前にその行を作成するのにかかる時間を追加します。

私は、標準入力の各行の前に標準入力を生成するのにかかる時間に関する情報を追加するスクリプトが必要です。デフォルトでは入力用:

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

おすすめ記事