wake-up-neo.net

Wie bekomme ich in einer Unix-Shell das Datum von gestern in eine Variable?

Ich habe ein Shell-Skript, das das Datum des aktuellen Tages in einer Variablen 'dt' speichert:

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

Wie würde ich gehen, um gestern Datum in eine Variable zu bekommen?

Grundsätzlich möchte ich mit grep alle Zeilen von gestern aus einer Protokolldatei ziehen, da jede Zeile im Protokoll das Datum im Format "Mon 01/02/2010" enthält.

Danke vielmals

37
Chris

Wenn Sie über Perl verfügen (und Ihre date keine Nice-Funktionen wie yesterday hat), können Sie Folgendes verwenden:

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
12
paxdiablo
dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt
64
polemon

Unter Linux können Sie verwenden

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

Sie können den Datumsbefehl GNU wie unten gezeigt verwenden

Datum in die Vergangenheit bekommen

Um gestern und früher in die Vergangenheit zu kommen, verwenden Sie den String-Tag vor:

date --date = 'gestern'

date --date = 'vor 1 Tag'

date --date = "vor 10 Tagen"

date --date = "vor 10 Wochen"

date --date = "vor 10 Monaten"

date --date = "vor 10 Jahren"

Date in der Zukunft bekommen

Um morgen und übermorgen (morgen + N) zu kommen, verwenden Sie day Word, um ein Datum in der Zukunft zu erhalten:

date --date = 'morgen'

date --date = '1 Tag'

date --date = '10 day '

date --date = '10 week '

date --date = '10 Monat '

date --date = '10 Jahr '

12
ramit girdhar

Wenn Sie sich auf einem Mac oder einer BSD oder etwas anderem ohne die Option --date befinden, können Sie Folgendes verwenden:

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

Update : oder vielleicht ...

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

Ich habe ein Shell-Skript in Linux und folgenden Code für mich gearbeitet:

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

Sie haben mindestens zwei Möglichkeiten

  1. Perl verwenden:

    Perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
    
  2. GNU date installieren (wenn ich mich recht erinnere, ist es im sh_utils-Paket)

    date --date yesterday "+%a %d/%m/%Y" | read dt
    echo ${dt}
    
  3. Nicht sicher, ob dies funktioniert, aber Sie können möglicherweise eine negative Zeitzone verwenden. Wenn Sie eine Zeitzone 24 Stunden vor Ihrer aktuellen Zeitzone verwenden, können Sie einfach date verwenden.

4
Wolph

Versuchen Sie die folgende Methode:

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

Es funktioniert sowohl unter Linux als auch unter OSX.

3
kenorb

Hier ist ein ksh-Skript zum Berechnen des vorherigen Datums des ersten Arguments, getestet auf 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

Tests

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

Vielen Dank für die Hilfe, aber seit ich auf HP-UX bin (immerhin: Je mehr Sie bezahlen, desto weniger Funktionen bekommen Sie ...), musste ich auf Perl zurückgreifen:

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

Wenn bei Ihrer HP-UX-Installation Tcl installiert ist, ist die Datumsberechnung möglicherweise sehr lesbar (die Tcl-Shell hat leider keine Nice-e-Option wie Perl):

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

Damit werden alle Probleme mit der Sommerzeit berücksichtigt.

2
glenn jackman
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;

Bekomme dich gestern in AIX und setze die TZ-Variable auf das Original zurück

2
santymano

ksh93:

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

oder:

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

Der erste läuft im selben Prozess ab, der zweite in einer Subshell.

2
danlei

Wenn Sie Zugriff auf python haben, ist dies ein Helfer, der den yyyy-mm-dd date-Wert für beliebige n Tage vor Tagen erhält:

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
wuster

Wenn Sie keine Date-Version haben, die - gestern unterstützt und Sie Perl nicht verwenden möchten, können Sie dieses praktische ksh-Skript von mir verwenden. Standardmäßig wird das Datum von gestern zurückgegeben. Sie können jedoch eine Zahl eingeben, die das Datum enthält, das viele Tage in der Vergangenheit liegt. Wenn Sie weit in die Vergangenheit blicken, wird es etwas langsamer. Vor 100.000 Tagen war es 30.01.1738, obwohl mein System 28 Sekunden brauchte, um das herauszufinden.

    #! /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
2
Ken Beer

Obwohl alle guten Antworten, funktionierte leider keine für mich. Also musste ich etwas altes schreiben. (Ich war auf einem minimalen Linux-Betriebssystem)

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

Sie können dies mit der üblichen Formatierung von date kombinieren. Z.B. 

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

Erläuterung: Nehmen Sie die Datumseingabe in Epoc-Sekunden (Option -d) vor, von der Sie einen Tag in äquivalenten Sekunden abgezogen hätten. Dies gibt das Datum genau einen Tag zurück.

2
Gautam

Für Hp-UX funktionierte nur der folgende Befehl für mich:

TZ = aaa24 Datum +% Y% m% d

sie können es verwenden als:

ydate = `TZ = aaa24 Datum +% Y% m% d '

echo $ ydate

1
Anvesh