En respuesta al comentario de @Chris que
¡Esto solo funciona para grupos sin espacios en los nombres!
Debo mencionar que la solución aceptada por @c4f4t0r y la solución por @bibi funcionarán en la mayoría de los casos. Estoy ejecutando Cygwin y el Windows
parte de la ecuación es probablemente la razón por la que me encuentro con este problema con más frecuencia. Aún así, un grupo podría hacerse con caracteres no estándar en Linux normal (creo), así que daré la solución para nombres de grupos con espacios. ¡Los espacios siempre hacen la vida divertida!
Daré rápidamente un ejemplo donde los espacios causan un problema. Para ver los nombres de los grupos con espacios, observamos la salida completa de id
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(Nota:hice que la salida fuera un poco más agradable a la vista aquí en StackOverflow).
A partir de esto, vemos que los grupos son {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
Podemos ver el problema con la solución aceptada en este caso.
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
Un par de grupos tienen sus nombres divididos. Para obtener el resultado que queremos, necesitamos usar el comando id, que toma un --zero
( -z
) bandera. Para más detalles sobre todas las banderas pasadas a id
, ver aquí.
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
Nuestro enfoque deberá ser un poco diferente a los anteriores, pero seguirá muchos de los mismos principios:
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
La razón por la que tenemos un awk
un poco más complicado es que siempre hay un final NUL
, que no queremos en este caso. El \
me permite continuar con la siguiente línea con el mismo comando, lo que facilita la lectura. El comando es equivalente a:
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
Por lo que veo, está intentando convertir los grupos de su usuario en un yaml
matriz, intente usar:
echo "groups:" ; for i in $(id -Gn myuser);do echo " - $i" ;done
groups:
- users
- lp
- vboxusers
- kvm
También puedes usar:
echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"
groups: [ myuser, lp, vboxusers, kvm ]
usando bash
:
for i in `groups`; do echo $i; done
usando tr
:
groups | tr \ \\n