Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1504 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [shell]obtenir la date -1 (reconvertit en probleme de awk ;) )

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[shell]obtenir la date -1 (reconvertit en probleme de awk ;) )

n°348503
doum
Mentalita nissarda
Posté le 31-03-2003 à 18:10:17  profilanswer
 

Je dois faire un script shell qui retrouve dans un fichier log les lignes du jour precedent.Et je n'arrive pas a calculer a partir de la date du jour (date) la date du jour precedent.
 
Probleme de passage entre 2 mois/ entre 2 années (bissextile ou pas).
 
Sous Unix...
 
D'avance merci pour les pistes...


Message édité par doum le 02-04-2003 à 12:13:26
mood
Publicité
Posté le 31-03-2003 à 18:10:17  profilanswer
 

n°348531
bobuse
Posté le 31-03-2003 à 19:19:03  profilanswer
 

Doum a écrit :

Je dois faire un script shell qui retrouve dans un fichier log les lignes du jour precedent.Et je n'arrive pas a calculer a partir de la date du jour (date) la date du jour precedent.
 
Probleme de passage entre 2 mois/ entre 2 années (bissextile ou pas).
 
Sous Unix...
 
D'avance merci pour les pistes...


Le plus simple a mon avis est de passer par un programme externe, parce que faire ca en shell ca doit etre galere  :(  
 
tu peux par exemple le faire en Java en utilisant la classe Date, enfin je dis ça, parce que j'ai dejà pratiquer et que ça se fait super facilement, mais parès ptet que ca se fait aussi en C ...


---------------
get amaroK plugin
n°348537
bobuse
Posté le 31-03-2003 à 19:48:26  profilanswer
 

Allez, tiens, je sais pas si ça peut t'aider, mais bon, ça me coutait vraiment rien :

Code :
  1. import java.util.Date;
  2. import java.util.Calendar;
  3. import java.util.Locale;
  4. import java.text.DateFormat;
  5. import java.text.ParseException;
  6. /*
  7. * Prend une date en paramètre et retourne cette meme date - 1 jour
  8. */
  9. public class DateMoinsUnJour {
  10.     public static void main(String[] args) {
  11.         if (args.length==0) {
  12.             System.exit(1);
  13.         }
  14.         Calendar cal=Calendar.getInstance();
  15.         // format de la date : court (par ex. dd/mm/yyyy)
  16.         DateFormat df=DateFormat.getDateInstance(DateFormat.SHORT,Locale.FRANCE);
  17.         // parsing de la date passée en argument
  18.         try {
  19.             cal.setTime(df.parse(args[0]));
  20.         } catch (ParseException e) {
  21.             // date mal formée
  22.             System.exit(1);
  23.         }
  24.         // on retire un jour
  25.         cal.add(Calendar.DATE,-1);
  26.         // et on affiche le résultat
  27.         System.out.println(df.format(cal.getTime()));
  28.     }
  29. }

 
J'ai supposé que ta date était au format court (du genre 31/03/2003), mais ça marche aussi avec un format un peu plus long, il suffit de remplacer le SHORT par MEDIUM voire LONG.


---------------
get amaroK plugin
n°348801
doum
Mentalita nissarda
Posté le 01-04-2003 à 10:12:00  profilanswer
 

Merci, mais probleme, je peux pas utilisé de java donc faut que je le passe en C, y'a t il un equivalent en C de la fonction:
 

Code :
  1. cal.add(Calendar.DATE,-1);


 
Parceque je peux obtenir la date du jour facilement mais pour soustraire un jour :sweat:

n°349226
doum
Mentalita nissarda
Posté le 01-04-2003 à 15:13:05  profilanswer
 

Bon nouveau gros probleme.J'ai fais la meme chose que toi mais en C:
 

Code :
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <locale.h>
  4. int main()
  5. {
  6. char ch[80+1];
  7. struct tm * dh1;
  8. time_t intps;
  9. intps = time(NULL);
  10. intps = intps - (24*3600);
  11. dh1 = localtime (&intps);
  12. strftime( ch, 81, "%d.%m.%Y",dh1);
  13. printf("%s",ch);
  14. }


 
Par contre impossible de recuperer la valeur...
 
Comment l'utiliser dans un grep par exemple?

n°349235
doum
Mentalita nissarda
Posté le 01-04-2003 à 15:21:37  profilanswer
 

En fait je redirige la sortie standard de mon prog dans un fichier...le fichier contient donc la valeur de la date d'hier.
 
Comment utiliser cette valeur contenue dans le fichier avec un grep? Je vois pas.
 
EDIT: pour que vous situiez mieux l'affaire, j'aurai besoin de faire ca:
 
cat <unfichier> | grep "contenu d'un autre fichier"
 
comment obtenir le contenu de cet autre fichier?


Message édité par doum le 01-04-2003 à 15:57:03
n°349291
bobuse
Posté le 01-04-2003 à 16:05:21  profilanswer
 

et pourquoi tu stocke le resultat dans un fichier ?
 
moi je verrai plutot :
 grep 'dateMoinsUn ${taDate}' "contenu d'un autre fichier"  
 
sinon, si tu veux vraiment passer par un fichier
 
grep 'cat <unfichier>' "contenu d'un autre fichier"
 
enfin un truc du genre quoi

n°349303
doum
Mentalita nissarda
Posté le 01-04-2003 à 16:13:30  profilanswer
 

bobuse a écrit :


 
grep 'cat <unfichier>' "contenu d'un autre fichier"
 
enfin un truc du genre quoi


 
Je stocke le resultat dans un fichier parceque j'arrive pas a faire un return dans le programme C, je fais donc un printf que je redirige dans un fichier.
 
Ensuite le grep 'cat <unfichier>' "contenu d'un autre fichier"
ne marche pas. Apparement le grep ne peut pas executer le cat...
 
Sinon j'ai pas compris ta premiere proposition


Message édité par doum le 01-04-2003 à 16:13:47
n°349313
bobuse
Posté le 01-04-2003 à 16:19:23  profilanswer
 

:heink:  
le return du main en C, c'est pour les codes d'erreur, hein ?
 
si tu fais printf("%s",taDate) a la fin de prog, et ben ca te retourne la valeur voulue ;)  
 
