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

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

Marsh Posté le 31-03-2003 à 18:10:17    

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
Reply

Marsh Posté le 31-03-2003 à 18:10:17   

Reply

Marsh Posté le 31-03-2003 à 19:19:03    

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
Reply

Marsh Posté le 31-03-2003 à 19:48:26    

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
Reply

Marsh Posté le 01-04-2003 à 10:12:00    

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:

Reply

Marsh Posté le 01-04-2003 à 15:13:05    

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?

Reply

Marsh Posté le 01-04-2003 à 15:21:37    

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
Reply

Marsh Posté le 01-04-2003 à 16:05:21    

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

Reply

Marsh Posté le 01-04-2003 à 16:13:30    

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
Reply

Marsh Posté le 01-04-2003 à 16:19:23    

: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

Reply

Marsh Posté le 01-04-2003 à 16:26:01    

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
Reply

Marsh Posté le 01-04-2003 à 16:26:01   

Reply

Marsh Posté le 01-04-2003 à 16:36:48    

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:  :??:

Reply

Marsh Posté le 01-04-2003 à 16:44:04    

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...

Reply

Marsh Posté le 01-04-2003 à 16:47:04    

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 !!

Reply

Marsh Posté le 01-04-2003 à 16:49:27    

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

Reply

Marsh Posté le 01-04-2003 à 16:52:50    

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

Reply

Marsh Posté le 01-04-2003 à 16:57:36    

mais sans passer par une variable ca marche nickel :
 

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

Reply

Marsh Posté le 01-04-2003 à 16:58:14    

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?

Reply

Marsh Posté le 01-04-2003 à 17:00:17    

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
 

Reply

Marsh Posté le 01-04-2003 à 17:06:06    

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
Reply

Marsh Posté le 01-04-2003 à 17:10:27    

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
Reply

Marsh Posté le 01-04-2003 à 17:14:01    

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 {}

Reply

Marsh Posté le 01-04-2003 à 17:16:40    

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) ?

Reply

Marsh Posté le 01-04-2003 à 17:20:13    

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.

Reply

Marsh Posté le 01-04-2003 à 17:25:07    

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

Reply

Marsh Posté le 01-04-2003 à 17:27:25    

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 :??:

Reply

Marsh Posté le 01-04-2003 à 17:31:01    

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

Reply

Marsh Posté le 01-04-2003 à 17:33:56    

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

Reply

Marsh Posté le 01-04-2003 à 17:34:49    

bobuse a écrit :


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


 
Ben donc il interprete tout mais mal :)

Reply

Marsh Posté le 01-04-2003 à 17:37:34    

Doum a écrit :


 
Ben donc il interprete tout mais mal :)


 [:spamafote]  
je jete l'eponge !

Reply

Marsh Posté le 01-04-2003 à 17:38:14    

bobuse a écrit :


 [:spamafote]  
je jete l'eponge !


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

Reply

Marsh Posté le 02-04-2003 à 09:16:43    

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

Reply

Marsh Posté le 02-04-2003 à 09:28:33    

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.

Reply

Marsh Posté le 02-04-2003 à 09:39:24    

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...

Reply

Marsh Posté le 02-04-2003 à 09:47:33    

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

Reply

Marsh Posté le 02-04-2003 à 09:50:45    

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

Reply

Marsh Posté le 02-04-2003 à 12:15:57    

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...?

Reply

Marsh Posté le 02-04-2003 à 12:34:19    

C'est bon j'ai trouvé

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed