Exercice en shell
Résolu/Fermé
yacine
-
11 mai 2007 à 12:46
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012 - 12 févr. 2008 à 03:32
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012 - 12 févr. 2008 à 03:32
A voir également:
- Exercice en shell
- Classic shell windows 11 - Télécharger - Personnalisation
- Shell startup windows 10 - Guide
- Efi shell version 2.31 - Forum Programmation
- Ssh secure shell download - Télécharger - Divers Web & Internet
- Classic shell c'est quoi ✓ - Forum Windows 8 / 8.1
48 réponses
hugnix
Messages postés
119
Date d'inscription
samedi 9 juin 2007
Statut
Membre
Dernière intervention
27 avril 2009
9 févr. 2008 à 15:44
9 févr. 2008 à 15:44
Salut,
j'ai pas mal galérer avec le nom aussi mais au final je suis quand même parvenu a le faire afficher, par contre dans mon exercice je devais faire apparaitre le username sans le point entre le prénom et le nom.
Et voilà....
j'ai pas mal galérer avec le nom aussi mais au final je suis quand même parvenu a le faire afficher, par contre dans mon exercice je devais faire apparaitre le username sans le point entre le prénom et le nom.
finger -l | grep Name > temp echo " " > who_process who | cut -d" " -f1 | while read lines do grep $lines temp | cut -d":" -f3 >> who_process echo " " >> who_process ps -u $lines >> who_process echo " " >> who_process done rm temp | echo "List of user(s) and process running have been saved to the file who_process" exit
Et voilà....
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
9 févr. 2008 à 16:59
9 févr. 2008 à 16:59
Un raccourci pour l'affichage du nom :
NAME=$(finger -l | grep Name) echo ${NAME##*: };-))
makoko
Messages postés
53
Date d'inscription
mercredi 6 février 2008
Statut
Membre
Dernière intervention
25 novembre 2012
10 févr. 2008 à 00:28
10 févr. 2008 à 00:28
salut tout le monde !
je reviens ver vous ...au sujet de mon problème de users et de process !
j'ai testé la solution de hug...astucieux! et ça marche ! même si, c'est moins économique, peut-être comme solution.
par contre, il y a une chose, que je ne comprends pas encore, même après l'avoir décortiqué et réalisé, pas à pas, pour comprendre.
explication : je veux toujours comprendre et jamais recopié sans comprendre et, cela peut prendre du temps, parfois, avec les 'fous furieux' et appréciables développeurs, que nous avons ici : lami et jipi , et peut-être rejoint bientôt par un troisième larron, mais moin 'fou', pour le moment!
Explication :
finger -l | grep Name > temp => liste un user connectés avec process, sans les headers, en cours et tu prends son login, nom, son rep, son shell, et autres, puis tu envois cela dans une commande grep, qui récupère le nom, ensuite tu sauvegardes dans un fichier , temp, non pas Name, seulement, mais name et login :ok => a
finger -l (moi, seulement à ce moment là)
Login: moi Name: Mom nom
Directory: /home/moi Shell: /bin/bash
On since Sat Feb 9 22:08 (GMT) on pts/1 from 83.204.133.98 # temp
No mail.
No Plan.
finger -l | grep Name
login: moi Name: mon nom
echo " " > who_process => création d'un fichier , who_process, dans lequel, tu crées, un espace vide vertical, quelques lignes, pour users connectés
who => moi pts/1 2008-02-09 22:08 (xx.xxx.xxx.xx) (moi, seulement, à ce moment là)
who | cut -d" " -f1 | while read lines => tu prends ces users connectés, et tu extrais, les infos : login, machine (pts) , puis tu lis les lignes tant que le code de retour n'est pas différent de zéro.
do
grep $lines temp | cut -d":" -f3 >> who_process => tu prends dans temp, le troisième champ : Name, que tu envois dans who_process, pour lequel, tu avais déjà créé la place (echo " ")
echo " " >> who_process => encore un espace vertical dans who_process ( quelques lignes)
ps -u $lines >> who_process => tu récupères les en-têtes
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1553 30318 0.0 0.0 4624 1520 pts/1 Ss 22:08 0:00 -bash
1553 30426 0.0 0.0 4220 940 pts/1 R+ 22:28 0:00 ps -u
echo " " >> who_process => encore un espace dans le fichier
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process" => supprime le fichier temp et reste, bien echo "xxxxxxxxx" pas mal vu ! c'est le même principe qu'avec le mot à insérer au milieu du texte, moité du nbre de lignes.
exit
je récapitule :
1. crées deux fichier, dans le premier, temp, tu mets une partie de ce que tu cherches et dans l'autre un espace pour une info dans contenu dans le premier
2. tu dis par une boucle while read, de créer autant d'espace nécessaire (echo " "), qu'il y aura de connectés à inséser
3. tu récupères les en-têtes, que tu cherches aussi à insérer (ps -u) et tu demandes toujours dans la boucle de créer autant d'espace nécessaire pour les recevoir
4. tu détruis le fichier temp (logique) et tu informes l'utilisateur sur le lieu de la consultation. En effet, sinon, c'est inquiétant !
Question : comment tu fais dans le 3., pour virer les autres en-têtes, que tu ne souhaites ! ( je n'ai pas encore compris, car j'ai vérifié pas à pas, mais en vain, pour le moment)
jipi :
ton script pour le nom (Name) est bon : impec !
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
travail effectué : j'ai du mal avec les boucles !
shopt -s extglob
case $1 in
+(:digit=4: ) echo " correct" # il ne prend pas les crochets!
comment écrire l'autre cas! je n'ai encore trouvé la solution encore!
;;
esac
merci
a+
je reviens ver vous ...au sujet de mon problème de users et de process !
j'ai testé la solution de hug...astucieux! et ça marche ! même si, c'est moins économique, peut-être comme solution.
par contre, il y a une chose, que je ne comprends pas encore, même après l'avoir décortiqué et réalisé, pas à pas, pour comprendre.
explication : je veux toujours comprendre et jamais recopié sans comprendre et, cela peut prendre du temps, parfois, avec les 'fous furieux' et appréciables développeurs, que nous avons ici : lami et jipi , et peut-être rejoint bientôt par un troisième larron, mais moin 'fou', pour le moment!
Explication :
finger -l | grep Name > temp => liste un user connectés avec process, sans les headers, en cours et tu prends son login, nom, son rep, son shell, et autres, puis tu envois cela dans une commande grep, qui récupère le nom, ensuite tu sauvegardes dans un fichier , temp, non pas Name, seulement, mais name et login :ok => a
finger -l (moi, seulement à ce moment là)
Login: moi Name: Mom nom
Directory: /home/moi Shell: /bin/bash
On since Sat Feb 9 22:08 (GMT) on pts/1 from 83.204.133.98 # temp
No mail.
No Plan.
finger -l | grep Name
login: moi Name: mon nom
echo " " > who_process => création d'un fichier , who_process, dans lequel, tu crées, un espace vide vertical, quelques lignes, pour users connectés
who => moi pts/1 2008-02-09 22:08 (xx.xxx.xxx.xx) (moi, seulement, à ce moment là)
who | cut -d" " -f1 | while read lines => tu prends ces users connectés, et tu extrais, les infos : login, machine (pts) , puis tu lis les lignes tant que le code de retour n'est pas différent de zéro.
do
grep $lines temp | cut -d":" -f3 >> who_process => tu prends dans temp, le troisième champ : Name, que tu envois dans who_process, pour lequel, tu avais déjà créé la place (echo " ")
echo " " >> who_process => encore un espace vertical dans who_process ( quelques lignes)
ps -u $lines >> who_process => tu récupères les en-têtes
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1553 30318 0.0 0.0 4624 1520 pts/1 Ss 22:08 0:00 -bash
1553 30426 0.0 0.0 4220 940 pts/1 R+ 22:28 0:00 ps -u
echo " " >> who_process => encore un espace dans le fichier
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process" => supprime le fichier temp et reste, bien echo "xxxxxxxxx" pas mal vu ! c'est le même principe qu'avec le mot à insérer au milieu du texte, moité du nbre de lignes.
exit
je récapitule :
1. crées deux fichier, dans le premier, temp, tu mets une partie de ce que tu cherches et dans l'autre un espace pour une info dans contenu dans le premier
2. tu dis par une boucle while read, de créer autant d'espace nécessaire (echo " "), qu'il y aura de connectés à inséser
3. tu récupères les en-têtes, que tu cherches aussi à insérer (ps -u) et tu demandes toujours dans la boucle de créer autant d'espace nécessaire pour les recevoir
4. tu détruis le fichier temp (logique) et tu informes l'utilisateur sur le lieu de la consultation. En effet, sinon, c'est inquiétant !
Question : comment tu fais dans le 3., pour virer les autres en-têtes, que tu ne souhaites ! ( je n'ai pas encore compris, car j'ai vérifié pas à pas, mais en vain, pour le moment)
jipi :
ton script pour le nom (Name) est bon : impec !
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
travail effectué : j'ai du mal avec les boucles !
shopt -s extglob
case $1 in
+(:digit=4: ) echo " correct" # il ne prend pas les crochets!
comment écrire l'autre cas! je n'ai encore trouvé la solution encore!
;;
esac
merci
a+
makoko
Messages postés
53
Date d'inscription
mercredi 6 février 2008
Statut
Membre
Dernière intervention
25 novembre 2012
10 févr. 2008 à 00:59
10 févr. 2008 à 00:59
par contre, jipi, il marche en mode script seulement, ton script de Nom, pas en ligne de commande, alors, que ce ne sont que des commandes internes que tu utilises, je crois!
mystère ! mais peut-être pas tant que ça !
a+
mystère ! mais peut-être pas tant que ça !
a+
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 févr. 2008 à 10:03
10 févr. 2008 à 10:03
Re-
J'ai pas compris ton problème là !? ;-\
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
Pas besoin de boucles ni de "case ... esac", une simple condition "if ... then ... else... fi" suffit :
J'ai pas compris ton problème là !? ;-\
$ NAME=$(finger -l | grep Name) $ echo ${NAME##*: } Jean-PhilippeÇa marche bien dans un terminal...
problème du jour :
Ecrire un programme shell 4arg qui vérifie que le nombre d'arguments passés lors de l’appel du programme est égal à 4 et écrit suivant le cas le message “Correct” ou le message “Erreur"
Pas besoin de boucles ni de "case ... esac", une simple condition "if ... then ... else... fi" suffit :
#! /bin/bash if [ "$#" != "4" ] then echo "Erreur" else echo "Correct" fi;-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
makoko
Messages postés
53
Date d'inscription
mercredi 6 février 2008
Statut
Membre
Dernière intervention
25 novembre 2012
10 févr. 2008 à 14:21
10 févr. 2008 à 14:21
salut tout le monde !
d'abord, merci pour lien de man, sur le net, ça aide et c'est plus pratique que de retourner, dans help, de bash.
lami, je reviens sur ton script :
for i in $(grep "$(who | cut -d' ' -f1)" /etc/passwd);do echo -e "$i\n" | cut -d':' -f5;ps -opid,tname,time,comm -U ${i%%:*};done
pour moi, il affiche, mon prénom deux fois, et les autres, toujours le prénom, une seule fois !
alors, le message d'erreur, affiche les bonnes options, à mettre : j'ai essayé avec quelques unes, toujours pas de résultat.
mais,il est intéressant, il m'a permis de poursuivre mes tests, de comprendre mieux : cut -opt, et d'oser des choses !
Hug,
désolé! pour ton bébé! je l'ai amoindri ...:) => résultat: j'ai exactement ce que je voulais ! (pid est aligné vers la droite, parfait! ce qui n'est pas visible sur la capture d'écran, mais lance-le, alors tu verras!)
----------------------------------------------------------------------------
#!/bin/bash
finger -l | grep Name > temp
echo > who_process
who | cut -d" " -f1 | while read lines
do
grep $lines temp | cut -d":" -f3 >> who_process
ps -u $lines >> who_process
echo >> who_process
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process"
exit
-----------------------------------------------------------------------------
résultat :
Toi
PID TTY TIME CMD
12956 ? 00:00:04 sshd
12957 pts/3 00:00:00 bash
1109 pts/3 00:00:00 vim
Moi
PID TTY TIME CMD
29539 ? 00:00:00 sshd
29540 pts/5 00:00:00 bash
1135 pts/5 00:00:00 sh
1140 pts/5 00:00:00 sh
1149 pts/5 00:00:00 ps
salutations à jipi!
merci à tous !
a+
:)
ps : là, je vais déjeuner, ouf!
d'abord, merci pour lien de man, sur le net, ça aide et c'est plus pratique que de retourner, dans help, de bash.
lami, je reviens sur ton script :
for i in $(grep "$(who | cut -d' ' -f1)" /etc/passwd);do echo -e "$i\n" | cut -d':' -f5;ps -opid,tname,time,comm -U ${i%%:*};done
pour moi, il affiche, mon prénom deux fois, et les autres, toujours le prénom, une seule fois !
alors, le message d'erreur, affiche les bonnes options, à mettre : j'ai essayé avec quelques unes, toujours pas de résultat.
mais,il est intéressant, il m'a permis de poursuivre mes tests, de comprendre mieux : cut -opt, et d'oser des choses !
Hug,
désolé! pour ton bébé! je l'ai amoindri ...:) => résultat: j'ai exactement ce que je voulais ! (pid est aligné vers la droite, parfait! ce qui n'est pas visible sur la capture d'écran, mais lance-le, alors tu verras!)
----------------------------------------------------------------------------
#!/bin/bash
finger -l | grep Name > temp
echo > who_process
who | cut -d" " -f1 | while read lines
do
grep $lines temp | cut -d":" -f3 >> who_process
ps -u $lines >> who_process
echo >> who_process
done
rm temp | echo "List of user(s) and process running have been saved to the file who_process"
exit
-----------------------------------------------------------------------------
résultat :
Toi
PID TTY TIME CMD
12956 ? 00:00:04 sshd
12957 pts/3 00:00:00 bash
1109 pts/3 00:00:00 vim
Moi
PID TTY TIME CMD
29539 ? 00:00:00 sshd
29540 pts/5 00:00:00 bash
1135 pts/5 00:00:00 sh
1140 pts/5 00:00:00 sh
1149 pts/5 00:00:00 ps
salutations à jipi!
merci à tous !
a+
:)
ps : là, je vais déjeuner, ouf!
makoko
Messages postés
53
Date d'inscription
mercredi 6 février 2008
Statut
Membre
Dernière intervention
25 novembre 2012
10 févr. 2008 à 14:33
10 févr. 2008 à 14:33
hi!
"Ça marche bien dans un terminal... "
certainement, et je te crois, preuve, à l'appui, mais je suis en mode asp!
je pense à installer un linux, avec VMWare, en local, même avec un live! Mais je ne l'ai pas encore fait !
sinon, merci pour le script : tu est trop fou! tu m'as encore grillé ! ça me donne du boulot, encore !
Problème du jour :
Ecrire un programme shell reconnaitre qui demande à l’utilisateur d’entrer un mot, puis suivant le première caractère de ce mot, indique s’il commence par un chiffre, une minuscule, une majuscule ou une autre sorte de caractère.
merci
a+:))
ps : dire que le prof a donné cet exo, un cours en ligne, après un cours sur : structure de contrôle : case et while!
"Ça marche bien dans un terminal... "
certainement, et je te crois, preuve, à l'appui, mais je suis en mode asp!
je pense à installer un linux, avec VMWare, en local, même avec un live! Mais je ne l'ai pas encore fait !
sinon, merci pour le script : tu est trop fou! tu m'as encore grillé ! ça me donne du boulot, encore !
Problème du jour :
Ecrire un programme shell reconnaitre qui demande à l’utilisateur d’entrer un mot, puis suivant le première caractère de ce mot, indique s’il commence par un chiffre, une minuscule, une majuscule ou une autre sorte de caractère.
merci
a+:))
ps : dire que le prof a donné cet exo, un cours en ligne, après un cours sur : structure de contrôle : case et while!
hugnix
Messages postés
119
Date d'inscription
samedi 9 juin 2007
Statut
Membre
Dernière intervention
27 avril 2009
11 févr. 2008 à 18:05
11 févr. 2008 à 18:05
"désolé! pour ton bébé! je l'ai amoindri ...:) "
lol pas de souci, il était obèse de toute façon :)))) mais voilà un version encore plus light ( 1 ligne), malheureusement je passe toujours pas un fichier temporaire(temp) mais ça donne le même résultat, je vais voir après pour éviter l'utilisation d'un fichier.
je vais regarder pour ton autre exercice, ça doit pas être bien compliqué.
P.s.: si t'as besoin d'aide même a 3heure du mat, prend mon addresse msn, mon staut est hors ligne mais je suis tout le temps connecté.
anarcopunx_7@hotmail.com n'hésite pas même si il est très tard ( tôt... )
lol pas de souci, il était obèse de toute façon :)))) mais voilà un version encore plus light ( 1 ligne), malheureusement je passe toujours pas un fichier temporaire(temp) mais ça donne le même résultat, je vais voir après pour éviter l'utilisation d'un fichier.
#!/bin/bash finger -l | grep Name > temp ; who | cut -d" " -f1 | while read lines ; do grep $lines temp | cut -d":" -f3 ; ps -u $lines ; done ; rm temp
je vais regarder pour ton autre exercice, ça doit pas être bien compliqué.
P.s.: si t'as besoin d'aide même a 3heure du mat, prend mon addresse msn, mon staut est hors ligne mais je suis tout le temps connecté.
anarcopunx_7@hotmail.com n'hésite pas même si il est très tard ( tôt... )
makoko
Messages postés
53
Date d'inscription
mercredi 6 février 2008
Statut
Membre
Dernière intervention
25 novembre 2012
12 févr. 2008 à 03:32
12 févr. 2008 à 03:32
hi Hug!
justement je cehrchais à amaigrir encore celui des permissions, mais des problèmes persistent...au niveau des boucles if !
je vais tester cette nouvelle nouvelle !
Merci pour ta proposition (je t'enregistre°
A+
justement je cehrchais à amaigrir encore celui des permissions, mais des problèmes persistent...au niveau des boucles if !
je vais tester cette nouvelle nouvelle !
Merci pour ta proposition (je t'enregistre°
A+