Script shell scripting bash/Linux

Script shell scripting bash/Linux - Shell/Batch - Programmation

Marsh Posté le 03-12-2010 à 01:13:18    

Je souhaiterai créer un script (shell scripting - bash) qui devra manipuler des fichiers.  
J'ai deux dossiers nommés respectivement « Server » et « Printer ».
Le dossier Server contient trois fichiers à savoir : 2009-10-02.info , 2009-10-17.info et 2009-10-24.info.
 
Le fichier 2009-10-02.info contient comme information :
Elvis:10h30:"stopping apache2 server"
 
Costello:10h40:"updating DNS Database from DNS Server"
 
Parker:10h42:"stopping LDAP Server"
 
Costello:11h15:"restarting DNS Server"
 
Parker:23h43:"stopping DNS Server"
 
 
le fichier 2009-10-17.info le meme type d'information :
Elvis:8h20:"starting apache2 server"
 
Costello:10h10:"starting DNS Server"
 
Costello:13h20:"updating DNS Database from DNS Server"
 
Elvis:17h30:"stopping apache2 server"
 
Costello:18h00:"restarting DNS Server"
 
 
etc....
 
Le script va devoir traiter ces 3 fichiers puis générer un seul fichier « Server.info »
contenant toutes les informations de ces fichiers triés par
 
User ID. Ces fichiers devront ensuite être copiés dans le dossier passé en paramètre.
 
 
Fichier résultat Server.info après traitement : « par exemple »
101:2009-10-2:Elvis:10h30:"stopping apache2 server"
 
101:2009-10-17:Elvis:8h20:"starting apache2 server"
 
101:2009-10-17:Elvis:17h30:"stopping apache2 server"
 
102:2009-10-2:Costello:10h40:"updating DNS Database from DNS Server"
 
102:2009-10-2:Costello:11h15:"restarting DNS Server"
 
102:2009-10-17:Costello:10h10:"starting DNS Server"
 
102:2009-10-17:Costello:13h20:"updating DNS Database from DNS Server"
 
102:2009-10-17:Costello:18h00:"restarting DNS Server"
 
103:2009-10-2:Parker:10h42:"stopping LDAP Server"
 
103:2009-10-2:Parker:23h43:"stopping DNS Server"
 
 
Voilà...
Le User Id est celui du fichier et la date est récupéré à partir du nom du fichier.
 
Merci bien.


Message édité par yims1er le 03-12-2010 à 01:16:04
Reply

Marsh Posté le 03-12-2010 à 01:13:18   

Reply

Marsh Posté le 03-12-2010 à 10:44:31    

Je n'ai pas compris pourquoi tu parlais du répertoire printer, ni a quoi correspondent les 101,102,.. devant tes lignes.
 
En tout cas pour générer le Server.info, tu peux faire quelque chose du style :
 

Code :
  1. grep -H ".*" $REP/* | sort -t':' -k2 | sed "s%$REP/%%'


 
Le sed permet de supprimer le chemin dans l'affichage du nom de fichier. Peut-être qu'il existe un moyen plus élégant, mais comme ca je ne vois pas.
Par contre le sort tri sur le UserID, mais dans ton fichier exemple, les heures ne sont pas préfixées par un 0 quand elles sont inférieures à 10h, ce qui signifie que la ligne avec le 8h20 se trouvera après la ligne avec le 17h30.

Reply

Marsh Posté le 03-12-2010 à 19:31:58    

En fait j'ai juste prit le répertoire Printer pour généraliser une situation.....
Mais le répertoire Server avec ses exemples de fichiers rend le devoir plus clair.
101,102 représente le UserID de l'utilisateur.
La date est récupéré est à partir du fichier en question.
Merci

Reply

Marsh Posté le 03-12-2010 à 19:34:04    

Nukolau a écrit :

Je n'ai pas compris pourquoi tu parlais du répertoire printer, ni a quoi correspondent les 101,102,.. devant tes lignes.
 
En tout cas pour générer le Server.info, tu peux faire quelque chose du style :
 

Code :
  1. grep -H ".*" $REP/* | sort -t':' -k2 | sed "s%$REP/%%'


 
Le sed permet de supprimer le chemin dans l'affichage du nom de fichier. Peut-être qu'il existe un moyen plus élégant, mais comme ca je ne vois pas.
Par contre le sort tri sur le UserID, mais dans ton fichier exemple, les heures ne sont pas préfixées par un 0 quand elles sont inférieures à 10h, ce qui signifie que la ligne avec le 8h20 se trouvera après la ligne avec le 17h30.


________________________________________________
En fait j'ai juste prit le répertoire Printer pour généraliser une situation.....
Mais le répertoire Server avec ses exemples de fichiers rend le devoir plus clair.
101,102 représente le UserID de l'utilisateur.
La date est récupéré est à partir du fichier en question.
Merci

Reply

Marsh Posté le 05-12-2010 à 00:55:16    

ah ok c'est l'UID du fichier qui fait foi pas le nom de l'utilisateur contenu dans le fichier. Je comprends mieux ;)

 

Bah du coup, je ne vois pas comment éviter une boucle, un truc du genre :

 
Code :
  1. find $1 -type f -printf "%U %f\n" | sort -n | while read USER FILE
  2. do
  3.   for LINE in `cat $1/$FILE`
  4.   do
  5.     echo "$USER:$FILE:$LINE"
  6.   done
  7. done

Message cité 1 fois
Message édité par Nukolau le 05-12-2010 à 13:42:50
Reply

Marsh Posté le 15-12-2010 à 13:14:04    

Nukolau a écrit :

ah ok c'est l'UID du fichier qui fait foi pas le nom de l'utilisateur contenu dans le fichier. Je comprends mieux ;)
 
Bah du coup, je ne vois pas comment éviter une boucle, un truc du genre :
 

Code :
  1. find $1 -type f -printf "%U %f\n" | sort -n | while read USER FILE
  2. do
  3.   for LINE in `cat $1/$FILE`
  4.   do
  5.     echo "$USER:$FILE:$LINE"
  6.   done
  7. done



 
 
 
Merci!!!!

Reply

Sujets relatifs:

Leave a Replay

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