I am running SunOS.
bash-3.00$ uname -a
SunOS lvsaishdc3in0001 5.10 Generic_142901-02 i86pc i386 i86pc
I need to find Yesterday's date in linux with the proper formatting passed from command prompt. When I tried like this on my shell prompt-
bash-3.00$ date --date='yesterday' '+%Y%m%d'
date: illegal option -- date=yesterday
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
I always get date illegal option, why is it so?
Is there anything wrong I am doing?
Update:-
bash-3.00$ date --version
date: illegal option -- version
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
Try this below thing. It should work
YESTERDAY=`TZ=GMT+24 date +%Y%m%d`; echo $YESTERDAY
Try this one out:
DATE_STAMP=`TZ=GMT+24 date +%Y%m%d`
where GMT is the time zone and you might need to alter the 24 according to the hours difference you have from GMT. Either that or you can change GMT to a time zone more comfortable to you e.g. CST
As larsks suggested, you can use perl:
perl -e 'use POSIX qw(strftime); print strftime "%a %b %e %H:%M:%S %Y",localtime(time()- 3600*24);'
Slightly modified from
http://blog.rootshell.be/2006/05/04/solaris-yesterday-date/
To get YYYYMMDD format use this
perl -e 'use POSIX qw(strftime); print strftime "%Y%m%d",localtime(time()- 3600*24);'
This link explains how to format date and time with strftime
http://perltraining.com.au/tips/2009-02-26.html
A pure bash solution
#!/bin/bash
# get and split date
today=`date +%Y%m%d`
year=${today:0:4}
month=${today:4:2}
day=${today:6:2}
# avoid octal mismatch
if (( ${day:0:1} == 0 )); then day=${day:1:1}; fi
if (( ${month:0:1} == 0 )); then month=${month:1:1}; fi
# calc
day=$((day-1))
if ((day==0)); then
month=$((month-1))
if ((month==0)); then
year=$((year-1))
month=12
fi
last_day_of_month=$((((62648012>>month*2&3)+28)+(month==2 && y%4==0)))
day=$last_day_of_month
fi
# format result
if ((day<10)); then day="0"$day; fi
if ((month<10)); then month="0"$month; fi
yesterday="$year$month$day"
echo $yesterday
TZ=$TZ+24 date +'%Y/%m/%d' in SunOS.
Playing on Solaris10 with non-GMT environment, I'm getting this:
# date
Fri Jul 26 13:09:38 CEST 2013 (OK)
# (TZ=CEST+24 date)
Thu Jul 25 11:09:38 CEST 2013 (ERR)
# (TZ=GMT+24 date)
Thu Jul 25 11:09:38 GMT 2013 (OK)
# (TZ=CEST+$((24-$((`date "+%H"`-`date -u "+%H"`)))) date)
Thu Jul 25 13:09:38 CEST 2013 (OK)
As You colud see, I have and I want to get CEST , but TZ=CEST+24 giving me wrong CEST data; GMT+24 giving me correct data, but unusable.
To get the proper result, I has to use GMT+22 (wrong command, correct result) or CEST+22 (wrong value, but finnaly correct result for correct TZ)
A pure bash solution given by #olivecoder is very reliable compared to any other solution but there is a mistake to be corrected. when the day fall on 1st of the month the script is failing with date saying "last_day_of_month" in day value. #olivecoder has missed $ in
day=last_day_of_month, that it should be
day=$last_day_of_month;
After this correction it works very good.
Using Timezone -24 is having some issue based on time when use it. in some cases it goes to day before yesterday. So I think its not reliable.
Related
I have below timestamp, which I need to change to seconds since epoch in a bash script, Mac OS and compare with current system time.
2021-09-21T06:27:15Z
Current System Time is in IST format. i.e Tue Sep 21 12:20:42 IST 2021
Please suggest a better way to achieve it.
This should give you what you want:
#!/bin/bash
date="2021-09-21T06:27:15Z"
epoch=$(date -d "${date}" +%s)
I am using date -s ".." to change my date and time.
date --s "Friday, March 11, 2016 12:00:00 PM IST"
I get the following error..I guess I am on Linux..Solaris..not sure what argument(plug) it uses internally for date..
date: illegal option -- set
usage: date [-u] mmddHHMM[[cc]yy][.SS]
date [-u] [+format]
date -a [-]sss[.fff]
I want to change it to same date next month to perform testing.
I would like to revert it back to IST post testing
What are my commands?
try :)
date mmddhhmmyy
date 012111032016
you can use
date --set="2 OCT 2006 18:00:00" or date +%Y%m%d -s "20120418"
For the time to be in IST. You can try following
cd /etc
ln -sf /usr/share/zoneinfo/EST localtime
ln -sf /usr/share/zoneinfo/Asia/Calcutta localtime
For temporary change in time zone
export TZ=Asia/Calcutta
was set on crontab the line below. But is not validate the day. When I remove de day of week is executed correctly. Any suggestion?
# uname -a
Linux server 2.6.32-358.14.1.el6.x86_64 #1 SMP Tue Jul 16 23:51:20 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/issue
Red Hat Enterprise Linux Server release 6.4 (Santiago)
Kernel \r on an \m
# date
Mon Mar 2 08:50:19 BRT 2015
# crontab -l
* * 1 3 1 echo "teste"
# tail -f /var/log/cron
Mar 2 08:38:01 server CROND[10509]: (root) CMD (echo "teste")
If the time interval can't be defined in crontab, you can use a date/time check in the script itself. You can force crontab to run script at every 2nd March and check inside the script if the day is actually Monday. If not, you can exit the script.
Eg.
[[ $( date +%u ) -ne 1 ]] && exit
If the day isn't Monday, exit.
About crontab
"... there is one exception: if both "day of month" and "day of week" are restricted (not "*"), then either the "day of month" field (3) or the "day of week" field (5) must match the current day. ..."
A similar problem is said in Run a cron job on the first Monday of every month? and How to run a cron job on the first weekday of the month
So, in crontab set:
* * 1 3 * [ "$(date '+\%a')" == "Sun" ] && /bin/mkdir /tmp/cronsilvioteste
The problem is:
After user enter a linux command.
How can I get the output of the first command using another command?
Note: we cannot redirect output of first command to somewhere.
Using history expansion
$ date -d "12:00"
Thu Sep 19 12:00:00 EDT 2013
$ d=$(!!)
$ echo $d
Thu Sep 19 12:00:00 EDT 2013
I want to execute a script and make it schedule the next execution. A sample would be:
#!/bin/bash
TMP=/tmp/text.txt
SCRIPT=$(readlink -f $0)
date >>$TMP
at -f $SCRIPT now + 1 minutes >>$TMP 2>&1
echo -e "\n" >>$TMP
A sample execution would do as follows:
First execution OK. Schedules to next minute
Second execution writes OK but doesn't schedule
Resulting output would be:
tue mar 5 14:34:01 CET 2013
job 15 at 2013-03-05 14:35
tue mar 5 14:35:00 CET 2013
job 16 at 2013-03-05 14:36
[now at 2013-03-05 14:38]
atq outputs nothing and I don't see any /var/at/jobs (In fact, ls /var/at* outputs nothing. There is no message in any user in /var/mail/. I'm trying on a CentOS release 5.6 x86_64
Anyone has any hint as to what may be happening?
suspectus, you have hit the point... echo $SCRIPT gives '/bin/bash'... I've manually written the full path and now it works