2010-09-10 167 views
65

我想在bash腳本中使用時間命令來計算腳本的已用時間並將其寫入日誌文件。我只需要實時,而不是用戶和系統。也需要一個體面的格式。例如00:00:00:00(不像標準輸出)。我很欣賞任何建議。時間命令的自定義格式

應該是00:00:00.0000(毫秒)的預期的格式[小時]:[分鐘]:[秒] [毫秒]

我已經3個腳本。我見過這樣的例子:

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

但我只需要實時,而不是用戶和sys。也需要一個體面的格式。例如00:00:00:00(不像標準輸出)。

換句話說,我想知道如何將時間輸出變成更容易處理的東西。

+1

新[標籤:慶典]版本(> = 4.2)確實提供此一個'printf' syntaxe:'printf的-v時間戳「% (%s)T「-1」和「printf」%(%a%d%b%Y%T)T \ n「$ TimeStamp」的值可能是'-1':now,'-2':開始bash session'Integer':Unix timestamp – 2013-10-16 06:10:21

+1

* ** *(在Linux下)** nanoseconds **,我寫了一個[函數](http://www.f-hauri。CH/VRAC/cours_truc-ET-astuces_2012-04-03/elap.bash)。你可以找到解釋[這裏](http://stackoverflow.com/a/14110859/1765658)。 – 2013-10-16 06:14:05

回答

86

你可以使用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))"" 

注: $((...))可用於基本的算術慶典 –注意:不要把空格前的負-,因爲這可能被解釋爲一個命令行選項。

參見:http://tldp.org/LDP/abs/html/arithexp.html

編輯:
此外,你可能想看看sed從由時間生成的輸出的搜索和提取子。

編輯:

實施例用於與毫秒定時(實際上納秒但截斷爲毫秒這裏)。您的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))" 

但這被剪輯掉,因爲它顯然沒有對某些人的工作,而新版本的報道一樣。我不贊成這一點,因爲我認爲你只能使用剩下的部分,但是沒有得到批准。
選擇適合你的任何東西。

+0

似乎不正確:以秒爲單位的時間:46(OK),漂亮格式:00:00:00:46(不正確)。使用時間命令:real 0m46.018s用戶0m7.630s sys 0m1.190s – 2010-09-10 11:19:49

+0

嗯,我不太確定00:00:00:00應該是什麼意思–我猜測它意味着[days]:[hours] :[分鐘]:[秒]?這就是它顯示的內容,但你可以自由調整代碼來計算你所需要的。 – Archimedix 2010-09-10 12:02:11

+0

錯字的藉口。 假設是00:00:00.0000(毫秒) [小時]:[分鐘]:[秒]。[毫秒] – 2010-09-10 12:23:03

2

不太清楚你的要求,你有沒有嘗試過:

time yourscript | tail -n1 >log 

編輯:好了,你知道如何讓超時,你只是想更改格式。如果你描述你想要的格式,這將有所幫助,但這裏有一些事情要嘗試:

time -p script 

改變輸出到每行一個時間以秒爲小數。你只需要實時,沒有其他兩個如此得到的秒數使用:

time -p script | tail -n 3 | head -n 1 
+0

我想將它包含在我的腳本中。 – 2010-09-10 11:30:15

+0

是的,如果這是明確的,那麼我不會指出它需要澄清。爲什麼不使用兩個腳本,一個調用另一個? – Amoss 2010-09-10 11:50:05

+0

因爲我已經有3個腳本。 我看到這樣一個例子: {{時間# 部分代碼放在這裏 }} 2> timing.log 但我只需要實時,而不是用戶和sys。也需要一個體面的格式。例如00:00:00:00(不像標準輸出)。 – 2010-09-10 11:58:15

37

man page for time

  1. 有可能是一個shell內置調用時,避免這通過指定/usr/bin/time
  2. 您可以提供一個格式字符串,其中一個格式選項已經過時間 - 例如%E

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

例子:

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

這就是爲什麼命令:time -f'%E'不工作,但/ usr/bin/time -f'%E'正常工作。 Thx – 2010-09-10 16:10:29

+2

在OS X上,'time'沒有-f標誌。你可以通過使用[brew](http://brew.sh)('brew install coreutils')安裝coreutils來解決這個問題,然後使用'/ usr/local/bin/gtime'來代替。 – CousinCocaine 2014-10-13 06:46:21

29

要使用bash的內置time而不是/bin/time你可以設置這個變量:

TIMEFORMAT='%3R' 

將輸出實時看起來像這樣:

5.009 

65.233 

數指定精度,並且可以從0到3(默認值)的範圍內。

您可以使用:

TIMEFORMAT='%3lR' 

得到如下所示的輸出:

3m10.022s 

l(ELL)給出了一個長格式。

29

使用bash內置變量SECONDS。每次引用變量時,它都會返回自腳本調用以來的經過時間。

實施例:

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

輸出:

Start 0 
Middle 10 
End 20 
+6

沒有更精確的變量嗎?好的腳本運行得很快...... – 2013-06-04 05:12:17