Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom format for time command

I'd like to use the time command in a bash script to calculate the elapsed time of the script and write that to a log file. I only need the real time, not the user and sys. Also need it in a decent format. e.g 00:00:00:00 (not like the standard output). I appreciate any advice.

The expected format supposed to be 00:00:00.0000 (milliseconds) [hours]:[minutes]:[seconds].[milliseconds]

I've already 3 scripts. I saw an example like this:

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

But I only need the real time, not the user and sys. Also need it in a decent format. e.g 00:00:00:00 (not like the standard output).

In other words, I'd like to know how to turn the time output into something easier to process.

like image 267
John Doe Avatar asked Sep 10 '10 09:09

John Doe


People also ask

What is FFF in time format?

The "ffff" custom format specifier represents the four most significant digits of the seconds fraction; that is, it represents the ten thousandths of a second in a date and time value.

How do you use time command?

Time Command Versions To use the Gnu time command, you need to specify the full path to the time binary, usually /usr/bin/time , use the env command or use a leading backslash \time which prevents both and built-ins from being used.


1 Answers

You could use the date command to get the current time before and after performing the work to be timed and calculate the difference like this:

#!/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))"" 

Notes: $((...)) can be used for basic arithmetic in bash – caution: do not put spaces before a minus - as this might be interpreted as a command-line option.

See also: http://tldp.org/LDP/abs/html/arithexp.html

EDIT:
Additionally, you may want to take a look at sed to search and extract substrings from the output generated by time.

EDIT:

Example for timing with milliseconds (actually nanoseconds but truncated to milliseconds here). Your version of date has to support the %N format and bash should support large numbers.

# 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}" 

DISCLAIMER:
My original version said

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

but this was edited out because it apparently did not work for some people whereas the new version reportedly did. I did not approve of this because I think that you have to use the remainder only but was outvoted.
Choose whatever fits you.

like image 88
Arc Avatar answered Sep 18 '22 15:09

Arc