web-dev-qa-db-ja.com

時間コマンドのカスタム形式

bash scripttimeコマンドを使用して、スクリプトの経過時間を計算し、ログファイルに書き込みたいと思います。ユーザーとシステムではなく、リアルタイムのみが必要です。まともな形式でも必要です。例:00:00:00:00(標準出力とは異なります)。アドバイスをお願いします。

予想される形式は00:00:00.0000(ミリ秒)[時間]:[分]:[秒]。[ミリ秒]

すでに3つのスクリプトを作成しました。私はこのような例を見ました:

{ time { # section code goes here } } 2> timing.log

しかし、ユーザーとシステムではなく、リアルタイムのみが必要です。まともな形式でも必要です。例:00:00:00:00(標準出力とは異なります)。

言い換えれば、時間出力を処理しやすいものに変える方法を知りたいのです。

68
John Doe

dateコマンドを使用して、時間を調整する作業を実行する前後の現在時刻を取得し、次のように差を計算できます。

#!/bin/bash

# Get time as a UNIX timestamp (seconds elapsed since Jan 1, 1970 0:00 UTC)
T="$(date +%s)"

# Do some work here
sleep 2

T="$(($(date +%s)-T))"
echo "Time in seconds: ${T}"

printf "Pretty format: %02d:%02d:%02d:%02d\n" "$((T/86400))" "$((T/3600%24))" "$((T/60%60))" "$((T%60))""

注:$((...))は、bashの基本的な算術演算に使用できます–注意:マイナス-の前にスペースを入れないでください。これはコマンドラインオプションとして解釈される可能性があります。

参照: http://tldp.org/LDP/abs/html/arithexp.html

編集:
さらに、生成された出力から部分文字列を検索および抽出するには、 sed をご覧ください。 bytime

編集:

ミリ秒のタイミングの例(実際はナノ秒ですが、ここではミリ秒に切り捨てられます)。 dateのバージョンは%N形式をサポートする必要があり、bashは大きな数値をサポートする必要があります。

# UNIX timestamp concatenated with nanoseconds
T="$(date +%s%N)"

# Do some work here
sleep 2

# Time interval in nanoseconds
T="$(($(date +%s%N)-T))"
# Seconds
S="$((T/1000000000))"
# Milliseconds
M="$((T/1000000))"

echo "Time in nanoseconds: ${T}"
printf "Pretty format: %02d:%02d:%02d:%02d.%03d\n" "$((S/86400))" "$((S/3600%24))" "$((S/60%60))" "$((S%60))" "${M}"

免責事項:
元のバージョンでは

M="$((T%1000000000/1000000))"

しかし、これは一部の人々にとっては明らかに機能しなかったが、新しいバージョンは機能したと報告されたため、編集されました。私はあなたが残りだけを使用しなければならないと思うので、これを承認しませんでした、しかし、支持されました。
自分に合ったものを選択してください。

87
Archimedix

時間のマニュアルページ から:

  1. Timeと呼ばれるシェルが組み込まれている場合があります。これを避けるには、/usr/bin/time
  2. 形式文字列を指定できます。形式オプションの1つは経過時間です。 %E

    /usr/bin/time -f'%E' $CMD

例:

$ /usr/bin/time -f'%E' ls /tmp/mako/
res.py  res.pyc
0:00.01
40
Spaceghost

/bin/timeではなくBashビルトインtimeを使用するには、次の変数を設定できます。

TIMEFORMAT='%3R'

次のようなリアルタイムが出力されます。

5.009

または

65.233

数値は精度を指定し、0〜3の範囲で指定できます(デフォルト)。

次を使用できます。

TIMEFORMAT='%3lR'

次のような出力を取得します。

3m10.022s

l(エル)は長い形式を提供します。

39

Bash組み込み変数SECONDSを使用します。変数を参照するたびに、スクリプト呼び出しからの経過時間が返されます。

例:

echo "Start $SECONDS"
sleep 10
echo "Middle $SECONDS"
sleep 10
echo "End $SECONDS"

出力:

Start 0
Middle 10
End 20
29
Ed Lucero

あなたが何を求めているのかよくわかりません、試しましたか:

time yourscript | tail -n1 >log

編集:わかりました、それであなたは時間を出す方法を知っていて、あなたはただフォーマットを変えたいだけです。希望する形式を説明しておくと役立ちますが、試してみるべきことがいくつかあります。

time -p script

これにより、出力が行ごとに小数部付きの秒単位で1回に変更されます。秒数を取得するには、他の2つではなくリアルタイムのみが必要です。

time -p script | tail -n 3 | head -n 1
2
Andrew