Quelle la manière la plus efficace/élégante/simple... avec bash de lire les
lignes d'un fichier du style /etc/passwd et récupérer des éléments de chaque
ligne sous forme de variable ? Dans ce cas-ci, je voudrais donner à $account
la valeur du 1er champs, à $GECOS celle du 5ème, etc.
Sed me semblait approprié pour sélectionner des lignes et éventuellement y
apporter des transformations. Mais pour attribuer un nom de variable à chaque
champs, je ne vois pas.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pascal Bourguignon
(Gauthier) writes:
bonjour à tous,
Quelle la manière la plus efficace/élégante/simple... avec bash de lire les lignes d'un fichier du style /etc/passwd et récupérer des éléments de chaque ligne sous forme de variable ? Dans ce cas-ci, je voudrais donner à $account la valeur du 1er champs, à $GECOS celle du 5ème, etc.
Sed me semblait approprié pour sélectionner des lignes et éventuellement y apporter des transformations. Mais pour attribuer un nom de variable à chaque champs, je ne vois pas.
while IFS=: read account password uid gid GECOS home shell ; do echo $account $GECOS done < /etc/passwd
Le champs GECOS est subdivisé: users fullname, office room number, office phone number and home phone number.
while IFS=: read account password uid gid GECOS home shell ; do echo "$GECOS" | ( IFS=, read fullname office_room office_phone home_phone echo "$account ($fullname,$office_room,$office_phone,$home_phone)" ) done < /etc/passwd
-- __Pascal_Bourguignon__ . * * . * .* . http://www.informatimago.com/ . * . .* * . . / ( . . * Living free in Alaska or in Siberia, a . . / . . * . grizzli's life expectancy is 35 years, .*. / * . . but no more than 8 years in captivity. . /* o . http://www.theadvocates.org/ * '''||''' . SCO Spam-magnet: ******************
Quelle la manière la plus efficace/élégante/simple... avec bash de lire les
lignes d'un fichier du style /etc/passwd et récupérer des éléments de chaque
ligne sous forme de variable ? Dans ce cas-ci, je voudrais donner à $account
la valeur du 1er champs, à $GECOS celle du 5ème, etc.
Sed me semblait approprié pour sélectionner des lignes et éventuellement y
apporter des transformations. Mais pour attribuer un nom de variable à chaque
champs, je ne vois pas.
while IFS=: read account password uid gid GECOS home shell ; do
echo $account $GECOS
done < /etc/passwd
Le champs GECOS est subdivisé:
users fullname, office room number, office phone number and home phone number.
while IFS=: read account password uid gid GECOS home shell ; do
echo "$GECOS"
| ( IFS=, read fullname office_room office_phone home_phone
echo "$account ($fullname,$office_room,$office_phone,$home_phone)"
)
done < /etc/passwd
--
__Pascal_Bourguignon__ . * * . * .* .
http://www.informatimago.com/ . * . .*
* . . / ( . . *
Living free in Alaska or in Siberia, a . . / . . * .
grizzli's life expectancy is 35 years, .*. / * . .
but no more than 8 years in captivity. . /* o .
http://www.theadvocates.org/ * '''||''' .
SCO Spam-magnet: postmaster@sco.com ******************
Quelle la manière la plus efficace/élégante/simple... avec bash de lire les lignes d'un fichier du style /etc/passwd et récupérer des éléments de chaque ligne sous forme de variable ? Dans ce cas-ci, je voudrais donner à $account la valeur du 1er champs, à $GECOS celle du 5ème, etc.
Sed me semblait approprié pour sélectionner des lignes et éventuellement y apporter des transformations. Mais pour attribuer un nom de variable à chaque champs, je ne vois pas.
while IFS=: read account password uid gid GECOS home shell ; do echo $account $GECOS done < /etc/passwd
Le champs GECOS est subdivisé: users fullname, office room number, office phone number and home phone number.
while IFS=: read account password uid gid GECOS home shell ; do echo "$GECOS" | ( IFS=, read fullname office_room office_phone home_phone echo "$account ($fullname,$office_room,$office_phone,$home_phone)" ) done < /etc/passwd
-- __Pascal_Bourguignon__ . * * . * .* . http://www.informatimago.com/ . * . .* * . . / ( . . * Living free in Alaska or in Siberia, a . . / . . * . grizzli's life expectancy is 35 years, .*. / * . . but no more than 8 years in captivity. . /* o . http://www.theadvocates.org/ * '''||''' . SCO Spam-magnet: ******************
Stephane Chazelas
2003-12-06, 04:08(+01), Pascal Bourguignon: [...]
while IFS=: read account password uid gid GECOS home shell ; do echo $account $GECOS done < /etc/passwd
Plus sage d'utiliser awk ici.
manque l'option -r à read et tu as oublié de quoter $account et $GECOS
Le champs GECOS est subdivisé: users fullname, office room number, office phone number and home phone number.
Ça dépend des systèmes, ce n'est pas standardisé.
Là encore, préférer awk ou perl, faire une boucle de traitement de texte en shell est ÀMHA une mauvaise idée dans tous les cas.
while IFS=: read account password uid gid GECOS home shell ; do echo $account $GECOS done < /etc/passwd
Plus sage d'utiliser awk ici.
manque l'option -r à read et tu as oublié de quoter $account et $GECOS
Oui, celà va sans dire, mais pas sans les écrire...
Le champs GECOS est subdivisé: users fullname, office room number, office phone number and home phone number.
Ça dépend des systèmes, ce n'est pas standardisé.
C'est tellement vieux le GECOS (ça date d'avant unix!) que c'est surement la même chose partout (sauf mutations dégénératives d'accord...).
Là encore, préférer awk ou perl, faire une boucle de traitement de texte en shell est ÀMHA une mauvaise idée dans tous les cas.
Non! Pourquoi forker des process et se rendre dépendant de commande externes qui ne seront peut être pas disponibles sur la machine cible? Si ça peut se faire facilement en shell, pas de problème.
-- __Pascal_Bourguignon__ . * * . * .* . http://www.informatimago.com/ . * . .* There is no worse tyranny than to force * . . / () . * a man to pay for what he does not . . / . . * . want merely because you think it .*. / * . . would be good for him. -- Robert Heinlein . /* o . http://www.theadvocates.org/ * '''||''' . SCO Spam-magnet: ******************
while IFS=: read account password uid gid GECOS home shell ; do
echo $account $GECOS
done < /etc/passwd
Plus sage d'utiliser awk ici.
manque l'option -r à read et tu as oublié de quoter $account et
$GECOS
Oui, celà va sans dire, mais pas sans les écrire...
Le champs GECOS est subdivisé:
users fullname, office room number, office phone number and home
phone number.
Ça dépend des systèmes, ce n'est pas standardisé.
C'est tellement vieux le GECOS (ça date d'avant unix!) que c'est
surement la même chose partout (sauf mutations dégénératives
d'accord...).
Là encore, préférer awk ou perl, faire une boucle de traitement
de texte en shell est ÀMHA une mauvaise idée dans tous les cas.
Non! Pourquoi forker des process et se rendre dépendant de commande
externes qui ne seront peut être pas disponibles sur la machine
cible? Si ça peut se faire facilement en shell, pas de problème.
--
__Pascal_Bourguignon__ . * * . * .* .
http://www.informatimago.com/ . * . .*
There is no worse tyranny than to force * . . / () . *
a man to pay for what he does not . . / . . * .
want merely because you think it .*. / * . .
would be good for him. -- Robert Heinlein . /* o .
http://www.theadvocates.org/ * '''||''' .
SCO Spam-magnet: postmaster@sco.com ******************
while IFS=: read account password uid gid GECOS home shell ; do echo $account $GECOS done < /etc/passwd
Plus sage d'utiliser awk ici.
manque l'option -r à read et tu as oublié de quoter $account et $GECOS
Oui, celà va sans dire, mais pas sans les écrire...
Le champs GECOS est subdivisé: users fullname, office room number, office phone number and home phone number.
Ça dépend des systèmes, ce n'est pas standardisé.
C'est tellement vieux le GECOS (ça date d'avant unix!) que c'est surement la même chose partout (sauf mutations dégénératives d'accord...).
Là encore, préférer awk ou perl, faire une boucle de traitement de texte en shell est ÀMHA une mauvaise idée dans tous les cas.
Non! Pourquoi forker des process et se rendre dépendant de commande externes qui ne seront peut être pas disponibles sur la machine cible? Si ça peut se faire facilement en shell, pas de problème.
-- __Pascal_Bourguignon__ . * * . * .* . http://www.informatimago.com/ . * . .* There is no worse tyranny than to force * . . / () . * a man to pay for what he does not . . / . . * . want merely because you think it .*. / * . . would be good for him. -- Robert Heinlein . /* o . http://www.theadvocates.org/ * '''||''' . SCO Spam-magnet: ******************