Vamos a suponer que necesito obtener fácilmente la fecha de hoy o de hace 7 días o hace 30, a través de un parámetro, y poder formatearla según la requiera. Por ejemplo, que debiéramos ejecutar un script que en el momento de la ejecución filtrara unos logs extrayendo únicamente las entradas correspondientes a los últimos 10 días.

Una buena forma es a través del siguiente script que incluye Perl. Se añaden comentarios para mayor claridad:

# Establecemos inicialmente a 0 la variable COUNT, que recorrerá
# desde hoy (0) hasta 10 días atrás (10)

COUNT=0
while [ $COUNT -lt 10 ]
do
# en la función localtime se restan a la hora de hoy (time) el producto entre los segundos que
# contiene un día y el número que contiene COUNT, pasado como parámetro y cogido por ARGV[0]
FECHA=`perl -e
‘@T=localtime(time-86400*$ARGV[0]);printf(“%1d/%1d/%02d”,$T[4]+1,$T[3],$T[5]+1900)’ $COUNT`
#FECHA=`perl -e
‘@T=localtime(time-86400*$ARGV[0]);printf(“%1d/%1d/%02d”,$T[3],$T[4]+1,$T[5]+1900)’ $COUNT`
#FECHA=`perl -e
‘@T=localtime(time-86400*$ARGV[0]);printf(“%1d”,$T[4]+1)’ $COUNT`
#FECHA=`perl -e
‘@T=localtime(time-86400*$ARGV[0]);printf(“%2d”,$T[3])’ $COUNT`

grep “$FECHA” archivo_de_log_o_archivos_de_logs > /dev/null COUNT=`/usr/bin/expr $COUNT + 1`
done

Como último punto, tener en cuenta que el array que devuelve localtime contiene las siguientes variables (eso explica el T[4], T[3],…):

0 – sec (segundos)
1 – min (minutos)
2 – hour (hora)
3 – mday (dia del mes)
4 – mon (mes)
5 – year (año)
6 – wday (dia de la semana)
7 – yday (número de dia respecto a todo el año)
8 – isdst (1 si estamos en horario de verano, 0 en horario de invierno, negativo si la información no está disponible)

El comando de ejemplo:

perl -e ‘@T=localtime(time-2*86400); printf(“%02d/%02d/%02d”,$T[3],$T[4]+1,($T[5]+1900)%100)’