GNU/Linux >> Linux Esercitazione >  >> Linux

Come stampare i nomi dei gruppi Linux su più righe anziché su un'unica riga

In risposta al commento di @Chris that

Funziona solo per i gruppi senza spazi nei nomi!

Devo menzionare che la soluzione accettata da @ c4f4t0r e la soluzione da @bibi funzioneranno nella maggior parte dei casi. Sto eseguendo Cygwin e Windows parte dell'equazione è probabilmente il motivo per cui ho riscontrato questo problema più spesso. Tuttavia, un gruppo potrebbe essere creato con caratteri non standard nel normale Linux (credo), quindi fornirò la soluzione per i nomi di gruppo con spazi. Gli spazi rendono sempre la vita divertente!

Darò rapidamente un esempio in cui gli spazi causano un problema. Per vedere i nomi dei gruppi con gli spazi, esaminiamo l'intero output di id

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

(Nota:ho reso l'output un po' più gradevole alla vista qui su StackOverflow.)

Da questo, vediamo che i gruppi sono {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}

Possiamo vedere il problema con la soluzione accettata in questo caso.

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

Un paio di gruppi si dividono i nomi. Per ottenere l'output che vogliamo, dobbiamo usare il comando id, che accetta un --zero ( -z ) bandiera. Per maggiori dettagli su tutti i flag passati a id , vedere qui.

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

Il nostro approccio dovrà essere leggermente diverso da quelli indicati sopra, ma seguire molti degli stessi principi:

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

Il motivo per cui abbiamo un awk leggermente più complicato è che c'è sempre un NUL finale , che non vogliamo in questo caso. L'\ mi permette di continuare sulla riga successiva con lo stesso comando, rendendo le cose più facili da leggere. Il comando è equivalente a:

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

Da quello che vedo, stai cercando di convertire i gruppi del tuo utente in un yaml array, prova a usare:

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

groups:
  - users
  - lp
  - vboxusers
  - kvm

Puoi usare anche tu:

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

groups: [ myuser, lp, vboxusers, kvm ]

utilizzando bash :

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

utilizzando tr :

groups | tr \  \\n

Linux
  1. Come crittografare un singolo filesystem Linux

  2. Come comprimere più file su Linux

  3. Come posso cancellare i caratteri stampati in un'applicazione console (Linux)?

  4. Come eseguo più comandi in background in bash in una singola riga?

  5. Come concatenare più righe di output in una riga?

Come aggiungere un utente al gruppo in Linux

Come elencare i gruppi in Linux

Come creare gruppi in Linux (comando groupadd)

Come eseguire più comandi Linux in un unico comando

Comandi di gestione dei gruppi in Linux

Come faccio a stampare una pagina grande su più pagine più piccole?