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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Bash aide projet

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bash aide projet

n°2112400
flaschgord​on
Posté le 19-11-2011 à 12:30:32  profilanswer
 

Bonjour , et merci par avance de votre aide je souhaiterai réaliser un script dans le cadre de mes études en DUT informatique et je sollicite votre aide  
 
But du script : je cherche a réaliser un script qui a l'aide d'Url prédéfinis dans un fichier .txt ou soit entré par l'utilisateur et stocker dans un fichier txt , Cherche les occurrences des mots qui se trouve dans cette Url , je m'explique un peu mieux  , L'utilisateur va rentrez une ou plusieurs Url qui seront ensuite regroupé ligne par ligne dans un fichier texte , Mon script va lire ces Url et va dire combien de fois il trouve les occurrences des mots sur ces site ( par exemple si il trouve Bonjour 15 fois il marquera dans un fichier texte annexe bonjour : 15 ) je ne sait pas trop par quoi commencer et j'avoue avoir pas mal de difficulté avec le BAsh si quelqu'un pouvez m'aider a la réalisation de script je le ou / les remercierez par avance  
 
merci encore de votre aide

mood
Publicité
Posté le 19-11-2011 à 12:30:32  profilanswer
 

n°2112403
Profil sup​primé
Posté le 19-11-2011 à 14:35:21  answer
 

salut,
 
quelle version de bash ? parce que à partir de la version 4, il dispose de tableaux associatifs qui vont beaucoup te faciliter les tâches de l'indexation et du comptage.

n°2112656
flaschgord​on
Posté le 21-11-2011 à 18:07:52  profilanswer
 

la version actuelle de linux j'utilise pour mon bash , mais je ne maitrise pas du tout les tableaux associatif enfin bon d'un coté ca me permettrait d'en apprendre et me simplifier la vie ,

n°2113159
flaschgord​on
Posté le 24-11-2011 à 19:08:54  profilanswer
 

actuelement mon script Non optimiser !! ressemble a cela bien sur il n'est pas terminer  
 

Citation :

#!bin/bash
 
#Presentation du groupe
echo "__________________________________"
echo "|    Projet Bash 2011-2012       |"
 
 
#debut du programme
while [$Url -ne '.'] #boucle de saisie d'url  
do
echo "Madame Monsieur"
echo "Veuillez entrez une Url"
echo "Tapez '.' lorsque la saisie est terminer" #condition de fin de boucle de saisie d'url
read Url >> ListeUrl  # saisie de l'url
done  
0=i
 
#boucle de lecture ligne par ligne du fichier listeUrl
while [] # tant que la ligne suivant du fichier texte est saisie  
do
wget -r -i ListeUrl  -P Contenu -tries=10 $Url # recuperer le contenue du site a l'adresse se trouvant dans le fichier ListeUrl
done
sed  
cat Contenu | sort | uniq | -c

n°2113176
Sve@r
Posté le 24-11-2011 à 21:34:41  profilanswer
 

flaschgordon a écrit :

actuelement mon script Non optimiser !! ressemble a cela bien sur il n'est pas terminer


Salut
Attention aux emplois inusités de l'infinitif en lieux et place du participe passé...
 

flaschgordon a écrit :

Citation :

#!bin/bash
 
#Presentation du groupe
echo "__________________________________"
echo "|    Projet Bash 2011-2012       |"
 
 
#debut du programme
while [$Url -ne '.'] #boucle de saisie d'url  
do
echo "Madame Monsieur"
echo "Veuillez entrez une Url"
echo "Tapez '.' lorsque la saisie est terminer" #condition de fin de boucle de saisie d'url
read Url >> ListeUrl  # saisie de l'url
done  
0=i
 
