hedkandi has asked for the wisdom of the Perl Monks concerning the following question:

Hi team I found this script online and made some changes to it to convert Epoch time-stamped history files into human-readable format, but I keep getting this annoying "day out of range error" Here's the script I'm using:

#!/bin/bash # YYYY MM DD HH MM SS # perl autosplits the string and uses timelocal to return # the number of seconds from the Epoch # No error checking! function seconds_from_epoch { echo $*| perl -MTime::Local -ane ' my $epochseconds = timegm($F[5], $F[4], $F[3], $F[2], $F[1], $F[0]); print "$epochseconds\n"; ' } # parse file s32adm_bash_history date and time set -- $(ls -l s32adm_bash_history) fdate=$7 ftime=$6 # parse the year, month, and day set -- $(IFS="-"; echo $fdate) fyear=$1 fmonth=$2 fday=$3 # parse the hours and minutes set -- $(IFS=":"; echo $ftime) fhour=$4 fmin=$5 totsecs=$(seconds_from_epoch $fmin $fhour $fday $fmonth $fyear ) echo $totsecs

and this is the error:

[root@H99A100 user_history]# ./timeperl Day '' out of range 1..31 at -e line 2

So what am I doing wrong? Is it the timegm? I changed it to Localtime and I get the same error Please help! I've been cracking it for days Rgds

Replies are listed 'Best First'.
Re: Epoch time conversion script
by NetWallah (Canon) on Mar 28, 2012 at 04:30 UTC
    What an abomination ! . Replace the program with:
    perl -e 'print ( (stat(shift))[8] . "\n") ' s32adm_bash_history
    If you really want to diagnose it, you will need to find out what you are passing into the function.
    In particular, what is the value of $fday ?

    Also - your program does NOT make it's output human-readable - indeed , quite the reverse - it converts human time into Unix Epoch.

                 All great truths begin as blasphemies.
                       ― George Bernard Shaw, writer, Nobel laureate (1856-1950)

      Hi netwallah

      I am trying to convert the epoch time to local time. I can use a one-liner that does the job but it's tedious to do it manually with many users on the system

      cat /var/log/user_history/32adm_bash_history | while read line ; do i +f [[ $line =~ '^#' ]]; then date -d "@$(echo $line | cut -c2-)"; els +e echo $line ; fi; done

        Could you please post some sample lines from 32adm_bash_history so we can see the format of your file? And what your expected output would look like?