scripts script pasar parametros manejo español ejemplos comandos cadenas unix datetime shell ksh hp-ux

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

  1. Use perl:

    perl -e ''@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)''

  2. Instalar la fecha GNU (está en el paquete sh_utils si no recuerdo sh_utils )

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

  3. 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