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
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
sous Linux, vous pouvez utiliser
date -d "-1 days" +"%a %d/%m/%Y"
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'
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'
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
vous avez au moins 2 options
Utiliser perl:
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
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}
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
.
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
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.
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
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é.
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
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.
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
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;
vous obtiendrez d'hier à AIX et la variable TZ retour à l'original
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.
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