summaryrefslogtreecommitdiff
path: root/ts
diff options
context:
space:
mode:
authorjoeyh <joeyh>2006-08-18 05:46:19 +0000
committerjoeyh <joeyh>2006-08-18 05:46:19 +0000
commitde4c5fde3d86ae278e71b102f640b110f361bda2 (patch)
treeee47e40f7f91358fbb8eb8a47a4154f45c804582 /ts
parentc7f258b2fbdcae9dc20d83dde6252dc8579962a5 (diff)
downloadmoreutils-de4c5fde3d86ae278e71b102f640b110f361bda2.tar.gz
* Change the default ts format to include the month and day, for consistency
with syslog format. * Add -r switch to ts, which makes it convert existing timestamps in the input into relative times, such as "15m2s ago".
Diffstat (limited to 'ts')
-rwxr-xr-xts62
1 files changed, 55 insertions, 7 deletions
diff --git a/ts b/ts
index 42a1ce4..de620c8 100755
--- a/ts
+++ b/ts
@@ -6,14 +6,24 @@ ts - timestamp input
=head1 SYNOPSIS
-ts [format]
+ts [-r] [format]
=head1 DESCRIPTION
-ts adds a timestamp to the beginning of each line of input
+ts adds a timestamp to the beginning of each line of input.
The optional format parameter controls how the timestamp is formatted,
-as used by L<strftime(3)>. The default format is "%H:%M:%S".
+as used by L<strftime(3)>. The default format is "%b %d %H:%M:%S".
+
+If the -r switch is passed, it instead converts existing timestamps in
+the input to relative times, such as "15m5s ago". Many common timestamp
+formats are supported. Note that the Time::Duration and Date::Parse perl
+modules are required for this mode to work.
+
+=head1 ENVIRONMENT
+
+The standard TZ environment variable controls what time zone dates
+are assumed to be in, if a timezone is not specified as part of the date.
=head1 AUTHOR
@@ -27,11 +37,49 @@ use warnings;
use strict;
use POSIX q{strftime};
-my $format="%H:%M:%S";
-$format=shift if @ARGV;
-
$|=1;
+my $rel=0;
+use Getopt::Long;
+GetOptions("r" => \$rel) || die "usage: ts [-r] [format]\n";
+
+if ($rel) {
+ eval q{
+ use Date::Parse;
+ use Time::Duration;
+ };
+ die $@ if $@;
+}
+
+my $format="%b %d %H:%M:%S";
+$format=shift if @ARGV;
+
while (<>) {
- print strftime($format, localtime)." ".$_;
+ if (! $rel) {
+ print strftime($format, localtime)." ".$_;
+ }
+ else {
+ s{\b(
+ \d\d[-\s\/]\w\w\w # 21 dec 17:05
+ (?:\/\d\d+)? # 21 dec/93 17:05
+ [\s:]\d\d:\d\d # (time part of above)
+ (?::\d\d)? # (optional seconds)
+ (?:\s+[+-]\d\d\d\d)? # (optional timezone)
+ |
+ \w{3}\s+\d\d\s+\d\d:\d\d:\d\d # syslog form
+ |
+ \d\d\d[-:]\d\d[-:]\d\dT\d\d:\d\d:\d\d.\d+ # ISO-8601
+ |
+ (?:\w\w\w,?\s+)? # (optional Day)
+ \d+\s+\w\w\w\s+\d\d+\s+\d\d:\d\d:\d\d
+ # 16 Jun 94 07:29:35
+ (?:\s+\w\w\w|\s+-\d\d\d\d)?
+ # (optional timezone)
+ )\b
+ }{
+ concise(ago(time - str2time($1), 2))
+ }exg;
+
+ print $_;
+ }
}