unix - pasar - shell script linux español
En un shell unix, ¿cómo incluir la fecha de ayer en una variable? (17)
Tengo un script de shell que hace lo siguiente para almacenar la fecha del día actual en una variable ''dt'':
date "+%a %d/%m/%Y" | read dt
echo ${dt}
¿Cómo voy a obtener la fecha de ayer en una variable?
Básicamente, lo que intento lograr es utilizar grep para extraer todas las líneas de ayer de un archivo de registro, ya que cada línea en el registro contiene la fecha en formato "Lun 01/02/2010".
Muchas gracias
A pesar de todas las buenas respuestas, desafortunadamente ninguno de ellos funcionó para mí. Entonces tuve que escribir algo de la vieja escuela. (Estaba en un mínimo sistema operativo Linux)
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )
Puede combinar esto con el formato habitual de la fecha. P.ej.
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d
Explicación: Tome la entrada de fecha en términos de epoc segundos (la opción -d), de la cual restaría un día segundos equivalentes. Esto dará la fecha precisamente un día atrás.
Aquí hay una secuencia de comandos ksh para calcular la fecha anterior del primer argumento, probado en 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
Pruebas
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
En Linux, puedes usar
date -d "-1 days" +"%a %d/%m/%Y"
Gracias por ayudar a todos, pero dado que estoy en HP-UX (después de todo, cuanto más pagas, menos funciones obtienes ...) tuve que recurrir a Perl:
perl -e ''@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)'' | read dt
Para Hp-UX, solo debajo del comando funcionó para mí:
TZ = aaa24 fecha +% Y% m% d
puedes usarlo como:
ydate = `TZ = aaa24 date +% Y% m% d`
echo $ ydate
Pruebe el siguiente método:
dt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
echo $dt
Funciona tanto en Linux como en OSX.
Si está en una Mac o BSD u otra cosa sin la opción --date, puede usar:
date -r `expr /`date +%s/` - 86400` ''+%a %d/%m/%Y''
Actualización : o tal vez ...
date -r $((`date +%s` - 86400)) ''+%a %d/%m/%Y''
Si no tiene una versión de fecha que admita - ayer y no desea usar Perl, puede utilizar este práctico script ksh. De forma predeterminada, devuelve la fecha de ayer, pero puede darle un número y le dice la fecha de muchos días en el pasado. Comienza a disminuir un poco si estás mirando hacia atrás en el pasado. Hace 100,000 días era 1/30/1738, aunque mi sistema tardó 28 segundos en darse cuenta.
#! /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
Si su instalación HP-UX tiene Tcl instalado, puede encontrar que la aritmética de la fecha es muy legible (desafortunadamente, el shell Tcl no tiene una buena opción "-e" como perl):
dt=$(echo ''puts [clock format [clock scan yesterday] -format "%a %d/%m/%Y"]'' | tclsh)
echo "yesterday was $dt"
Esto manejará todo el horario de verano.
Si tiene Perl disponible (y su date
no tiene características agradables como yesterday
), puede usar:
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
Si tiene acceso a python
, este es un helper que obtendrá el valor de la fecha yyyy-mm-dd
para cualquier arbitrario n
días atrás:
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
Tengo script de shell en Linux y el siguiente código funcionó para mí:
#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with YYYYMMDD format
Tienes al menos 2 opciones
Use perl:
perl -e ''@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)''
Instalar la fecha GNU (está en el paquete
sh_utils
si no recuerdosh_utils
)date --date yesterday "+%a %d/%m/%Y" | read dt echo ${dt}
No estoy seguro de si esto funciona, pero es posible que pueda utilizar una zona horaria negativa. Si usa una zona horaria 24 horas antes de su zona horaria actual, puede usar la
date
.
ksh93:
dt=${ printf "%(%a %d/%m/%Y)T" yesterday; }
o:
dt=$(printf "%(%a %d/%m/%Y)T" yesterday)
El primero se ejecuta en el mismo proceso, el segundo en una subshell.
Puede usar el comando de fecha GNU como se muestra a continuación
Getting Date en el pasado
Para obtener el día de ayer y el día anterior en el uso pasado de cadena hace:
date --date = ''ayer''
date --date = ''1 día atrás''
date --date = ''10 day ago ''
date --date = ''10 semana atrás ''
date --date = ''10 month ago ''
date --date = ''10 años atrás ''
Getting Date en el futuro
Para obtener mañana y pasado mañana (mañana + N) use la palabra día para obtener la fecha en el futuro de la siguiente manera:
date --date = ''tomorrow''
date --date = ''1 día''
date --date = ''10 day ''
date --date = ''10 week ''
date --date = ''10 month ''
date --date = ''10 año ''
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;
Te conseguirá ayer en AIX y volverá a establecer la variable TZ en original
dt=$(date --date yesterday "+%a %d/%m/%Y")
echo $dt