Bienvenue visiteur (Inscription |  Connexion)
Qui est en ligne ?
Il y a : 26 utilisateurs en ligne, consultez le détail
Auteur Message
Befa
#0 Message posté le : 27-03-2008 à 22:01:30


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 24-04-2006
Nombre de messages : 133
Bonjour à tous me revoici avec mon analyse de /etc/passwd

Voici mon code :

#!/bin/bash

for i in `cat passwd`

do

        j="1"

        echo "voici la" $j"e ligne : " $i

        j=$j+"1" | bc

        echo "fin de la boucle"

done



J'ai cherché sur le Net mais je n'ai rien trouvé de fonctionnel.

Merci d'avance.

-------------------------------------
Bienvenue dans le monde du libre
tonton nestor
#1 Message posté le : 28-03-2008 à 02:04:28


Maître Jedi


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 8931
Quelque chose comme :

#/bin/bash

nbre=`awk 'END {print NR}' /etc/passwd`

i=1

while (( $i < $nbre )); do

        echo "Voici la ligne $i :"

        head -$i /etc/passwd | tail -1

        i=$(($i + 1))

        done

echo "fin de la boucle"



La commande head avec la redirection sur tail à été trouvé sur le web. Il ya certainement mieux avec awk (ou gawk) ou grep (s'ils permettent d'afficher la nième ligne d'un fichier=.
Enfin je te laisse chercher.

--Message édité par tonton nestor le 28-03-2008 à 02:10:42--
tonton nestor
#2 Message posté le : 28-03-2008 à 02:17:50


Maître Jedi


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 8931
ajout : le for i in `cat passwd` à l'inconvénient te considérer une espace comme un saut de ligne :

sshd:x:22:22:added by portage for openssh:/var/empty:/sbin/nologin

la variable i va prendre 5 valeurs successives à la place d'une seule.

De plus sur ce que tu avais écris, regarde l'initialisation de ta variable j : elle est à l'intérieur de la boucle et non devant.

--Message édité par tonton nestor le 28-03-2008 à 02:18:24--
tamiel
#3 Message posté le : 28-03-2008 à 09:24:23


Hobbit


Forum : Inscrit
Association :
Arrivé(e) le : 17-10-2003
Nombre de messages : 1061

cat -n /etc/passwd |awk '{print "voici la ligne",$0}'



-------------------------------------
If you don't know, ask manpage !
tonton nestor
#4 Message posté le : 28-03-2008 à 11:25:19


Maître Jedi


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 8931
Je me disais bien qu'il devait avoir plus simple
jblecanard
#5 Message posté le : 28-03-2008 à 11:27:13


Elfe


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 3975
On peut aussi utiliser sed, ou $i contient le numéro de la ligne :


cat /etc/passwd | sed "$i""q;d"



Pour avoir le nombre de lignes :


cat /etc/passwd | wc -l



--Message édité par jblecanard le 28-03-2008 à 11:28:20--


-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
Azollyx
#6 Message posté le : 28-03-2008 à 15:14:37


Hobbit


Forum : Modérateur
Association : Président
Arrivé(e) le : 09-04-2006
Nombre de messages : 1978
Le Bash ne sert pas à implémenter des algorithmes mais à combiner d'autres programmes. En d'autres termes, si vous avez l'impression de faire des choses compliquées en Bash, vous pouvez vous dire que ça n'est pas bon... et c'est ce qui fait que le Bash est parfois rageant.
Tamiel vous a donné une excellent solution.

Ceci dit, Befa, pour faire du calcul bash, tu peux effectivement utiliser bc mais plutôt de cette manière :
j=`echo "$j + 1" | bc`
ce qui est assez lourd pour une pauvre somme... expr et let, sont plus simples à utiliser :
let "j = j + 1"
j=`expr $j + 1`
ou beaucoup plus simplement, tu peux passer en mode arithmétique pour faire ton calcul :
((j++))
.
Tonton Nestor > Pour éviter ce problème avec le for, il faut modifier la variable IFS (Internal Field Separator) :
IFS=$'\n'; for l in `cat /etc/passwd`; do echo "$l"; done
.

-------------------------------------
Cherche distributeur manuel/automatique de câlins femelle pour mise en réseau rapprochée.
Nota : je préfèrerais un modèle bien documenté.
tonton nestor
#7 Message posté le : 28-03-2008 à 16:22:27


Maître Jedi


Forum : Inscrit
Association :
Arrivé(e) le : 16-01-2003
Nombre de messages : 8931
Azollyx a écrit :


Tonton Nestor > Pour éviter ce problème avec le for, il faut modifier la variable IFS (Internal Field Separator) :
IFS=$'\n'; for l in `cat /etc/passwd`; do echo "$l"; done
.


Intéressant, je vais essayer de le noter quelque part...