¿Cómo analizarías una fecha en bash, con campos separados (años, meses, días, horas, minutos, segundos) en diferentes variables?Fecha del análisis en Bash
El formato de fecha es: YYYY-MM-DD hh:mm:ss
¿Cómo analizarías una fecha en bash, con campos separados (años, meses, días, horas, minutos, segundos) en diferentes variables?Fecha del análisis en Bash
El formato de fecha es: YYYY-MM-DD hh:mm:ss
qué tiene que ser fiesta? Puede utilizar la GNU coreutils /bin/date
binario para muchas transformaciones:
$ date --date="2009-01-02 03:04:05" "+%d %B of %Y at %H:%M and %S seconds"
02 January of 2009 at 03:04 and 05 seconds
Este análisis sintáctico de la fecha dada y lo muestra en el formato elegido. Puede adaptar eso a voluntad a sus necesidades.
$ t='2009-12-03 12:38:15'
$ a=(`echo $t | sed -e 's/[:-]/ /g'`)
$ echo ${a[*]}
2009 12 03 12 38 15
$ echo ${a[3]}
12
sin necesidad de llamar al comando externo – ghostdog74
¿Ha intentado utilizar el corte? algo como esto: dayofweek = date|cut -d" " -f1
Eso solo separa la fecha y la hora, no cada parte individualmente. –
Bash puro:
date="2009-12-03 15:35:11"
saveIFS="$IFS"
IFS="- :"
date=($date)
IFS="$saveIFS"
for field in "${date[@]}"
do
echo $field
done
2009
12
03
15
35
11
No es necesario usar matrices aquí. Solo 'configure la fecha $ de basura; shift' en lugar de 'date = ($ date)' y 'for field' en lugar del loop de la matriz. Esa sería una versión de 'pure sh', ¡que es aún mejor! – Idelic
otra fiesta pura
$ d="2009-12-03 15:35:11"
$ d=${d//[- :]/|}
$ IFS="|"
$ set -- $d
$ echo $1
2009
$ echo $2
12
$ echo [email protected]
2009 12 03 15 35 11
El método de matriz es tal vez mejor, pero esto es lo que pedían específicamente para:
IFS=" :-"
read year month day hour minute second < <(echo "YYYY-MM-DD hh:mm:ss")
Me gusta esto mejor. Un atajo, que tampoco cambia permanentemente IFS: 'IFS =": - "leer Y M D h m s <<<" AAAA-MM-DD hh: mm: ss "' – ephemient
Esto es sencillo, basta con convertir sus guiones y dos puntos de un espacio (sin necesidad de cambiar IFS) y el uso de 'leer' todo en una línea:
read Y M D h m s <<< ${date//[-:]/ }
Por ejemplo:
$ date=$(date +'%Y-%m-%d %H:%M:%S')
$ read Y M D h m s <<< ${date//[-: ]/ }
$ echo "Y=$Y, m=$m"
Y=2009, m=57
lugar de utilizar el shell scripting, incorporar en su propio scripting, como a continuación wheever que necesita:
a=date +%Y
b=date +%S
c=date +%H
un año habrá b será segundo C será hora. y así.
Otra solución al problema de la OP:
IFS=' -:' read y m d h m s<<<'2014-03-26 16:36:41'
La conversión de una fecha a otro formato con BSD date
y GNU date
:
$ LC_ALL=C date -jf '%a %b %e %H:%M:%S %Z %Y' 'Wed Mar 26 16:36:41 EET 2014' +%F\ %T
2014-03-26 16:36:41
$ gdate -d 'Wed Mar 26 16:36:41 EET 2014' +%F\ %T
2014-03-26 16:36:41
GNU date
reconoce Wed
y Mar
incluso en la no Las configuraciones regionales en inglés pero BSD date
no.
conversión de segundos desde época a una fecha y hora con GNU fecha y BSD fecha:
$ gdate -d @1234567890 '+%F %T'
2009-02-14 01:31:30
$ date -r 1234567890 '+%F %T'
2009-02-14 01:31:30
conversión de segundos a horas, minutos y segundos con una cáscara POSIX, POSIX awk
, GNU date
, y BSD date
:
$ s=12345;printf '%02d:%02d:%02d\n' $((s/3600)) $((s%3600/60)) $((s%60))
05:25:45
$ echo 12345|awk '{printf "%02d:%02d:%02d\n",$0/3600,$0%3600/60,$0%60}'
05:25:45
$ gdate -d @12345 +%T
05:25:45
$ date -r 12345 +%T
05:25:45
conversión de segundos a días, horas, minutos y segundos:
$ t=12345678
$ printf '%d:%02d:%02d:%02d\n' $((t/86400)) $((t/3600%24)) $((t/60%60)) $((t%60))
142:21:21:18
Tenía un formato de tiempo de entrada diferente, así que aquí hay una solución más flexible. El comando para convertir las fechas en BSD/macOS es
date -jf in_format [+out_format] in_date
donde los formatos utilizan strftime (ver man strftime
).
Para el formato de entrada dado YYYY-MM-DD hh:mm:ss
:
$ date -jf '%Y-%m-%d %H:%M:%S' '2017-05-10 13:40:01'
Wed May 10 13:40:01 PDT 2017
para leerlos en variables separadas, estoy tomando la idea de la NVRAM, pero que le permite utilizar cualquier formato strftime:
$ date_in='2017-05-10 13:40:01'
$ format='%Y-%m-%d %H:%M:%S'
$ read y m d H M S <<< "$(date -jf "$format" '+%Y %m %d %H %M %S' "$date_in")"
$ for var in y m d H M S; do echo "$var=${!var}"; done
y=2017
m=05
d=10
H=13
M=40
S=01
En mi caso, quería convertir entre zonas horarias (consulte su directorio /usr/share/zoneinfo
para nombres de zona):
$ format=%Y-%m-%dT%H:%M:%S%z
$ TZ=UTC date -jf $format +$format 2017-05-10T02:40:01+0200
2017-05-10T00:40:01+0000
$ TZ=America/Los_Angeles date -jf $format +$format 2017-05-10T02:40:01+0200
2017-05-09T17:40:01-0700
¿Es esta una extensión de Linux? Ni FreeBSD ni Mac OSX parecen apoyarlo. –
Es viejo y simple fecha de GNU: fecha $ --version fecha (GNU coreutils) 7,4 Copyright (C) 2009 Free Software Foundation, Inc. licencia GPLv3 +: GNU GPL versión 3 o posterior. Este es software gratuito: puede cambiarlo y redistribuirlo. NO HAY GARANTÍA, en la medida permitida por la ley. Escrito por David MacKenzie. –
¿Por qué 'date --date =" \ 'date \' "' no funciona? – Luc