13 ts adds a timestamp to the beginning of each line of input.
15 The optional format parameter controls how the timestamp is formatted,
16 as used by L<strftime(3)>. The default format is "%b %d %H:%M:%S". In
17 addition to the regular strftime conversion specifications, "%.S" and "%.s"
18 are like "%S" and "%s", but provide subsecond resolution
19 (ie, "30.00001" and "1301682593.00001").
21 If the -r switch is passed, it instead converts existing timestamps in
22 the input to relative times, such as "15m5s ago". Many common timestamp
23 formats are supported. Note that the Time::Duration and Date::Parse perl
24 modules are required for this mode to work. Currently, converting localized
25 dates is not supported.
27 If both -r and a format is passed, the existing timestamps are
28 converted to the specified format.
30 If the -i switch is passed, ts timestamps incrementally instead. Every
31 timestamp will be the time elapsed since the last timestamp.
32 The default format changes to "%H:%M:%S", and "%.S" and "%.s" can be used
37 The standard TZ environment variable controls what time zone dates
38 are assumed to be in, if a timezone is not specified as part of the date.
42 Copyright 2006 by Joey Hess <joey@kitenet.net>
44 Licensed under the GNU GPL.
50 use POSIX q{strftime};
57 GetOptions("r" => \$rel, "i" => \$inc) || die "usage: ts [-r] [-i] [format]\n";
68 my $format="%b %d %H:%M:%S";
72 $format=shift if @ARGV;
74 # For subsecond resolution, Time::HiRes is needed.
76 if ($format=~/\%\.[Ss]/) {
82 my $lastmicroseconds = 0;
85 ($lastseconds, $lastmicroseconds) = Time::HiRes::gettimeofday();
95 my ($seconds, $microseconds) = Time::HiRes::gettimeofday();
97 my $deltaseconds = $seconds - $lastseconds;
98 my $deltamicroseconds = $microseconds - $lastmicroseconds;
99 if ($deltamicroseconds < 0) {
101 $deltamicroseconds += 1000000;
103 $lastseconds = $seconds;
104 $lastmicroseconds = $microseconds;
105 $seconds = $deltaseconds;
106 $microseconds = $deltamicroseconds;
108 my $s=sprintf("%06i", $microseconds);
109 $f=~s/\%\.([Ss])/%$1.$s/g;
111 print strftime($f, localtime($seconds));
113 print strftime($f, gmtime($seconds));
119 my $deltaseconds = $seconds - $lastseconds;
120 $lastseconds = $seconds;
121 print strftime($format, gmtime($deltaseconds));
123 print strftime($format, localtime);
130 \d\d[-\s\/]\w\w\w # 21 dec 17:05
131 (?:\/\d\d+)? # 21 dec/93 17:05
132 [\s:]\d\d:\d\d # (time part of above)
133 (?::\d\d)? # (optional seconds)
134 (?:\s+[+-]\d\d\d\d)? # (optional timezone)
136 \w{3}\s+\d\d\s+\d\d:\d\d:\d\d # syslog form
138 \d\d\d[-:]\d\d[-:]\d\dT\d\d:\d\d:\d\d.\d+ # ISO-8601
140 (?:\w\w\w,?\s+)? # (optional Day)
141 \d+\s+\w\w\w\s+\d\d+\s+\d\d:\d\d:\d\d
143 (?:\s+\w\w\w|\s[+-]\d\d\d\d)?
144 # (optional timezone)
146 \w\w\w\s+\w\w\w\s+\d\d\s+\d\d:\d\d
151 ? strftime($format, localtime(str2time($1)))
152 : concise(ago(time - str2time($1), 2))