#boucle de lecture ligne par ligne du fichier listeUrl
while [] # tant que la ligne suivant du fichier texte est saisie  
do
wget -r -i ListeUrl  -P Contenu -tries=10 $Url # recuperer le contenue du site a l'adresse se trouvant dans le fichier ListeUrl
done
sed  
cat Contenu | sort | uniq | -c



 
Bon, petit récapitulatif des pb de ton scripts
1) le shell est très limité comme langage. C'est fait exprès pour qu'il perde le moins de temps possible à essayer de comprendre ce que tu lui as tapé. Corollaire, il te faut être super rigoureux dans ta syntaxe. Et un de ses impératifs est de bien séparer les éléments.
Donc while [$Url -ne '.'] ne sera pas compris pas alors que while [ $Url -ne '.' ] le sera.
Accessoirement, -ne est fait pour comparer du numérique. Comparer des chaines c'est = ou != donc while [ $Url != '.' ]
Ce qui nous amène au pb suivant (mais là c'est un truc très pointu): un des gros dangers de cette syntaxe c'est que si l'utilisateur ne rentre rien, la variable $Url sera vide et que dans ce cas, le shell verra while [ != '.' ]
Cependant, l'opérateur != veut impérativement 2 opérandes et si le shell n'en voit qu'un, il ne s'en sort plus (toujours le pb du temps d'interprétation)
Pour pallier ce souci, encadrer la variable par des guillemets => while [ "$Url" != "." ]
Ainsi, même si $Url est vide, le shell verra while [ "" != "." ] et comprendra quand-même l'instruction...
 
2) séparer les instructions. read sert à lire une info dans l'entrée standard et à la stocker dans une variable, rien d'autre (et surtout elle n'affiche rien). Donc read Url >> listeUrl redirigera ce qu'affiche l'instruction read (donc pas grand chose) dans le fichier listeUrl. C'est syntaxiquement correct mais cela ne fera pas ce que je crois que tu veux faire.
Si tu veux faire saisir une url et la stocker dans un fichier, alors 2 étapes
read Url
echo "$Url" >> listeUrl
 
3) la lecture d'un fichier => là il faut bien comprendre les principes
read sert à lire l'entrée standard et à stocker cette entrée dans une variable. Le marqueur de fin de lecture c'est la touche <return>. Or, coup de bol, chaque ligne d'un fichier se termine par un <return>.
De plus, cette commande, comme toute commande Unix, renvoie un état. Et il se trouve que cet état est à faux si elle ne lit rien. Donc on peut boucler sur un while read (rappel: while peut vérifier toute commande quelle qu'elle soit) et ainsi rester dans la boucle tant que qqchose a été lu.
Et enfin l'entrée standard, utilisée par défaut pour le read, peut être redirigée à partir d'un fichier via l'opérateur "<" (et aussi, si on le désire, d'une commande via un pipe).
Ce qui donne la structure générale suivante

Code :
  1. while read ligne
  2. do
  3.     echo "ligne lue: [$ligne]"
  4. done <listeUrl


Ainsi, chaque ligne lue sera stockée dans la variable "$ligne" puis traitée dans la boucle. Et quand tout le fichier aura été traité, le read ne lisant plus rien renverra "faux" et le while s'arrêtera. Et cette syntaxe démontre (s'il était nécessaire), que la structure while ... do ... done est compris comme étant qu'une seule et unique commande (puisque la redirection <listeUrl s'applique à la commande qui la précède)
 
Donc voilà. J'espère qu'avec ces quelques notions tu t'en sortiras. Si tu veux, tu as un cours complet de shell ici => http://fr.lang.free.fr/cours/Shell_v2.0.pdf
 
 
 
Tableaux associatifs ??? Cette notion existe en php, existe en perl, existe en Python... mais je ne savais pas qu'elle avait été intégrée dans le shell. De mon coté j'étais resté aux tableaux simples (ceux qui ont un indice) et ce genre de tableau n'est seulement connu que des shells évolués (ksh, bash et au delà). Et généralement j'arrive toujours à m'en passer surtout si je programme des scripts portables pour tout type de shell...


Message édité par Sve@r le 24-11-2011 à 22:02:30
n°2113283
flaschgord​on
Posté le 25-11-2011 à 16:21:23  profilanswer
 

Veuillez excuser mes quelques fautes d'orthographes c'est vrai que j'ai quelques difficultés enfin merci :)
 
Tout d'abord un grand merci pour vos informations clairs , précises , et complètes je pense donc qu'avec tout ce que vous avez pu me dire je réussirez a réalisez mon script , et par la même occasion a en apprendre un peu plus sur les subtilité du bash.  
Merci également pour votre site , je cherchez justement un site expliqué en français , et expliquant les notions de bash et je n'avais jusque la pas trouvé quelque chose qui me paraissait convenable  
 
Voila je pense a part si d'autre personne on quelque informations complémentaire et intéressant a apporter ce qui m’intéresserai également , que l'on peut clore le sujet  
 
Je vous remercie De m'avoir aidé  
 
Amicalement Flasch


Message édité par flaschgordon le 25-11-2011 à 16:25:10
n°2114761
flaschgord​on
Posté le 04-12-2011 à 19:24:52  profilanswer
 

