Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在unixshell中,如何获取昨天&x27;将日期转换为变量?_Unix_Datetime_Shell_Ksh_Hp Ux - Fatal编程技术网

在unixshell中,如何获取昨天&x27;将日期转换为变量?

在unixshell中,如何获取昨天&x27;将日期转换为变量?,unix,datetime,shell,ksh,hp-ux,Unix,Datetime,Shell,Ksh,Hp Ux,我有一个shell脚本,它执行以下操作,将当前日期存储在变量“dt”中: date "+%a %d/%m/%Y" | read dt echo ${dt} 我怎样才能把昨天的日期变成一个变量呢 基本上,我试图实现的是使用grep从日志文件中提取昨天的所有行,因为日志中的每一行都包含“Mon 01/02/2010”格式的日期 非常感谢您至少有两种选择 使用perl: perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1

我有一个shell脚本,它执行以下操作,将当前日期存储在变量“dt”中:

date "+%a %d/%m/%Y" | read dt
echo ${dt}
我怎样才能把昨天的日期变成一个变量呢

基本上,我试图实现的是使用grep从日志文件中提取昨天的所有行,因为日志中的每一行都包含“Mon 01/02/2010”格式的日期


非常感谢

您至少有两种选择

  • 使用perl:

    perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
    
  • 安装GNU日期(如果我没记错的话,它在
    sh_utils
    包中)

  • 不确定这是否有效,但您可以使用负时区。如果您使用的时区比当前时区早24小时,则只需使用
    date


  • 如果您在Mac或BSD或其他没有--date选项的设备上,您可以使用:

    date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'
    
    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
    
    更新:或者

    date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
    

    如果您有可用的Perl(并且您的
    日期
    没有像
    昨天
    这样的好功能),您可以使用:

    date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'
    
    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
    

    谢谢大家的帮助,但由于我使用的是HP-UX(毕竟,您支付的费用越多,获得的功能就越少……),我不得不求助于perl:

    perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt
    
    在Linux上,您可以使用

    date -d "-1 days" +"%a %d/%m/%Y"
    

    如果您的HP-UX安装中安装了Tcl,您可能会发现它的日期算法非常可读(不幸的是,Tcl shell没有像perl那样的好的“-e”选项):


    这将解决所有夏令时的麻烦。

    如果您没有支持--date的版本,并且您不想使用perl,那么可以使用我的这个方便的ksh脚本。默认情况下,它返回昨天的日期,但您可以输入一个数字,它会告诉您过去许多天的日期。如果你把目光投向遥远的过去,它会开始慢下来一点。10万天前是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
    

    下面是一个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
    
    测验 ksh93:

    或:


    第一个在同一进程中运行,第二个在子shell中运行。

    对于Hp UX,仅以下命令适用于我:

    #!/bin/bash
    yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
    mkdir $yesterday # creates a directory with  YYYYMMDD format
    
    TZ=aaa24日期+%Y%m%d

    您可以将其用作:

    ydate=`TZ=aaa24日期+%Y%m%d`


    echo$ydate

    尝试以下方法:

    dt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
    echo $dt
    

    它可以在Linux和OSX上工作。

    我在Linux中有shell脚本,下面的代码对我有用:

    #!/bin/bash
    yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
    mkdir $yesterday # creates a directory with  YYYYMMDD format
    

    如果您有权访问
    python
    ,这是一个帮助程序,它将获取任意
    n
    天前的
    yyyy-mm-dd
    日期值:

    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
    

    将在AIX中获取昨天,并将TZ变量设置回原始值。您可以使用GNU date命令,如下所示

    过去的约会

    要获取过去的昨天和更早的一天,请使用字符串day ago:

    date--date='昨天'

    日期--date='1天前'

    日期--date='10天前'

    日期--date='10周前'

    日期--date='10个月前'

    日期--date='10年前'

    未来的约会

    要获取明天和后天(明天+N),请使用day word获取未来的日期,如下所示:

    date--date='明天'

    日期--date='1天'

    日期--date='10天'

    日期--date='10周'

    日期--date='10个月'


    date--date='10年'

    虽然所有答案都很好,但不幸的是,没有一个对我有用。所以我不得不写一些老派的东西。(我使用的是最简单的Linux操作系统)

    您可以将其与日期的常规格式相结合。例如

    $ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d
    
    说明:
    以epoc秒(选项-d)为单位输入日期,从中减去一天的等效秒数。这将使日期精确地返回一天。

    Perl是一个选项,如果必要的话……使用
    $()
    而不是
    `
    会比较方便。ksh有
    $()
    ?+1,只是因为没有假设每个UNIX问题都在Linux上。我们中的一些人还必须使用其他样式。@paxdiablo:同意,但如果没有给出具体信息,我个人认为GNU工具包是一种选择;)
    HP-UX
    AIX
    Solaris
    *BSD
    之间的差异很难猜出味道。在奇怪的情况下,这会失败吗?比如有闰秒吗?@Alok:POSIX/Unix不跟踪闰秒(所有天数都是86400秒),但DST有一个极端情况(请参阅我对@Chris:I的评论,我认为它不会是GNU兼容的
    date
    ,但由于您没有指定Unix变体,我只是猜测;)使用
    HP-UX
    时,您的选项有点有限,
    date
    没有这些选项,因此
    Perl
    可能是最好的选择。这并不重要,但如果您打算
    %100
    结果:-)@paxdiablo:fair point,您不需要将
    1900
    添加到年份中,Perl显然不是我的强项之一;)我会用+1来代替你的答案。需要注意的是,unix“-d Dayed”版本的简短语法可能不支持-Dayed标志。@Chris:注意,这给出了24小时前的日期,与昨天的日期有细微的不同。如果您的区域设置有夏令时,这将在冬季的第一天23:00之后给出错误的日期。@Gilles,这一点不错,因为我使用的是locattime。如果你担心它,你可以检查这个小时是否大于下午6点,只需减去6小时。这很有希望能解决问题。吉尔斯说得好。我想念我的C#:DateTime.Now.AddDays(-1)
    brew安装coreutils
    将gnu日期安装为gdate。在macOS和Linux上工作。@clarkw:好建议,我将把它添加到答案中。这是所有答案中最好的一个,简短、甜美、简单、方便、酷,它证明了“给一个人一条鱼,他吃一天,但教他钓鱼,他吃一辈子”的故事
    #!/bin/bash
    yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
    mkdir $yesterday # creates a directory with  YYYYMMDD format
    
    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;
    
    $ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )
    
    $ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d