我有一个 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"
您可以使用 GNU date 命令,如下所示
获取过去的日期
要获取过去的昨天和更早的一天,请使用字符串 day ago:
日期 --date='昨天'
日期 --date='1 天前'
日期 --date='10 天前'
日期 --date='10 周前'
日期 --date='10 个月前'
日期 --date='10 年前'
获取未来的日期
要获取明天和后天(明天+N),请使用日字来获取未来的日期,如下所示:
日期 --date='明天'
日期 --date='1 天'
日期 --date='10 天'
日期 --date='10 周'
日期 --date='10 月'
日期 --date='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
如果您在 Mac 或 BSD 或其他没有 --date 选项的设备上,您可以使用:
date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'
更新:或者也许......
date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
我在 Linux 中有 shell 脚本,以下代码对我有用:
#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with YYYYMMDD format
您至少有 2 个选项
使用 perl:
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
sh_utils
安装 GNU 日期(如果我没记错,它在包中)
date --date yesterday "+%a %d/%m/%Y" | read dt
echo ${dt}
不确定这是否有效,但您也许可以使用负时区。如果您使用比当前时区早 24 小时的时区,则可以简单地使用date
.
尝试以下方法:
dt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
echo $dt
它适用于 Linux 和 OSX。
这是一个 ksh 脚本,用于计算第一个参数的前一个日期,在Solaris 10上进行了测试。
#!/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
感谢大家的帮助,但是由于我使用的是 HP-UX(毕竟:您支付的越多,获得的功能就越少……)我不得不求助于 perl:
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt
如果您的 HP-UX 安装安装了 Tcl,您可能会发现它的日期算法非常易读(不幸的是,Tcl shell 没有像 perl 这样的“-e”选项):
dt=$(echo 'puts [clock format [clock scan yesterday] -format "%a %d/%m/%Y"]' | tclsh)
echo "yesterday was $dt"
这将处理所有夏令时的麻烦。
如果您没有支持 --yesterday 的日期版本并且您不想使用 perl,您可以使用我的这个方便的 ksh 脚本。默认情况下,它返回昨天的日期,但你可以给它一个数字,它会告诉你过去多少天的日期。如果你看过去,它会开始放慢一点。100,000 天前是 1738 年 1 月 30 日,尽管我的系统花了 28 秒才弄清楚这一点。
#! /bin/ksh -p
t=`date +%j`
ago=$1
ago=${ago:=1} # in days
y=`date +%Y`
function build_year {
set -A j X $( for m in 01 02 03 04 05 06 07 08 09 10 11 12
{
cal $m $y | sed -e '1,2d' -e 's/^/ /' -e "s/ \([0-9]\)/ $m\/\1/g"
} )
yeardays=$(( ${#j[*]} - 1 ))
}
build_year
until [ $ago -lt $t ]
do
(( y=y-1 ))
build_year
(( ago = ago - t ))
t=$yeardays
done
print ${j[$(( t - ago ))]}/$y
ksh93:
dt=${ printf "%(%a %d/%m/%Y)T" yesterday; }
或者:
dt=$(printf "%(%a %d/%m/%Y)T" yesterday)
第一个在同一个进程中运行,第二个在子shell中运行。
对于 Hp-UX,仅以下命令对我有用:
TZ=aaa24 日期 +%Y%m%d
您可以将其用作:
ydate=`TZ=aaa24 日期+%Y%m%d`
回声 $ydate
如果您有权访问python
,这是一个助手,它将获取yyyy-mm-dd
任意n
天前的日期值:
function get_n_days_ago {
local days=$1
python -c "import datetime; print (datetime.date.today() - datetime.timedelta(${days})).isoformat()"
}
# today is 2014-08-24
$ get_n_days_ago 1
2014-08-23
$ get_n_days_ago 2
2014-08-22
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;
昨天将在 AIX 中为您提供并将 TZ 变量设置回原来的值
尽管所有答案都很好,但不幸的是,它们都不适合我。所以我不得不写一些老派的东西。(我在一个最小的 Linux 操作系统上)
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )
您可以将其与日期的通常格式结合使用。例如。
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d
解释 : 以 epoc 秒(-d 选项)的形式获取日期输入,从中减去相当于一天的秒数。这将精确地返回一天的日期。