donc en faisant :  
 grep `dateMoinsUn ${taDate}` "contenu d'un autre fichier"
le shell va d'abord evaluer la chaine entre `` (je m'etait trompe de quote dans mes posts ;) ), donc il fera :
grep ${taNouvelleDate} tonFichier

n°349330
doum
Mentalita nissarda
Posté le 01-04-2003 à 16:26:01  profilanswer
 

bobuse a écrit :

:heink:  
le return du main en C, c'est pour les codes d'erreur, hein ?
 
Exact
 
si tu fais printf("%s",taDate) a la fin de prog, et ben ca te retourne la valeur voulue ;)  
C'est exactement ce que je fais, mais la ca me l'affiche, je peux pas la reutiliser.
 
donc en faisant :  
 grep `dateMoinsUn ${taDate}` "contenu d'un autre fichier"
le shell va d'abord evaluer la chaine entre `` (je m'etait trompe de quote dans mes posts ;) ), donc il fera :
grep ${taNouvelleDate} tonFichier
 
J'en reve mais ca ne marche pas
En gros quand je tape grep 31.03.03 <fichier> ca marche mais si je tape grep `dateMoinsUn ${taDate}` "contenu d'un autre fichier"
ca ne marche pas, il ne doit pas evaluer correctement le dateMoinsUn ${taDate}



Message édité par doum le 01-04-2003 à 16:26:13
mood
Publicité
Posté le 01-04-2003 à 16:26:01  profilanswer
 

n°349345
bobuse
Posté le 01-04-2003 à 16:36:48  profilanswer
 

heu je vois pas le pb :
voila ce que j'ai fait :
copier-coller de ton source C (qui n'a pas l'air de fiare ce que tu veux, mais bon, je suppose que tu y travaille ;) ) :
 