J'aurai encore besoin d'une petite aide je n'arrive pas a comprendre  
Voici mon script presque final
 

Code :
  1. #!bin/bash
  2. #Presentation du groupe
  3. echo "__________________________________"
  4. echo "|    Projet Bash 2011-2012       |"
  5. echo "|                                |" 
  6. echo "|________________________________|"
  7. sleep 2s
  8. clear
  9. #debut du programme
  10. echo "Madame Monsieur"
  11. echo "Veuillez entrez une Url complete (sous la forme http://)"
  12. while [ "$Url" != "." ] #boucle de saisie d'url
  13. do
  14. read Url  # saisie de l'url
  15. echo "$Url" >> ListeUrl.txt # enregistrement de la saisie dans ListeUrl.txt
  16. echo "Tapez '.' lorsque la saisie est terminer" #condition de fin de boucle de saisie d'url
  17. done
  18. sleep 3s
  19. echo " ____________________________________________"
  20. echo "|             Traitement des Urls            |"
  21. echo "|      ..........   Analyse   ............   |"
  22. echo "|____________________________________________|"
  23. clear 
  24. echo " ____________________________________________"
  25. echo "|             Traitement des Urls            |"
  26. echo "|      ..........   En Cour   ............   |"
  27. echo "|____________________________________________|"
  28. clear 
  29. #boucle de lecture ligne par ligne du fichier listeUrl
  30. # tant que la ligne suivant du fichier texte est saisie
  31. while read ligne
  32. do
  33. echo "ligne lue: [$ligne]"
  34. wget -r -i ListeUrl.txt --progress=dot -P contenu.txt --reject zip,jpg,png,gif,tar,exe,pdf,doc -t 10 $ligne # recuperer le contenue du site a l'adresse se trouvant dans le fichier ListeUrl
  35. done <ListeUrl.txt
  36. echo "Contenu du Site récupérer est placé dans Contenu.txt"
  37. sleep 3s
  38. #Filtre , trie du fichier Contenu.txt  et comptabilisation des Occurences
  39. sed 's|<[^>]*>||g'
  40. cat contenu.txt | sort | uniq | -c
  41. echo "Contenu.txt triage et comptage réussi"
  42. sleep 3s
  43. echo " ____________________________________________"
  44. echo "|             Traitement des Urls            |"
  45. echo "|      ..........  Terminé    ............   |"
  46. echo "|____________________________________________|"


 
Voila lors de la premiere boucle ou je demande un point pour sortir de la boucle je suis obliger de tapez un point puis un autre pour que le programme valide
Merci a vous encore , et merci par avance de votre aide sa doit etre tout ptit mais je ne vois pas

Message cité 1 fois
Message édité par flaschgordon le 07-12-2011 à 21:11:46
n°2115978
flaschgord​on
Posté le 11-12-2011 à 10:07:19  profilanswer
 

Bonjour et merci de votre aide j'ai trouver pour le point  
Mais maintenant se pose un autre soucis si vous pouviez m'apporter votre aide  
a la fin de mon script  
 

Code :
  1. #boucle de lecture ligne par ligne du fichier listeUrl
  2. # tant que la ligne suivant du fichier texte est saisie
  3. while read ligne
  4. do
  5. echo "ligne lue: [$ligne]"
  6. wget -r -i ListeUrl.txt --progress=dot -R.zip -P contenu $ligne # recuperer le contenue du site a l'adresse se trouvant dans le fichier ListeUrl
  7. done <ListeUrl.txt
  8. echo "Contenu du Site récupérer est placé dans Contenu"
  9. sleep 3s
  10. #Filtre , trie du fichier Contenu.txt  et comptabilisation des Occurences
  11. for file in 'ls contenu'
  12. do
  13. cat file >> Resultat
  14. done
  15. sed 's|<[^>]*>||g'  Resultat
  16. cat contenu | sort | uniq | -c
  17. echo "Contenu.txt triage et comptage réussi"
  18. sleep 3s


 
Voila en faite je voudrais concatener tout ce qu'il ya dans un repertoire grace a une boucle je sais pas i comme ca je peut y arriver je sollicite votre aide si possible
 
Merci beaucoup
 

n°2116343
Sve@r
Posté le 12-12-2011 à 20:13:21  profilanswer
 

flaschgordon a écrit :

