ミリ秒単位で時間を取得するためのLinuxのシェルコマンドはありますか?
date +%s%N
は、秒数+現在のナノ秒を返します。
したがって、echo $(($(date +%s%N)/1000000))
はあなたが必要とするものです。
例:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
は、エポック以降の秒数を返します。
date +"%T.%N"
は、現在時刻をナノ秒で返します。
06:46:41.431857000
date +"%T.%6N"
は、現在の時刻を最初の6桁に丸めたナノ秒(マイクロ秒)で返します。
06:47:07.183172
date +"%T.%3N"
は、現在の時刻を最初の3桁に丸めたナノ秒(ミリ秒)で返します。
06:47:42.773
一般に、date
コマンドのフォーマットの各フィールドには、オプションのフィールド幅を指定できます。
nanoは10−9 そしてミリ10−3。したがって、ミリ秒を取得するためにナノ秒の最初の3文字を使用できます。
date +%s%3N
man date
から:
%N ナノ秒(000000000..999999999)
%s 1970-01-01 00:00:00 UTCからの経過秒数
出典:Server Fault's bashを使って現在のUnix時間をミリ秒単位で取得するにはどうすればよいですか 。
date
が%N
フラグをサポートしていないOS Xでは、 homebrew を使用してcoreutils
をインストールすることをお勧めします。これにより、Linuxシステムでgdate
と同じように動作するdate
というコマンドにアクセスできます。
brew install coreutils
より「ネイティブな」経験のために、あなたはいつでもこれをあなたの.bash_aliases
に加えることができます
alias date='gdate'
それから実行
$ date +%s%N
date
コマンドはOS Xではミリ秒を提供しなかったので、pythonのエイリアスを使用しました
millis(){ python -c "import time; print(int(time.time()*1000))"; }
OR
alias millis='python -c "import time; print(int(time.time()*1000))"'
これは、ミリ秒単位で時間を取得するための、Linux用の移植性のあるハックです。
#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3 # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"
millisec=$(( 10*(t2-t1) ))
echo $millisec
出力は以下のとおりです。
3010
これは非常に安価な操作です。Shellの内部とprocfsで動作します。
他の答えはたいていの場合はおそらく十分ですが、私はbusyboxシステムで問題に遭遇したとき私は私の2セントを追加したいと思いました。
問題のシステムは%N
フォーマットオプションをサポートしておらず、python
またはPerl
インタプリタを持っていません。
たくさん頭を掻いた後、私達(ありがとうDave!)はこれを思い付きました:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
これはadjtimex
の出力から秒とマイクロ秒を抽出し(通常はシステムクロックのオプションを設定するために使用されます)、それらを改行せずに表示します(したがって、それらは一緒に接着されます)。マイクロ秒フィールドにはゼロを事前に埋め込む必要がありますが、これは6桁を超える秒フィールドには影響しません。これからマイクロ秒をミリ秒に変換するのは簡単なはずです。
末尾の改行が必要な場合(おそらく見栄えがよいためなど)、試してみてください
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
また、これにはadjtimex
とawk
が利用可能であることが必要です。そうでなければbusyboxであなたはローカルでそれらを指すことができます
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
そして上記のように
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
あるいはもちろんあなたはそれらをあなたのPATH
に入れることができます
編集:
上記は私のbusyboxデバイスで動作しました。 Ubuntuでも同じことを試してみたところ、adjtimex
には異なるバージョンがあることがわかりました。 Ubuntuでは、これは小数点以下の桁数をマイクロ秒単位で出力します(末尾の改行を含む)。
Sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Ubuntuではこれをやらないでしょう。私はdate +%s%N
を使うでしょう
AIXのような変わったプラットフォーム上でさえ、Perlがこれに使用できます。例:
#!/usr/bin/Perl -w
use strict;
use Time::HiRes qw(gettimeofday);
my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime ($t_sec);
printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
@ Alperの答えに、この機能を動作させるために私がしなければならなかったことを追加したいだけでした。
Macでは、gdate
を使用できるようにbrew install coreutils
が必要です。それ以外のLinuxでは、そのdate
だけです。そしてこの関数は一時ファイルなどを作成しなくてもコマンドの時間を計るのに役立ちます。
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
そしてそれを文字列timeit 'tsc --noEmit'
と一緒に使うことができます
このようなpythonスクリプト:
import time
cur_time = int(time.time()*1000)