Code :
  1. #include <stdio.h>
  2.   #include <time.h>
  3.   #include <locale.h>
  4.  
  5.   int main()
  6.   {
  7.     char ch[80+1];
  8.     struct tm * dh1;
  9.     time_t intps;
  10.    
  11.     intps = time(NULL);
  12.     intps = intps - (24*3600);
  13.     dh1 = localtime (&intps);
  14.     strftime( ch, 81, "%d.%m.%Y",dh1);
  15.     printf("%s",ch);
  16.   }

 
 
et apres j'ai créé un fichier test.txt qui contient la ligne :
31.03.2003 truc
et puis :
 


%gcc tmp.c
%./a.out 24.03.2003
31.03.2003
%grep `./a.out 24.03.2003` test.txt
31.03.2003 truc
 
 

 :heink:  :??:

n°349362
doum
Mentalita nissarda
Posté le 01-04-2003 à 16:44:04  profilanswer
 

attends on s'est pas compris je crois :)
 
Mon prog il te dis la date d'hier...par rapport a la date systeme.
 
Ensuite il l'affiche.
 
Alors ce que je fais c'est:
 
tmp=`datehier`
echo $tmp
31.03.03   donc jusque la tout va bien.
 
Ensuite faut que j'utilise cette date dans un grep
 
En gros grep $tmp "fichier"
 
Mais  ca marche pas...

n°349365
bobuse
Posté le 01-04-2003 à 16:47:04  profilanswer
 

Doum a écrit :

attends on s'est pas compris je crois :)
 
Mon prog il te dis la date d'hier...par rapport a la date systeme.
 
Ensuite il l'affiche.
 
Alors ce que je fais c'est:
 
tmp=`datehier`
echo $tmp
31.03.03   donc jusque la tout va bien.
 
Ensuite faut que j'utilise cette date dans un grep
 
En gros grep $tmp "fichier"
 
Mais  ca marche pas...


Ha ok  ;) Ca roule !
 
mais pour le grep, je vois pas, chez moi ca marche tres bien !!

n°349369
doum
Mentalita nissarda
Posté le 01-04-2003 à 16:49:27  profilanswer
 

Moi le grep ne marche pas...et je comprends pas pourquoi...

n°349376
bobuse
Posté le 01-04-2003 à 16:52:50  profilanswer
 

Ha ok, dans le shell, ca marche, mais en SH, ca marche po ;)
 
en fait le grep cherche a interpreter une regexp !
Ben faut passer la variable dans un sed pour mettre des meta-caracteres je pense

n°349387
bobuse
Posté le 01-04-2003 à 16:57:36  profilanswer
 

mais sans passer par une variable ca marche nickel :
 

#!/bin/sh
/usr/bin/grep `./a.out` test.txt

n°349389
doum
Mentalita nissarda
Posté le 01-04-2003 à 16:58:14  profilanswer
 

bobuse a écrit :

Ha ok, dans le shell, ca marche, mais en SH, ca marche po ;)
 
en fait le grep cherche a interpreter une regexp !
Ben faut passer la variable dans un sed pour mettre des meta-caracteres je pense


 
Pas bete le coup des regexp...par contre je passe comment dans un sed?

n°349392
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:00:17  profilanswer
 

bobuse a écrit :

mais sans passer par une variable ca marche nickel :
 

