Pages : 1
#1 Le 13/12/2008, à 20:43
- Jetlag
grep, je deviens fou
Bonjour,
je suis totalement novice sous Ubuntu.
J'apprends à la fac pour la première fois des commandes et j'ai un exercice à faire qui me semble impossible vu mes connaissances actuelles.
On a en gros appris les fonctions de bases (ls cp rm mk dir...) et les boucles.
On me demande d'écrire un script qui est une boucle qui va regarder chaque ligne d'un fichier et créer un répertoire avec ce nom.
Le point qui me pose vriament problème c'est de lire dans le fichier. Dans l'exo, il est marqu" d'utiliser la commande grep, mais on a vu en cours que pour s'en servir pour aller chercher les lignes contenant un mot prédéfini.
Là je cherche a nommer une variable avec la premiere ligne, créer mon répertoire avec ce nom de variable, renommer la variable avec la deuxieme ligne.
Et mon problème c'est de dire à ma variable un truc du genre var=`grep ligne test` avec ligne le numéro de ligne et test le fichier concerné. Mais je ne vois pas du tout comment écrire ça.
Merci par avance pour votre aide.
#2 Le 13/12/2008, à 20:49
- helios91940
Re : grep, je deviens fou
Bonsoir
Pour avoir le contenu de la première ligne tu peux utiliser la commande head
Syntaxe
head -1 tonfichier
Dernière modification par helios91940 (Le 13/12/2008, à 20:50)
There is no system but GNU, and Linux is one of its kernels.
Adhérez à l'APRIL!
http://www.april.org/adherer
Hors ligne
#3 Le 13/12/2008, à 20:49
- xelator
Re : grep, je deviens fou
Bizarre d'utiliser grep ...
moi j'aurais fait :
for i in fichier.txt
do
mkdir $i
done
(syntaxe sans doute mauvaise)
car je ne crois pas que grep soit capable de lire un ligne spécifique dans fichier il cherche plutôt les lignes contenant une chaine de caractères.
Comment est le fichier ?
Hors ligne
#4 Le 13/12/2008, à 20:53
- Jetlag
Re : grep, je deviens fou
Bizarre d'utiliser grep ...
moi j'aurais fait :for i in fichier.txt
do
mkdir $i
done
(syntaxe sans doute mauvaise)
car je ne crois pas que grep soit capable de lire un ligne spécifique dans fichier il cherche plutôt les lignes contenant une chaine de caractères.
Comment est le fichier ?
Ca marche peut être mieux comme ça. grep c'est peut être une autre question de l'exo en fait.
Le fichier c'est un fichier avec un mot par ligne, genre:
rep1
rep2
rep3
donc il faut que je crée 3 répertoires avec ces noms là
for i in fichier.txt
do
mkdir $i
done
ça a l'air top ça. Je ne savais pas qu'on pouvait utiliser la bouclle for pour lire ligne à ligne.
Merci beaucoup
#5 Le 13/12/2008, à 20:53
- xelator
Re : grep, je deviens fou
tape : man grep
mais j'ai pas trop vu d'options qui allaient
Hors ligne
#6 Le 13/12/2008, à 21:12
- Jetlag
Re : grep, je deviens fou
tape : man grep
mais j'ai pas trop vu d'options qui allaient
j'ai fait le test avec fichier in i et ça marche.
Merci beaucoup.
grep à mon avis, c'est maintenant.
le fichier change, il est comme suit:
d rep5
f fic1
f fic2
d rep1
on me demande de créer un fichier si la premiere lettre et f ou un dossier sinon et de le nommer avec le nom donné ensuite.
Mais là c'est encore pire, je ne sais pas comment lire la première lettre et comment faire que le nom soit seulement la deuxième partie de la linge (après l'espace).
J'y comprends rien et ya rien dans le cours la dessus. Le prof est fou!
#7 Le 13/12/2008, à 21:28
- HP
Re : grep, je deviens fou
Je ne savais pas qu'on pouvait utiliser la bouclle for pour lire ligne à ligne.
c'est un peu à çà qu'elle sert… et en fait elle lit "mot" après "mot"
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#8 Le 13/12/2008, à 21:30
- xelator
Re : grep, je deviens fou
c'est vrai que c'est chaud pour des petits exo ...
for i in fichier.txt
do
$type=`echo $i | cut -d" " -f1`
$objet=`echo $i | cut -d" " -f2-`
if [ $type="f" ];
then
touch "$objet"
fi
if [ $file="d"];
then
mkdir "$objet"
fi
done
ou avec case a la place des 2 if :
for i in fichier.txt
do
$type=`echo $i | cut -d" " -f1`
$objet=`echo $i | cut -d" " -f2-`
case $type in
f )
touch "$objet";
;;
d)
mkdir "$objet";
;;
esac
pareil syntaxe à vérifier
normalement ça marche avec les noms avec espace mais pas trop sur ...
Je voudrais pas faire tes exos non plus c'est mal en plus je suis étudiant aussi
donc essaye de te renseigner sur cut -d" " -f2- et pourquoi j'ai mis -f2- et pas -f2 ... etc...
Hors ligne
#9 Le 13/12/2008, à 21:44
- Link31
Re : grep, je deviens fou
Autant que je sache, cette syntaxe ne lit pas du tout le fichier ligne par ligne :
for line in fichier; do echo $line; done
À la place, il vaut mieux utiliser quelque chose comme ça :
while read line; do echo $line; done < fichier
Hors ligne
#10 Le 13/12/2008, à 21:51
- xelator
Re : grep, je deviens fou
effectivement je viens de tester , ça marche vraiment pas j'en étais pourtant sur
Hors ligne
#11 Le 13/12/2008, à 22:08
- Jetlag
Re : grep, je deviens fou
Merci de votre aide mais alors je ne comprends plus rien.
C'est le premier cours et on a encore rien vu de tout cela.
read ça sert donc à lire la ligne.
Mais pour isoler Rep2 de la ligne "d rep2", comment je peux faire?
Je ne peux pas utiliser grep pour lire le 1er caractère de la ligne?
Halala, je sens que je vais passer un sale dimanche.
#12 Le 13/12/2008, à 22:19
- xelator
Re : grep, je deviens fou
médite sur ces commandes
$type=`echo $i | cut -d" " -f1`
$objet=`echo $i | cut -d" " -f2-`
par exemple :
[alex@X31 ~]$ echo dd gg ff
dd gg ff
[alex@X31 ~]$ echo dd g ff | cut -d"g" -f1
dd
[alex@X31 ~]$ echo dd g ff | cut -d"g" -f2
ff
[alex@X31 ~]$ echo dd g ff | cut -d" " -f1
dd
[alex@X31 ~]$ echo dd g ff | cut -d" " -f2
g
[alex@X31 ~]$ echo dd g ff | cut -d" " -f3
ff
[alex@X31 ~]$ echo dd g ff | cut -d" " -f2-
g ff
[alex@X31 ~]$
regarde le man de la commande cut et les options -d et -f ...
le reste de mon programme est bon (enfin je pense)
Hors ligne
#13 Le 13/12/2008, à 23:39
- robrob
Re : grep, je deviens fou
Une solution avec grep
- grep permet de filtrer les lignes contenant les occurences de 'd '
- sed permet d'éliminer les 'd ' des lignes retournées par grep
- test permet de tester l'existence d'un répertoire
A améliorer (bah oui sinon c'est trop facile ):
- si le nom d'un fichier contient 'd' alors un repertoire sera créé (voir pire, j'ai pas testé)
-> il faut limiter la recherche au début de la ligne + filtrer uniquement ce début du ligne
#/!bin/bash
repertoires=`grep 'd' $1 | sed -e 's/d//g'`
for i in $repertoires
do
if test -d $i
then
echo 'le repertoire '$i' existe'
else
mkdir $i
fi
done
edit: D'un commun accord avec moi-même j'ai viré ce qui concerne les fichiers, c'est un exercice tout de même
Dernière modification par robrob (Le 13/12/2008, à 23:57)
Hors ligne
#14 Le 13/12/2008, à 23:50
- AnsuzPeorth
Re : grep, je deviens fou
Comme y'a pas foule....(pis maintenant tu as du réfléchir un peu)
y'a plusieurs façons de faire..J'en propose une, pas la meilleur, mais c simple et ça fonctionne.
#!/bin/bash
while read line #proposé par Link31 (si lui le dit....y a pas mieux !:D)
do
fichier=$(echo "$line" | grep "^f" | cut -d " " -f2)
dossier=$(echo "$line" | grep "^d" | cut -d " " -f2)
[ -n "$fichier" ] && echo "c le fichier $fichier"
[ -n "$dossier" ] && echo "c le dossier $dossier"
done < /home/fichier_source
# le ^ de grep correspond au caractère de début de ligne
# L'option -n vérifie si la variable n'est pas vide.
# le && peut être remplacé par un if then
#remplace "echo "c le ...."" par les commandes voulues
#En plus court ${line:2} coupe les 2 premier caractères de la variable
while read line
do
[ -n "$(echo "$line" | grep "^f")" ] && echo "Le nom du fichier est ${line:2}"
[ -n "$(echo "$line" | grep "^d")" ] && echo "Le nom du dossier est ${line:2}"
done < /home/fichier_source
Regarde le lien dans ma signature, tu trouveras de la matiere...!
Dernière modification par AnsuzPeorth (Le 14/12/2008, à 18:26)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
Pages : 1