Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

xelator a écrit :

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

xelator a écrit :

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

Jetlag a écrit :

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" wink


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 roll
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 roll j'en étais pourtant sur hmm

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 wink):
- 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 big_smile

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