Dans un shell unix, comment entrer la date d'hier dans une variable?

j'ai un script shell qui fait ce qui suit pour stocker la date du jour en cours dans une variable 'dt':

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

Comment puis-je obtenir hier date dans une variable?

fondamentalement, ce que j'essaie de réaliser est d'utiliser grep pour tirer toutes les lignes d'hier à partir d'un fichier journal, puisque chaque ligne dans le journal contient la date dans le format "Mon 01/02/2010".

Merci beaucoup

35
demandé sur Wolph 2010-08-19 05:05:16

17 réponses

si vous avez Perl disponible (et votre date n'ont pas de fonctionnalités intéressantes comme la yesterday), vous pouvez utiliser:

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
11
répondu paxdiablo 2010-08-19 01:34:32
dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt
58
répondu polemon 2010-08-19 01:12:57

sous Linux, vous pouvez utiliser

date -d "-1 days" +"%a %d/%m/%Y"
40
répondu z1x2 2010-08-19 03:52:17

Vous pouvez utiliser la commande GNU date comme indiqué ci-dessous

prise en Date Dans le Passé

Pour obtenir de l'hier et le jour plus tôt, dans le passé, l'utilisation de la chaîne de jour il y a:

date --date='hier'

date --date='il y a 1 jour'

date --date='10 jours'

date --date='10 de la semaine'

date --date='10 il y a un mois'

date --date='10 an'

prise en Date Dans le Futur

Pour obtenir de demain et après-demain (demain+N) utiliser jour le mot de d'obtenir la date dans le futur comme suit:

date --date='demain'

date --date='1 jour'

date --date='10 jour'

date --date='10 semaine'

date --date='10 mois'

date --date='10 ans'

11
répondu ramit girdhar 2015-09-08 05:10:02

si vous êtes sur un Mac ou un BSD ou autre chose sans l'option -- date, vous pouvez utiliser:

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

mise à Jour: ou peut-être...

date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
8
répondu DigitalRoss 2010-08-19 16:02:04

j'ai le script shell sous Linux et le code suivant a fonctionné pour moi:

#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with  YYYYMMDD format
4
répondu jujuBee 2014-06-11 20:41:27

vous avez au moins 2 options

  1. Utiliser perl:

    perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
    
  2. Install GNU date (c'est dans le sh_utils package si je me souviens bien)

    date --date yesterday "+%a %d/%m/%Y" | read dt
    echo ${dt}
    
  3. Pas sûr si cela fonctionne, mais vous pourriez être en mesure d'utiliser un négatif fuseau horaire. Si vous utilisez un fuseau horaire qui est de 24 heures avant votre fuseau horaire actuel que vous pouvez simplement utiliser date.

3
répondu Wolph 2010-08-19 02:11:41

Voici un script ksh calculer la date précédente le premier argument, testé sur 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
2
répondu Jose Manuel Gomez Alvarez 2011-12-16 07:14:29

Essayez la méthode suivante:

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

il fonctionne à la fois sur Linux et OSX.

2
répondu kenorb 2014-05-15 15:41:16

Merci pour l'aide tout le monde, mais puisque je suis sur HP-UX (après tout: plus vous payez, moins vous obtenez de fonctionnalités...) j'ai eu recours à perl:

perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt
1
répondu Chris 2010-08-19 03:18:03

si votre installation HP-UX est équipée de Tcl, vous trouverez peut-être son arithmétique de date très lisible (malheureusement le shell Tcl N'a pas d'option "- e" comme perl):

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

cela réglera tous les problèmes de l'heure d'été.

1
répondu glenn jackman 2010-08-19 12:40:02

si vous n'avez pas une version de date qui supporte --yesterday et que vous ne voulez pas utiliser perl, vous pouvez utiliser ce script KSH très pratique. Par défaut, il retourne la date d'hier, mais vous pouvez lui donner un nombre et il vous indique la date que de nombreux jours dans le passé. Il commence à ralentir un peu si vous regardez loin dans le passé. Il y a 100 000 jours, c'était 1/30/1738, bien que mon système ait mis 28 secondes pour le découvrir.

    #! /bin/ksh -p

    t=`date +%j`
    ago=
    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\//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
répondu Ken Beer 2010-11-26 19:39:26

ksh93:

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

ou:

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

le premier fonctionne dans le même processus, le second dans un sous-puits.

1
répondu danlei 2013-03-15 15:25:39

Si vous avez accès à python, ceci est un helper qui obtiendra le yyyy-mm-dd valeur de date pour tout arbitraire n jours:

function get_n_days_ago {
  local days=
  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
1
répondu wuster 2014-08-25 03:48:19
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;

vous obtiendrez d'hier à AIX et la variable TZ retour à l'original

1
répondu santymano 2015-05-18 18:32:00

bien que toutes les bonnes réponses, malheureusement aucune n'a fonctionné pour moi. Alors j'ai dû écrire un truc de la vieille école. ( J'étais sur un minimum strict de système d'exploitation Linux )

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

vous pouvez combiner cela avec le formatage habituel de la date. Par exemple.

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

Explication : Prenez la date entrée en termes de secondes epoc (l'option-d ), à partir de laquelle vous auriez soustrait un jour équivalent secondes. Cela donnera la date de retour précisément un jour.

1
répondu Gautam 2018-04-07 17:49:58

Pour Hp-UX seulement en dessous de commande a fonctionné pour moi:

TZ=aaa24 date +%Y%m % d

vous pouvez l'utiliser comme :

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

echo $ydate

0
répondu Anvesh 2013-08-07 13:53:11