bash scriptでtimeコマンドを使用して、スクリプトの経過時間を計算し、ログファイルに書き込みたいと思います。ユーザーとシステムではなく、リアルタイムのみが必要です。まともな形式でも必要です。例:00:00:00:00(標準出力とは異なります)。アドバイスをお願いします。
予想される形式は00:00:00.0000
(ミリ秒)[時間]:[分]:[秒]。[ミリ秒]
すでに3つのスクリプトを作成しました。私はこのような例を見ました:
{ time { # section code goes here } } 2> timing.log
しかし、ユーザーとシステムではなく、リアルタイムのみが必要です。まともな形式でも必要です。例:00:00:00:00
(標準出力とは異なります)。
言い換えれば、時間出力を処理しやすいものに変える方法を知りたいのです。
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))"
しかし、これは一部の人々にとっては明らかに機能しなかったが、新しいバージョンは機能したと報告されたため、編集されました。私はあなたが残りだけを使用しなければならないと思うので、これを承認しませんでした、しかし、支持されました。
自分に合ったものを選択してください。
時間のマニュアルページ から:
/usr/bin/time
形式文字列を指定できます。形式オプションの1つは経過時間です。 %E
/usr/bin/time -f'%E' $CMD
例:
$ /usr/bin/time -f'%E' ls /tmp/mako/
res.py res.pyc
0:00.01
/bin/time
ではなくBashビルトインtime
を使用するには、次の変数を設定できます。
TIMEFORMAT='%3R'
次のようなリアルタイムが出力されます。
5.009
または
65.233
数値は精度を指定し、0〜3の範囲で指定できます(デフォルト)。
次を使用できます。
TIMEFORMAT='%3lR'
次のような出力を取得します。
3m10.022s
l
(エル)は長い形式を提供します。
Bash組み込み変数SECONDS
を使用します。変数を参照するたびに、スクリプト呼び出しからの経過時間が返されます。
例:
echo "Start $SECONDS"
sleep 10
echo "Middle $SECONDS"
sleep 10
echo "End $SECONDS"
出力:
Start 0
Middle 10
End 20
あなたが何を求めているのかよくわかりません、試しましたか:
time yourscript | tail -n1 >log
編集:わかりました、それであなたは時間を出す方法を知っていて、あなたはただフォーマットを変えたいだけです。希望する形式を説明しておくと役立ちますが、試してみるべきことがいくつかあります。
time -p script
これにより、出力が行ごとに小数部付きの秒単位で1回に変更されます。秒数を取得するには、他の2つではなくリアルタイムのみが必要です。
time -p script | tail -n 3 | head -n 1