Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Bash] traitement d'un fichier ligne par ligne

3 réponses
Avatar
alouest.du.soleil
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.

Merci d'avance

--
^^ Gauthier
(_____/°°-ç
| \_`-"
)/@mmm||
\nn \nn FOE-Belgium : http://www.amisdelaterre.be

3 réponses

Avatar
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: ******************

Avatar
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.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Pascal Bourguignon
Stephane Chazelas writes:

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


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: ******************