Code :
  1. echo "Madame Monsieur"
  2. echo "Veuillez entrez une Url complete (sous la forme http://)"
  3. while [ "$Url" != "." ] #boucle de saisie d'url
  4. do
  5. read Url  # saisie de l'url
  6. echo "$Url" >> ListeUrl.txt # enregistrement de la saisie dans ListeUrl.txt
  7. echo "Tapez '.' lorsque la saisie est terminer" #condition de fin de boucle de saisie d'url
  8. done



 

Code :
  1. cat <<_EOT_
  2. Madame Monsieur,
  3. Veuillez entrez vos Url completes (sous la forme http://)
  4. Pour quitter la saisie, il suffira de saisir "."
  5. _EOT_
  6. while true
  7. do
  8.    read Url
  9.    test "$Url" = "." && break
  10.    echo "$Url" >> ListeUrl.txt # enregistrement de la saisie dans ListeUrl.txt
  11. done


 

flaschgordon a écrit :

Code :
  1. #Filtre , trie du fichier Contenu.txt  et comptabilisation des Occurences
  2. for file in 'ls contenu'
  3. do
  4. cat file >> Resultat
  5. done


 
Voila en faite je voudrais concatener tout ce qu'il ya dans un repertoire grace a une boucle je sais pas i comme ca je peut y arriver je sollicite votre aide si possible
 
Merci beaucoup


 
Mauvaise syntaxe. Il faut mettre des backquottes à la commande "ls" et non des quottes simples (voir ton cours pour la différence entre quottes et backquottes)
 
Toutefois, même avec une bonne syntaxe, si jamais tu as un nom de fichier avec espace, le for n'appréciera pas du tout !!!
 
Mieux vaut passer par un traitement du ls ligne à ligne par read (exactement comme on traite un fichier). Et aussi filtrer les fichiers pour ne concaténer que les fichiers ordinaires...

Code :
  1. ls contenu |while read f
  2. do
  3.    test -s "$f" && cat "$f" >> Resultat
  4. done


Message édité par Sve@r le 12-12-2011 à 20:24:21
n°2116386
Profil sup​primé
Posté le 13-12-2011 à 04:21:55  answer
 

salut,
 
pourquoi une boucle appelant autant de fois cat fichier par fichier ?
 
on est en bash, on peut faire un tableau

Code :
  1. for f in contenu/*
  2. do
  3.   test -s "$f" && tableau+=( "$f" )
  4. done
  5. cat "${tableau[@]}" > Resultat

Message cité 1 fois
Message édité par Profil supprimé le 13-12-2011 à 04:27:12
mood
Publicité
Posté le 13-12-2011 à 04:21:55  profilanswer
 

n°2116394
Sve@r
Posté le 13-12-2011 à 08:34:07  profilanswer
 


C'est vrai, suis con !!!

Code :
  1. cat contenu/* >Resultat


n°2117052
flaschgord​on
Posté le 17-12-2011 à 21:20:21  profilanswer
 

merci beaucoup , je vais essayer ca ce week-end et je vous tient au courant merci encore a vous

n°2117080
flaschgord​on
Posté le 18-12-2011 à 12:59:54  profilanswer
 

voila ce que cela me met dans la console  

Code :
  1. Contenu du Site récupérer est placé dans contenu
  2. cat: contenu/veromoto.free.fr: est un dossier
  3. Contenu triage et comptage réussi


 
Je ne comprend pas du tout  

Code :
  1. for f in contenu/*
  2. do
  3. test -s "$f" && tableau+=( "$f" )
  4. done
  5. cat "${tableau[@]}" >> Resultat
  6. sed 's|<[^>]*>||g' Resultat
  7. cat Resultat | sort | uniq |
  8. echo "Contenu triage et comptage réussi"
  9. sleep 2s


 
Voila mon code je ne comprend pas du tout  
en sachant que mon arborescence se presente comme ceci
merci de votre aide si quelqu'un a une solution ca serait vraiment la bienvenue  

Code :
  1. /home/sebastien/contenu/sitetelechargé


Message édité par flaschgordon le 18-12-2011 à 13:01:25

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

  Bash aide projet

 

Sujets relatifs
Besoin d'aide permutation binaireAide pour script d'actualité
Aide pour SmaltalkAide création de site
[AIDE] jsch et automatisation des commandesaide avec la librairie ijg JPEC
Qt 4.7.4 : Aide complémentaire création serveur de jeuAide sur la mise en page d'un site (HTML/CSS)
[Aide]Commande Visual Basic Express 
Plus de sujets relatifs à : Bash aide projet


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