[shell] Lire un fichier ligne par ligne

Lire un fichier ligne par ligne [shell] - Linux et OS Alternatifs

Marsh Posté le 27-03-2005 à 15:32:08    

Bonjour,
 
dans un script j'ai besoin de lire le fichier /etc/passwd ligne par ligne,
 
j'ai fait :
 
for ligne in `cat $FILE`
 
mais s'il ya un espace dans un ligne, il me "coupe" la ligne en deux.
 
Comment je peux faire ?
 
merci

Reply

Marsh Posté le 27-03-2005 à 15:32:08   

Reply

Marsh Posté le 27-03-2005 à 15:38:05    

Pourquoi veut-tu le lire ligne/ligne ?
 
Tu peux néanmoins essayer:
 
cat /etc/passwd | tacommande

Reply

Marsh Posté le 27-03-2005 à 15:51:06    

Bah voila ce que je voudrais faire, dans le fichier /etc/passwd ya le Prenom et le nom de l'utilisateur séparé par un espace, et j'aimerais dans mon script avoir Prénom.nom
 
Alors quand je fait cat /etc/passwd | cut -f5 -d ":", je récupère bien les noms, mais il me faut encore les relier entre eux, tout les prenoms nom sont séparés par des espaces.
 
Alros je pensais lire le fichier ligne par ligne, ensuite utiliser cut et hop le tour est joué, mais je ne sais pas comment je pourrais faire ça.
 
Merci

Reply

Marsh Posté le 27-03-2005 à 15:54:29    

Mhh... c'est un peu de bidouillage tout ça :)
si t'arrives à récupérer le champs "NOM Prenom", tu peux faire ça pour avoir les deux:
cut -d" " -f 1    -> Le nom
cut -d" " -f 2    -> Le prenom
soit:
NOM=`cat /etc/passwd | cut -f5 -d ":" | cut -d" " -f 1`.`cat /etc/passwd | cut -f5 -d ":" | cut -d" " -f 2`
 
Barbare :whistle:
 
Ceci dis ça répond pas à ton pb, je sais pas trop comment faire :/


Message édité par deather2 le 27-03-2005 à 15:54:48
Reply

Marsh Posté le 27-03-2005 à 16:03:06    

http://forum.hardware.fr/forum2.ph [...] 0&subcat=0

http://forum.hardware.fr/forum2.php?config=hardwarefr.inc&post=24667&cat=11&cache=&sondage=0&owntopic=0&p=1&trash=0&subcat=0


edit: oops ca marche plus :whistle:


Message édité par freds45 le 27-03-2005 à 16:04:52
Reply

Marsh Posté le 27-03-2005 à 16:50:04    

ton "truc" ne marche pas, il me met la liste de "prénom" un point la liste des noms !!!
 

Reply

Marsh Posté le 27-03-2005 à 16:59:05    

cat /etc/passwd | cut -f5 -d ":" | tr " " .

Reply

Marsh Posté le 27-03-2005 à 17:19:47    

merci pillow pour ton astuce !!!
 
et freds45
 
merci


Message édité par mr simon le 27-03-2005 à 17:29:07
Reply

Marsh Posté le 27-03-2005 à 18:11:19    

modifie ton IFS


---------------
Le droit à la différence s'arrête là où ça commence à m'emmerder sérieusement.
Reply

Marsh Posté le 27-03-2005 à 18:23:37    

IFS ?

Reply

Marsh Posté le 27-03-2005 à 18:23:37   

Reply

Marsh Posté le 27-03-2005 à 18:25:24    

IFS=" :"
while read -r a a a a n p a   #sale? où ça?
do
    echo $n.$p
done < /etc/passwd


 
mais il faut faire attention d'utiliser la bonne valeur pour $IFS dans la suite du script.


Message édité par Pillow le 27-03-2005 à 18:26:23
Reply

Marsh Posté le 27-03-2005 à 18:34:48    

mr simon a écrit :

ton "truc" ne marche pas, il me met la liste de "prénom" un point la liste des noms !!!


 

Citation :

[...]et j'aimerais dans mon script avoir Prénom.nom


 :whistle:

Reply

Marsh Posté le 27-03-2005 à 18:39:58    

while read a
do
 
    echo la ligne est $a
done

Reply

Marsh Posté le 27-03-2005 à 22:12:59    

lapiou a écrit :

while read a
do
 
    echo la ligne est $a
done


je pense que le while reagit de la meme facon qu'un for...
Cela veut dire que si dans ta ligne tu as un espace, il va lire la première partie avant l'espace et ensuite une 2ème fois apres l'espace ...
 
Donc avec des espaces, cela ne lire pas ligne par ligne ....
 
je ne sais pas si la solution de pillow fonctionne, je ne connais pas la commande tr et je n'ai pas linux sous la main pour faire un man tr  
cat /etc/passwd | cut -f5 -d ":" | tr " " .
 
mais sinon tu as awk qui pourrait t'etre d'un grand secours en utilisant un sed pour supprimer les espaces.
 

Reply

Marsh Posté le 27-03-2005 à 22:24:14    

weed a écrit :

je pense que le while reagit de la meme facon qu'un for...
Cela veut dire que si dans ta ligne tu as un espace, il va lire la première partie avant l'espace et ensuite une 2ème fois apres l'espace ...
 
Donc avec des espaces, cela ne lire pas ligne par ligne ....

Là c'est le built-in read qui fait tout le travail, et read lit une ligne entière. De plus, si IFS vaut newline , for lit des lignes entières.
 

Citation :

je ne sais pas si la solution de pillow fonctionne, je ne connais pas la commande tr et je n'ai pas linux sous la main pour faire un man tr

tr remplace un caractère par un autre. tr a b est l'équivalent de sed 's/a/b/g'.


Message édité par Pillow le 27-03-2005 à 22:24:28
Reply

Marsh Posté le 28-03-2005 à 12:13:06    

Méthode awk/sed :
cat /etc/passwd |awk -F ":" '{print $5}' |sed 's/ /./'


---------------
"The marketing guys said the HP-35 would be a failure because it was too small, and then we couldn't make them fast enough to meet the demand. The marketing folks don't know everything." - Bill Hewlett
Reply

Sujets relatifs:

Leave a Replay

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