В оболочке Unix, как получить вчерашнюю дату в переменной? - PullRequest
37 голосов
/ 19 августа 2010

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

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

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

По сути, я пытаюсь достичь, используя grep, чтобы извлечь все вчерашние строки из файла журнала, поскольку каждая строка в журнале содержит дату в формате «Пн 01.02.2010».

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

Ответы [ 17 ]

65 голосов
/ 19 августа 2010
dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt
48 голосов
/ 19 августа 2010

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

date -d "-1 days" +"%a %d/%m/%Y"
12 голосов
/ 08 сентября 2015

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

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

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

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

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

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

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

date --date = '10 месяц назад '

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

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

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

дата --date = 'завтра'

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

date --date = '10 day '

date --date= '10 неделя '

дата --date = '10 месяц'

дата --date = '10 год '

12 голосов
/ 19 августа 2010

Если у вас есть 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
9 голосов
/ 19 августа 2010

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

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

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

date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
6 голосов
/ 12 июня 2014

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

#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with  YYYYMMDD format
4 голосов
/ 19 августа 2010

У вас есть по крайней мере 2 варианта

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

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

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

3 голосов
/ 02 сентября 2011

Вот 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
3 голосов
/ 15 мая 2014

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

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

Работает как в Linux, так и в OSX.

2 голосов
/ 07 апреля 2018

Хотя все хорошие ответы, к сожалению, ни один из них не работал для меня. Поэтому мне пришлось написать что-то старое. (Я был на минимальной ОС Linux)

$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )

Вы можете комбинировать это с обычным форматированием даты. Например.

$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d

Объяснение: Возьмите ввод даты в единицах epoc секунд (опция -d), из которых вы вычли бы эквивалентные сутки. Это даст дату ровно один день назад.

...