#!/bin/sh
/usr/bin/grep `./a.out` test.txt

 


 
Non pas chez moi :( malheureusement
 

n°349399
bobuse
Posté le 01-04-2003 à 17:06:06  profilanswer
 

attends, a force de torturer mon script, je suis arrivé a :
 

#!/bin/sh
truc=`./a.out`
echo $truc
grep ${truc} test.txt

 
 
et ca marche !
Je sais meme plus ce que j'ai changé !
 
EDIT : ha ok un espace dans truc=`./a.out` apres le '=' :/


Message édité par bobuse le 01-04-2003 à 17:07:42
n°349410
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:10:27  profilanswer
 

J'ai fait la meme chose que toi:
 
script:


#!/bin/sh
datehier=`calcyesterday`
echo $datehier
grep $(datehier) $TSMCLI/dsmsched.log


 
et ca donne ca:
 
xxx$test.sh
31.03.2003
test.sh[3]: datehier:  introuvable.
 
Obligé de faire CTRL+C derriere


Message édité par doum le 01-04-2003 à 17:11:17
n°349416
bobuse
Posté le 01-04-2003 à 17:14:01  profilanswer
 

Doum a écrit :

J'ai fait la meme chose que toi:
 
script:


#!/bin/sh
datehier=`calcyesterday`
echo $datehier
grep $(datehier) $TSMCLI/dsmsched.log


 
et ca donne ca:
 
xxx$test.sh
31.03.2003
test.sh[3]: datehier:  introuvable.
 
Obligé de faire CTRL+C derriere


heu ca marche $(variable) ( avec des parentheses), moi, j'utilise que des accolades {}

n°349420
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:16:40  profilanswer
 

bobuse a écrit :


heu ca marche $(variable) ( avec des parentheses), moi, j'utilise que des accolades {}


 
Si j'ai compris ta phrase, parceque j'en suis pas sur :), j'ai remplacé les parentheses par des accolades et ca marche tjs pas.
 
${variable} au lieu de $(variable) ?

n°349424
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:20:13  profilanswer
 

Je sais pas si ca peut t'aider mais si en dehors du script je fais:
 
echo $tmp -> ca affiche bien 31.03.03
${tmp} -> ksh: 31.03.2003:  introuvable.
$(tmp) -> ksh: tmp:  introuvable.

n°349426
bobuse
Posté le 01-04-2003 à 17:25:07  profilanswer
 

rajoute un "set +x" au debut de ton script .... :( mais bon, la je commence a desesperer ...

n°349429
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:27:25  profilanswer
 

Putain le bug, en gros le fichier que je dois analyser c'est un log de sauvegarde de fichier...y'a donc un bon paquet de ligne qui commencent toutes par la date (actuellement du 25.03.03 au 31.03.03).
 
Le but est que le grep garde que celle du 31.03.03
 
Ca marche pas.
 
Par contre si je fais ca:  
grep -v ${datehier} $TSMCLI/dsmsched.log
 
La il m'affiche toutes les lignes du log, y compris celles qui contiennent le 31.03.03 :??:

n°349434
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:31:01  profilanswer
 

bobuse a écrit :

rajoute un "set +x" au debut de ton script .... :( mais bon, la je commence a desesperer ...


 
Si je mets set +x (je sais pas pourquoi mais si tu le dis)
il m'affiche tout le fichier log mais sans "trier" les bonnes lignes

n°349438
bobuse
Posté le 01-04-2003 à 17:33:56  profilanswer
 

Doum a écrit :


 
Si je mets set +x (je sais pas pourquoi mais si tu le dis)
il m'affiche tout le fichier log mais sans "trier" les bonnes lignes


Le set +x sert a afficher ce que le shell interprete

n°349440
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:34:49  profilanswer
 

bobuse a écrit :


Le set +x sert a afficher ce que le shell interprete


 
Ben donc il interprete tout mais mal :)

n°349447
bobuse
Posté le 01-04-2003 à 17:37:34  profilanswer
 

Doum a écrit :


 
Ben donc il interprete tout mais mal :)


 [:spamafote]  
je jete l'eponge !

n°349448
doum
Mentalita nissarda
Posté le 01-04-2003 à 17:38:14  profilanswer
 

bobuse a écrit :


 [:spamafote]  
je jete l'eponge !


 
Nonnnnnnnnnnnnnnnnnnnnnnnnnnnnnn au secours :cry:  
 
 :hello: merci quand meme, tu m'as bien aidé

n°349725
doum
Mentalita nissarda
Posté le 02-04-2003 à 09:16:43  profilanswer
 

Up...si quelqu'un passe par la et a une idée...

n°349746
KSauzeRK
Posté le 02-04-2003 à 09:28:33  profilanswer
 

Bizarre : j'ai essayé, et je vois pas pourquoi ca fonctionnerait pas.
 

Code :
  1. bla=`date +%d.%m.%y`
  2. echo $bla
  3. grep $bla t


 
