GNU/Linux >> Tutoriels Linux >  >> Linux

Comment imprimer les noms de groupe Linux sur plusieurs lignes au lieu d'une sortie sur une seule ligne

En réponse au commentaire de @Chris qui

Cela ne fonctionne que pour les groupes sans espaces dans les noms !

Je dois mentionner que la solution acceptée par @c4f4t0r et la solution par @bibi fonctionneront dans la plupart des cas. J'utilise Cygwin et le Windows une partie de l'équation est probablement la raison pour laquelle je rencontre ce problème plus souvent. Pourtant, un groupe pourrait être créé avec des caractères non standard dans Linux normal (je pense), je vais donc donner la solution pour les noms de groupe avec des espaces. Les espaces rendent toujours la vie amusante !

Je vais rapidement donner un exemple où les espaces posent problème. Pour voir les noms de groupe avec des espaces, nous regardons la sortie entière de id

$ id
uid=1(me) gid=545(Users) 
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)

(Remarque :j'ai rendu la sortie un peu plus agréable à l'œil ici sur StackOverflow.)

De cela, nous voyons que les groupes sont {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}

Nous pouvons voir le problème avec la solution acceptée dans ce cas.

$ echo "groups:" ; for i in $(id -Gn);do echo "  - $i" ;done
    groups:
      - Users
      - CONSOLE
      - LOGON
      - Authenticated
      - Users
      - CurrentSession
      - LOCAL

Quelques groupes voient leurs noms divisés. Pour obtenir la sortie que nous voulons, nous devons utiliser la commande id, qui prend un --zero ( -z ) drapeau. Pour plus de détails sur tous les drapeaux passés à id , voir ici.

$ man id | grep -A 1 "\-\-zero"
       -z, --zero
              delimit entries with NUL characters, not whitespace;

Notre approche devra être un peu différente de celles indiquées ci-dessus, mais suivre en grande partie les mêmes principes :

$ echo "groups:"; printf "%s" "  - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n  - "}{NF--; print}'
groups:
  - Users
  - CONSOLE LOGON
  - Authenticated Users
  - CurrentSession
  - LOCAL

La raison pour laquelle nous avons un awk un peu plus compliqué est qu'il y a toujours un NUL à la fin , ce que nous ne voulons pas dans ce cas. Le \ me permet de passer à la ligne suivante avec la même commande, ce qui facilite la lecture. La commande est équivalente à :

$ echo "groups:"; printf "%s" "  - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n  - "}{NF--; print}'

D'après ce que je vois, vous essayez de convertir les groupes de votre utilisateur en un yaml tableau, essayez d'utiliser :

echo "groups:" ; for i in $(id -Gn myuser);do echo "  - $i" ;done

groups:
  - users
  - lp
  - vboxusers
  - kvm

Vous pouvez également utiliser :

echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"

groups: [ myuser, lp, vboxusers, kvm ]

en utilisant bash :

for i in `groups`; do echo $i; done

en utilisant tr :

groups | tr \  \\n

Linux
  1. Comment ajouter un utilisateur à un groupe sous Linux

  2. Comment compresser plusieurs fichiers sous Linux

  3. Comment faire chaque sélection de menu sur 1 ligne au lieu de plusieurs sélections sur 1 ligne ?

  4. Comment imprimer une sortie multiligne sur la même ligne ?

  5. Comment effacer les caractères imprimés dans une application console (Linux) ?

Comment ajouter un utilisateur à un groupe sous Linux

Comment lister les groupes sous Linux

Comment créer des groupes sous Linux (commande groupadd)

Comment exécuter plusieurs commandes Linux en une seule commande

Commandes de gestion de groupe sous Linux

Comment imprimer une grande page sur plusieurs pages plus petites ?