GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo imprimir nombres de grupos de Linux en varias líneas en lugar de una sola línea de salida

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

Linux
  1. Cómo agregar un usuario a un grupo en Linux

  2. Cómo comprimir varios archivos en Linux

  3. ¿Cómo borro caracteres impresos en una aplicación de consola (Linux)?

  4. ¿Cómo ejecuto múltiples comandos en segundo plano en bash en una sola línea?

  5. ¿Cómo imprimir la salida del comando Linux en un archivo?

Cómo agregar un usuario a un grupo en Linux

Cómo enumerar grupos en Linux

Cómo crear grupos en Linux (comando groupadd)

Cómo ejecutar múltiples comandos de Linux en un solo comando

Comandos de gestión de grupos en Linux

¿Cómo imprimo una página grande en varias páginas más pequeñas?