Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplacer le format d'une date

Sujet résolu
    21 mai 2015 à 11:33:07

    Bonjour, j'aimerais écrire un script permettant pour chaque ligne d'un fichier de modifier le format de la date.

    exemple passer de :

    xxx [06/Apr/2015:15:34:30 +0200] xxx

     A:

    xxx [2015-04-06 15:34:30] xxx

     Ou juste rajouter la date au nouveau format sans la remplacer:

    [2015-04-06 15:34:30] ; xxx [06/Apr/2015:15:34:30 +0200] xxx

    Des idées sur la méthode à employer ?

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2015 à 12:10:35

      Je viens d'écrire ça

      #! /bin/bash
      
      if [ $# -ne 1 ] ;
      then
      	echo " Usage : " $0 " 'file'"
      	exit
      fi
      
      file=$1
      
      while read line
      do
      	IFS='[' read -a array <<< "$line"
      	str="${array[1]}"
      	IFS=']' read -a array <<< "$str"
      	str="${array[0]}"
      	IFS=' ' read -a array <<< "$str"
      	str="${array[0]}"
      	IFS=':' read -a array <<< "$str"
      	oldDate="${array[0]}"
      	hour="${array[1]}"
      	min="${array[2]}"
      	sec="${array[3]}"
      	IFS='/' read -a array <<< "$oldDate"
      	day="${array[0]}"
      	month="${array[1]}"
      	year="${array[2]}"
      	case "$month" in
      		"Jan")
      			month="01"
      			;;
      		"Feb")
      			month="02"
      			;;
      		"Mar")
      			month="03"
      			;;
      		"Apr")
      			month="04"
      			;;
      		"May")
      			month="05"
      			;;
      		"June")
      			month="06"
      			;;
      		"July")
      			month="07"
      			;;
      		"Aug")
      			month="08"
      			;;
      		"Sept")
      			month="09"
      			;;
      		"Oct")
      			month="10"
      			;;
      		"Nov")
      			month="11"
      			;;
      		"Dec")
      			month="12"
      			;;
      	esac
      	newDate="$year-$month-$day $hour:$min:$sec"
      	echo "$newDate"
      done < $file > newFile

      J'imagine qu'il y a plus simple et plus rapide ? Sachant qu'il faut que je fasse ça pour chaque champs de chaque ligne et pas que la date

      Edit: pour les autre champs c'est par exemple : "GET ip:port ..." a passer en method="GET" ip="ip" port="port"

      -
      Edité par Masttest 21 mai 2015 à 13:08:57

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2015 à 13:59:34

        Bonjour,

        La commande produisant la date au format souhaité est la suivante :

        date +"[%Y-%m-%d %H:%M:%S]" 

        Le script devrait en être nettement simplifié ;)

        Pour plus d'infos :

        man date

         EDIT : manifestement, je ne sais pas lire une question. Désolé.

        -
        Edité par Ealhad 22 mai 2015 à 13:32:46

        • Partager sur Facebook
        • Partager sur Twitter
        "Arch Linux, ça pète" © Ealhad, 2015.
          21 mai 2015 à 14:33:44

          Ealhad a écrit:

          Bonjour,

          La commande produisant la date au format souhaité est la suivante :

          date +"[%Y-%m-%d %H:%M:%S]" 

          Le script devrait en être nettement simplifié ;)

          Pour plus d'infos :

          man date

          -
          Edité par Ealhad il y a 30 minutes


          le problème c'est que cette commande donne la date actuelle moi ce que je veux c'est changer le format d'une autre date

          Edit: On vient de me conseiller d'utiliser timestamp, je n'ai jamais utilisé il faut que je regarde comment ça marche

          -
          Edité par Masttest 21 mai 2015 à 14:49:01

          • Partager sur Facebook
          • Partager sur Twitter
            21 mai 2015 à 17:52:55

            salut,

            $ str='xxx [06/Apr/2015:15:34:30 +0200] xxx yyy zzz'
            $ mois=( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec )
            $ declare -A M
            $ for m in "${mois[@]}"; do M[$m]=$((++n)); done
            $ IFS=' ]:[' read -a ar <<<"$str"
            $ IFS='/' read -a dt <<<"${ar[1]}"
            $ dt[1]=${M[${dt[1]}]}
            $ echo "${ar[0]} [$(IFS='/'; echo "${dt[*]}") ${ar[2]}:${ar[3]}:${ar[4]}] ${ar[@]:6}"
            xxx [06/4/2015 15:34:30] xxx yyy zzz



            • Partager sur Facebook
            • Partager sur Twitter

            Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

              22 mai 2015 à 9:24:27

              dantonq a écrit:

              salut,

              $ str='xxx [06/Apr/2015:15:34:30 +0200] xxx yyy zzz'
              $ mois=( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec )
              $ declare -A M
              $ for m in "${mois[@]}"; do M[$m]=$((++n)); done
              $ IFS=' ]:[' read -a ar <<<"$str"
              $ IFS='/' read -a dt <<<"${ar[1]}"
              $ dt[1]=${M[${dt[1]}]}
              $ echo "${ar[0]} [$(IFS='/'; echo "${dt[*]}") ${ar[2]}:${ar[3]}:${ar[4]}] ${ar[@]:6}"
              xxx [06/4/2015 15:34:30] xxx yyy zzz



              Merci, ca devrais être un peu mieux. Il va juste falloir que je modifie un peut ça car je crois qu'il me faut 04 (pour le reste du traitement) pour le mois et que 4 marchera pas

              Edit: ca devrait marcher même sans le 0 mais  juste pour l'affichage ca me fait bizarre parce que j'ai des fichier qui ont déjà le bon format de date (avec 0)

              Du coup j'ai rajouter ça

              if ((${dt[1]} < 10 )); then
              	dt[1]="0${dt[1]}"
              fi

              Edit 2: Mon script complet met entre 2min12 et 1min42 a traiter un fichier et avec ce changement pour la date le script traite le même fichier entre 2min2 et 1min42. Au final je vais garder ta version, elle est quand même plus lisible et en moyenne plus rapide que l'autre.

              -
              Edité par Masttest 22 mai 2015 à 10:15:36

              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2015 à 10:51:45

                ((${#M[${dt[1]}]}<2&&(c=0)))
                dt[1]=$c${M[${dt[1]}]}
                • Partager sur Facebook
                • Partager sur Twitter

                Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                  22 mai 2015 à 11:12:03

                  dantonq a écrit:

                  ((${#M[${dt[1]}]}<2&&(c=0)))
                  dt[1]=$c${M[${dt[1]}]}


                  Merci, ça a l'air de marcher bien que je ne comprends pas ce que ça fait ^^.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mai 2015 à 11:34:35

                    ^^ ça fait la même chose que ton if, mais en "écriture" arithmétique : si le nombre de chiffres est inférieur à 2, alors une variable c est créée valant 0 (zéro).

                    -
                    Edité par dantonq 22 mai 2015 à 11:35:01

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                      22 mai 2015 à 11:51:06

                      dantonq a écrit:

                      ^^ ça fait la même chose que ton if, mais en "écriture" arithmétique : si le nombre de chiffres est inférieur à 2, alors une variable c est créée valant 0 (zéro).

                      -
                      Edité par dantonq il y a 14 minutes


                      Ok merci
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Remplacer le format d'une date

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown