extraitre une sous chaine esct ce possible ?

extraitre une sous chaine esct ce possible ? - Shell/Batch - Programmation

Marsh Posté le 09-02-2004 à 11:21:25    

Bonjour ,
 
Je recupère dans un fichier bash des noms de fichiers et je souhaiterais extraire une sous chaine dans ces noms  
par exemple :
 
01122-nomfichier-044774xxxx  
 
ce que je voudrais c'est extraire "nomfichier"  
 
Merci bcp

Reply

Marsh Posté le 09-02-2004 à 11:21:25   

Reply

Marsh Posté le 09-02-2004 à 14:23:10    

Si la liste de noms de fichiers est dans 'liste.dat'


sed 's/[^-]*-\([^-]*\)-.*/\1/' liste.dat


---------------
Jean Pierre.
Reply

Marsh Posté le 09-02-2004 à 14:25:38    

j'ai trouvé aussi la possibilité de la faire avec la commande awk
 
ça m'évite de passer par un fichier intermediaire

Reply

Marsh Posté le 09-02-2004 à 15:26:24    

Tu peux effectivement aussi utiliser 'awk', une possibilité (ce n'est pas la seule) :


awk '
{
  sub(/^[^-]+-/,"" );
  sub(/-.*$/,"" );
  filename=$0
} ' liste.dat


 
A toi de voir ce qui est le plus clair (pb maintenance).
 
Si tu dois traiter cette nouvelle liste par awk, alors il n'y a pas à hésiter fait tout avec un seul script 'awk'.


---------------
Jean Pierre.
Reply

Marsh Posté le 09-02-2004 à 16:53:02    

par contre est-il possible dans le awk de mettre des commandes linux mon script est le suivant  
 
#!/bin/bash
for fichier in `ls | grep .sql`;
do
 
 
echo $fichier | awk '{split($1,tab,"-" );}
 
END{
 
 
mysql<<EOD_SQL
 
 
CREATE DATABASE IF NOT EXISTS tab[2];
show databases;
\q
EOD_SQL
mysql tab[2] < $fichier
#print tab[2];
}'
 
done
 
le seul problème est qu'il ne reconnait pas ce type de commande  
comment procéder pour les executer ?  

Reply

Marsh Posté le 09-02-2004 à 17:19:35    

Tu ne peux pas inclure de commandes externes dans ton script awk.
Pour exécuter une telle commande, il faut passer par la fonction "system'.
 
Dans ton cas le plus simple est de rester au niveau du shell :
 


#!bin/bash
 
ls -1 *.sql | sed 's/[^-]*-\([^-]*\)-.*/\1/' | \
while read fichier
do
   mysql<<-EOD_SQL  
       CREATE DATABASE IF NOT EXISTS $fichier;  
       show databases;  
       \q  
   EOD_SQL
done
 


 
j'ai utilisé 'sed', mais tu peux remplacer par du 'awk' si tu veux :
 


ls -1 *.sql | awk -F- { print $2 }' |
while read fichier
 . . .  
done


 


---------------
Jean Pierre.
Reply

Marsh Posté le 10-02-2004 à 04:47:13    

Si c'est just pour prendre la partie derrière le premier « - », autant utilise cut : « cut -d- -f2 »

Reply

Marsh Posté le 10-02-2004 à 08:40:30    

bon la première partie de ce que je souhaitais faire à fonctionner merci pour vos conseils ...
 
par contre je reste bloqué sur un problème voici le script que j'ai utilisé :
 
#!/bin/bash
 
 
ls -1 *.sql | awk -F- '{print $2 }' |  
while read fichier;
do
mysql<<EOD_SQL
CREATE DATABASE IF NOT EXISTS $fichier;
\q
EOD_SQL
#echo $fichier
done
 
par contre ce je souhaiterais faire c'est inclure dans le même script uen autre variable contenant cette fois le nom du fichier lui même sans modification or par rapport au script ci -dessus la variable fichier est déjà modifiée ... donc si je repars avec un nouveau script du genre
 
for fichier2 in 'ls -1 *.sql';
do
fichier1=
mysql  $fichier1 < $fichier2
 
done  
 
je vais me retrouver de nouveau bloqué puisqu'en fait je voudrais à la fois utiliser le nom du fichier lui même et le fichier modifié comme dans le script ou je tromque le fichier ...
 
mais je ne sais comment m'y prendre  
 
je ne sais pas si j'ai été très clair :(

Reply

Marsh Posté le 10-02-2004 à 09:37:19    


ls -1 *.sql | \
while read fichier
do
   fichier2=`echo $fichier | cut -d- -f2
   . . . .  
done


---------------
Jean Pierre.
Reply

Marsh Posté le 10-02-2004 à 10:17:52    

merci bcp pour ton aide tout fonctionne bien et le script final est super court qui + est et rapide c'est vraiment bien de developper en bash même si le script n'est pas portable en tout cas il est efficace sur le serveur ...
 
par contre pourrais tu me conseiller des bouquins pour que je puisse me perfectionner dans la programmation en bash ?
 
Merci encore

Reply

Marsh Posté le 10-02-2004 à 10:17:52   

Reply

Marsh Posté le 10-02-2004 à 11:10:17    

Désolé, je n'ai aucun bouquin sur le sujet (formation sur le tas via les mans et la lecture de scripts existants).
 
Il y a pas mal de choix chez O'REILLY, les bouquins sont de qualité.
Il y a aussi le web comme source d'informations. Il y a de nombreux FAQ, HOWTO et tutoriaux.


---------------
Jean Pierre.
Reply

Marsh Posté le 10-02-2004 à 11:12:53    

ok je vais voir du côté O'REILLY puis poursuivre mes recherches sur internet

Reply

Sujets relatifs:

Leave a Replay

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