我有一个shell脚本,用于将当前日期存储在变量'dt'中,具体操作如下:
date "+%a %d/%m/%Y" | read dt
echo ${dt}
如何将昨天的日期存入变量中?
我想要做的就是使用grep从日志文件中提取所有昨天的行,因为日志中的每一行都包含“Mon 01/02/2010”格式的日期。
非常感谢!
dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt
在Linux上,你可以使用
date -d "-1 days" +"%a %d/%m/%Y"
date
命令不支持-d
标志。 - Davy M您可以使用GNU日期命令如下所示:
获取过去的日期
要获取昨天和更早的日期,请使用字符串“day ago”:
date --date='yesterday'(昨天)
date --date='1 day ago'(一天前)
date --date='10 day ago'(10天前)
date --date='10 week ago'(10周前)
date --date='10 month ago'(10个月前)
date --date='10 year ago'(10年前)
获取未来的日期
要获取明天和后天的日期(明天+N),请使用单词“day”以获取未来的日期,如下所示:
date --date='tomorrow'(明天)
date --date='1 day'(一天后)
date --date='10 day'(10天后)
date --date='10 week'(10周后)
date --date='10 month'(10个月后)
date --date='10 year'(10年后)
如果您可以使用Perl(并且您的date
没有像yesterday
这样的好用功能),您可以使用以下代码:
pax> date
Thu Aug 18 19:29:49 XYZ 2010
pax> dt=$(perl -e 'use POSIX;print strftime "%d/%m/%Y%",localtime time-86400;')
pax> echo $dt
17/08/2010
brew install coreutils
安装 GNU date 作为 gdate。可在 macOS 和 Linux 上使用。 - HappyFace如果您使用的是 Mac、BSD 或其他没有 --date 选项的操作系统,您可以使用以下命令:
date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'
更新:或者也许...
date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
$()
而不是 \`` 会更方便。ksh 支持
$()` 吗? - bstpierreHP-UX
、AIX
、Solaris
和*BSD
之间的差异太大了,无法猜测其类型。 - Wolph$((
用于算术扩展非常好,但这不是@bstpierre所说的。即使在其中,您也应该真正使用 $(
...)
进行命令扩展:$(( $(date +%s) - 86400 ))
。 - Mark Reed我在Linux中有一个shell脚本,以下代码对我有效:
#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with YYYYMMDD format
TZ
是时区,EST+24
表示美国东部标准时间的昨天日期(同样地,您可以使用 EST-24
来获取明天的日期)。+%Y%m%d
是 YYYYMMDD 的日期格式。 - jujuBeedt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
echo $dt
它可以在Linux和OSX上运行。
你至少有两个选项
Use perl:
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
Install GNU date (it's in the sh_utils
package if I remember correctly)
date --date yesterday "+%a %d/%m/%Y" | read dt
echo ${dt}
Not sure if this works, but you might be able to use a negative timezone. If you use a timezone that's 24 hours before your current timezone than you can simply use date
.
%100
的话,你就不需要将年份加上1900
了 :-) - paxdiablo#!/bin/ksh
sep=""
today=$(date '+%Y%m%d')
today=${1:-today}
ty=`echo $today|cut -b1-4` # today year
tm=`echo $today|cut -b5-6` # today month
td=`echo $today|cut -b7-8` # today day
yy=0 # yesterday year
ym=0 # yesterday month
yd=0 # yesterday day
if [ td -gt 1 ];
then
# today is not first of month
let yy=ty # same year
let ym=tm # same month
let yd=td-1 # previous day
else
# today is first of month
if [ tm -gt 1 ];
then
# today is not first of year
let yy=ty # same year
let ym=tm-1 # previous month
if [ ym -eq 1 -o ym -eq 3 -o ym -eq 5 -o ym -eq 7 -o ym -eq 8 -o ym - eq 10 -o ym -eq 12 ];
then
let yd=31
fi
if [ ym -eq 4 -o ym -eq 6 -o ym -eq 9 -o ym -eq 11 ];
then
let yd=30
fi
if [ ym -eq 2 ];
then
# shit... :)
if [ ty%4 -eq 0 ];
then
if [ ty%100 -eq 0 ];
then
if [ ty%400 -eq 0 ];
then
#echo divisible by 4, by 100, by 400
leap=1
else
#echo divisible by 4, by 100, not by 400
leap=0
fi
else
#echo divisible by 4, not by 100
leap=1
fi
else
#echo not divisible by 4
leap=0 # not divisible by four
fi
let yd=28+leap
fi
else
# today is first of year
# yesterday was 31-12-yy
let yy=ty-1 # previous year
let ym=12
let yd=31
fi
fi
printf "%4d${sep}%02d${sep}%02d\n" $yy $ym $yd
bin$ for date in 20110902 20110901 20110812 20110801 20110301 20100301 20080301 21000301 20000301 20000101 ; do yesterday $date; done
20110901
20110831
20110811
20110731
20110228
20100228
20080229
21000228
20000229
19991231
虽然所有的回答都不错,但很遗憾对我都没用。所以我只能采用一些老派的方法。(因为我使用的是一个最基本的 Linux 操作系统)
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d
解释: 以 Epoch 秒为单位输入日期(使用 -d 选项),从中减去一天的秒数。这将使日期精确地向前推移一天。