Comment analyser une date dans bash, avec des champs séparés (années, mois, jours, heures, minutes, secondes) en différentes variables?Parse Date dans Bash
Le format de date est: YYYY-MM-DD hh:mm:ss
Comment analyser une date dans bash, avec des champs séparés (années, mois, jours, heures, minutes, secondes) en différentes variables?Parse Date dans Bash
Le format de date est: YYYY-MM-DD hh:mm:ss
-t-il être bash? Vous pouvez utiliser le coreutils GNU /bin/date
binaire pour de nombreuses transformations:
$ 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
Cette parse la date indiquée et il affiche dans le format choisi. Vous pouvez adapter cela à volonté à vos besoins.
$ 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
pas besoin d'appeler la commande externe – ghostdog74
avez-vous essayé d'utiliser couper? quelque chose comme ceci: dayofweek = date|cut -d" " -f1
Cela sépare seulement la date et l'heure, pas chaque partie individuellement. –
Bash pur:
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
Pas besoin d'utiliser des tableaux ici. Juste 'set junk $ date; shift' au lieu de 'date = ($ date)' et 'for field' au lieu de la boucle du tableau. Ce serait une version "pure sh", ce qui est encore mieux! – Idelic
un autre bash pur
$ 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
La méthode de tableau est peut-être mieux, mais c'est ce que vous spécifiquement demandez:
IFS=" :-"
read year month day hour minute second < <(echo "YYYY-MM-DD hh:mm:ss")
J'aime ça le mieux. Un raccourci, qui ne change pas non plus de façon permanente IFS: 'IFS =": - "lire Y M D h m s <<<" AAAA-MM-JJ hh: mm: ss "' – ephemient
Ceci est simple, il suffit de convertir vos traits et deux points à un espace (pas besoin de changer IFS) et utiliser « lire » sur une seule ligne:
read Y M D h m s <<< ${date//[-:]/ }
Par exemple:
$ 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
au lieu d'utiliser la les scripts shell, incorporer dans votre script lui-même comme ci-dessous wheever dont vous avez besoin:
a=date +%Y
b=date +%S
c=date +%H
un sera l'année b sera secondes c sera heures. etc.
Une autre solution au problème de l'OP:
IFS=' -:' read y m d h m s<<<'2014-03-26 16:36:41'
Conversion d'une date à un autre format avec BSD date
et 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
reconnaît Wed
et Mar
même non Les locales anglaises mais BSD date
ne fait pas.
Conversion secondes depuis l'époque à une date et l'heure avec la date GNU et la date BSD:
$ gdate -d @1234567890 '+%F %T'
2009-02-14 01:31:30
$ date -r 1234567890 '+%F %T'
2009-02-14 01:31:30
Conversion secondes à plusieurs heures, minutes et secondes avec un shell POSIX, awk
Posix, GNU date
et 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
Conversion secondes jours, heures, minutes et secondes:
$ t=12345678
$ printf '%d:%02d:%02d:%02d\n' $((t/86400)) $((t/3600%24)) $((t/60%60)) $((t%60))
142:21:21:18
J'avais un format d'heure d'entrée différent, donc voici une solution plus flexible. La commande pour convertir les dates dans BSD/macOS est
date -jf in_format [+out_format] in_date
où les formats utilisent strftime (voir man strftime
).
Pour le format d'entrée donné 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
les lire en variables distinctes, je prends l'idée de NVRAM, mais vous permettant d'utiliser tous les formats 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
Dans mon cas, je voulais convertir entre les fuseaux horaires (voir votre répertoire /usr/share/zoneinfo
pour les noms de zone):
$ 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
Est-ce une extension Linux? Ni FreeBSD ni Mac OSX ne semblent le supporter. –
Il est vieux Date GNU simple: Date Date $ --version (GNU coreutils) 7.4 Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3 +: GNU GPL version 3 ou version ultérieure. Ceci est un logiciel libre: vous êtes libre de le modifier et de le redistribuer. Il n'y a AUCUNE GARANTIE, dans la mesure permise par la loi. Écrit par David MacKenzie. –
Pourquoi 'date --date =" \ 'date \' "" ne fonctionne-t-il pas? – Luc