Подтвердить что ты не робот

В оболочке unix, как получить вчера дату в переменную?

У меня есть оболочка script, которая делает следующее, чтобы сохранить текущую дату дня в переменной 'dt':

date "+%a %d/%m/%Y" | read dt
echo ${dt}

Как я могу получить дату вчерашнего дня в переменную?

В основном я пытаюсь использовать grep, чтобы вытащить все предыдущие строки из файла журнала, так как каждая строка в журнале содержит дату в формате "Mon 01/02/2010".

Спасибо большое

4b9b3361

Ответ 1

Если у вас есть доступный 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

Ответ 2

dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt

Ответ 3

В Linux вы можете использовать

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

Ответ 4

Если вы находитесь на Mac или BSD или что-то еще без опции -date, вы можете использовать:

date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'

Обновление: или, возможно,...

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

Ответ 5

Вы можете использовать команду даты GNU, как показано ниже

Получение даты в прошлом

Чтобы получить вчера и более ранний день в прошлом, используйте строку день назад:

date --date = 'вчера'

date --date = '1 день назад'

date --date = '10 day ago '

date --date = '10 неделю назад '

date --date = '10 month ago '

date --date = '10 год назад '

Получение даты в будущем

Чтобы получить завтра и послезавтра (завтра + N), используйте дневное слово для получения даты в будущем следующим образом:

date --date = 'tomorrow'

date --date = '1 день'

date --date = '10 day '

date --date = '10 week '

date --date = '10 month '

date --date = '10 year '

Ответ 6

У меня есть оболочка script в Linux, и следующий код работал у меня:

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

Ответ 7

У вас есть как минимум 2 варианта

  • Использовать perl:

    perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
    
  • Установите дату GNU (она в пакете sh_utils, если я правильно помню)

    date --date yesterday "+%a %d/%m/%Y" | read dt
    echo ${dt}
    
  • Не уверен, что это работает, но вы можете использовать отрицательный часовой пояс. Если вы используете часовой пояс за 24 часа до вашего текущего часового пояса, вы можете просто использовать date.

Ответ 8

Вот пример ksh script to для вычисления предыдущей даты первого аргумента, протестированного на 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

Ответ 9

Попробуйте выполнить следующий метод:

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

Он работает как с Linux, так и с OSX.

Ответ 10

Спасибо за помощь всем, но так как я на HP-UX (в конце концов: чем больше вы платите, тем меньше возможностей вы получаете...) мне приходилось прибегать к perl:

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

Ответ 11

Если ваша установка HP-UX установлена ​​в Tcl, вы можете найти ее арифметикой даты очень читаемой (к сожалению, оболочка Tcl не имеет хорошего параметра "-e", например, perl):

dt=$(echo 'puts [clock format [clock scan yesterday] -format "%a %d/%m/%Y"]' | tclsh)
echo "yesterday was $dt"

Это позволит справиться со всеми проблемами, связанными с летней экономией.

Ответ 12

Если у вас нет версии даты, которая поддерживает - вчера, и вы не хотите использовать perl, вы можете использовать этот удобный ksh script. По умолчанию он возвращает вчерашнюю дату, но вы можете подать ему номер, и он сообщает вам дату, что многие дни в прошлом. Он начинает немного замедляться, если вы смотрите далеко в прошлое. 100 000 дней назад это было 1/30/1738, хотя моя система заняла 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

Ответ 13

ksh93:

dt=${ printf "%(%a %d/%m/%Y)T" yesterday; }

или

dt=$(printf "%(%a %d/%m/%Y)T" yesterday)

Первый работает в одном процессе, второй - в подоболочке.

Ответ 14

Если у вас есть доступ к 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

Ответ 15

$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;

Вы получите вчера в AIX и вернете переменную TZ обратно к оригинальной

Ответ 16

Для Hp-UX работала только команда ниже:

TZ = aaa24 date +% Y% m% d

вы можете использовать его как:

ydate = `TZ = aaa24 date +% Y% m% d`

echo $ydate