Ca me sort les bonnes lignes. J'utilise ksh.
 
Juste pour info, si mes souvenirs sont bons :
 
-> Les parenthèses servent à l'exécution d'une commande, comme `` (il doit y'avoir une différence, je crois que ca n'est pas strictement équivalent). Donc $(ls -l /usr) ca équivaut à `ls -l /usr`
 
-> Les accolades servent juste à isoler le nom de la variable pour plus de lisibilité, ou pour résoudre des ambiguités :  
date=`date +%d%m%y`
date_rep2=020303
ex : ls -l /rep1/${date}_rep2/rep3 <= permet de dire que c'est bien la variable $date que tu veux utiliser.

n°349761
doum
Mentalita nissarda
Posté le 02-04-2003 à 09:39:24  profilanswer
 

KSauzeRK a écrit :

Bizarre : j'ai essayé, et je vois pas pourquoi ca fonctionnerait pas.
 

Code :
  1. bla=`date +%d.%m.%y`
  2. echo $bla
  3. grep $bla t


 
Ca me sort les bonnes lignes. J'utilise ksh.
 
Juste pour info, si mes souvenirs sont bons :
 
-> Les parenthèses servent à l'exécution d'une commande, comme `` (il doit y'avoir une différence, je crois que ca n'est pas strictement équivalent). Donc $(ls -l /usr) ca équivaut à `ls -l /usr`
 
-> Les accolades servent juste à isoler le nom de la variable pour plus de lisibilité, ou pour résoudre des ambiguités :  
date=`date +%d%m%y`
date_rep2=020303
ex : ls -l /rep1/${date}_rep2/rep3 <= permet de dire que c'est bien la variable $date que tu veux utiliser.
 


 
En fait je pense qu'on a un soucis au niveau de la re a recherché...dans la ligne du grep...
 
parceque si je tape:
 
grep -i traités <le fichier> ca marche
 
si je tape:
 
grep -i $datehier <le fichier> ca marche pas (j'ai essayé pas mal de possibilité pour la syntaxe du $datehier mais j'ai pas trouvé...je rappelle qu'on cherche par rapport au contenu de la variable datehier...

n°349780
doum
Mentalita nissarda
Posté le 02-04-2003 à 09:47:33  profilanswer
 

C'est bon je crois que je suis juste un gros connard :)
 
Je compare 2 truc different forcement il trouve rien :whistle:

n°349782
doum
Mentalita nissarda
Posté le 02-04-2003 à 09:50:45  profilanswer
 

C'est bon ca marche...merci a tous...

n°350027
doum
Mentalita nissarda
Posté le 02-04-2003 à 12:15:57  profilanswer
 

Now je veux faire ca:
 
 

# LIGNEDEBUT contient le numero de la premiere ligne a afficher
# LIGNEFIN contient le numero de la derniere ligne a afficher
 
awk ' NR == $LIGNEDEBUT , NR == $LIGNEFIN { print $0 }' $TSMCLI/dsmsched.log


 
Et ca marche pas, il me dit:
 

awk : 0602-562 Zone $() incorrecte.
 Numéro de ligne en entrée : 1. Fichier: /usr/tivoli/tsm/client/ba/bin/dsmsched.log.
 Numéro de ligne source : 1.


 
Une idée...?

n°350045
doum
Mentalita nissarda
Posté le 02-04-2003 à 12:34:19  profilanswer
 

C'est bon j'ai trouvé

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [shell]obtenir la date -1 (reconvertit en probleme de awk ;) )

 

Sujets relatifs
[PHP] probleme avec la fonction date()[C] Problème de getc dans une boucle
pop-up problèmeComment faire pour ecrire dans la base mysql la date a la française ?
[Collection] Compilation ok mais execution probleme![PHP] Problème simple de fonctions
Probleme builder 5: dll et windows XPProblème de téléchargement du JDK1.4 de SUN
[CSS & DIV] Problème de placement 
Plus de sujets relatifs à : [shell]obtenir la date -1 (reconvertit en probleme de awk ;) )


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR