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

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

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

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

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

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

Ответы [ 17 ]

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

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

perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt
2 голосов
/ 18 мая 2015
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;

Получит вас вчера в AIX и вернет переменную TZ обратно в исходное

2 голосов
/ 25 августа 2014

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

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

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

справится со всеми проблемами летнего времени.

2 голосов
/ 31 января 2013

ksh93:

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

или:

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

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

2 голосов
/ 26 ноября 2010

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

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

TZ = aaa24 date +% Y% m% d

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

ydate= `TZ = aaa24 дата +% Y% m% d`

echo $ ydate

...