GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So drucken Sie Linux-Gruppennamen in mehreren Zeilen anstelle einer einzeiligen Ausgabe

Als Antwort auf den Kommentar von @Chris, dass

Dies funktioniert nur für Gruppen ohne Leerzeichen im Namen!

Ich sollte erwähnen, dass die akzeptierte Lösung von @c4f4t0r und die Lösung von @bibi in den meisten Fällen funktionieren werden. Ich verwende Cygwin und den Windows Ein Teil der Gleichung ist wahrscheinlich, warum ich dieses Problem häufiger treffe. Trotzdem könnte eine Gruppe mit nicht standardmäßigen Zeichen in normalem Linux erstellt werden (glaube ich), also gebe ich die Lösung für Gruppennamen mit Leerzeichen. Mit Spaces macht das Leben immer Spaß!

Ich werde schnell ein Beispiel geben, wo Leerzeichen ein Problem verursachen. Um die Gruppennamen mit Leerzeichen zu sehen, sehen wir uns die gesamte Ausgabe von id an

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

(Anmerkung:Ich habe die Ausgabe hier auf StackOverflow etwas ansprechender gestaltet.)

Daraus sehen wir, dass die Gruppen {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'} sind

Wir können das Problem mit der akzeptierten Lösung in diesem Fall sehen.

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

Ein paar Gruppen bekommen ihre Namen aufgeteilt. Um die gewünschte Ausgabe zu erhalten, müssen wir den id-Befehl verwenden, der einen --zero akzeptiert ( -z ) Flagge. Weitere Einzelheiten zu allen an id übergebenen Flags , siehe hier.

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

Unser Ansatz muss sich etwas von den oben genannten unterscheiden, aber weitgehend denselben Prinzipien folgen:

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

Der Grund dafür, dass wir einen etwas komplizierteren awk haben ist, dass immer ein NUL nachgestellt wird , was wir in diesem Fall nicht wollen. Die \ ermöglicht es mir, mit demselben Befehl in der nächsten Zeile fortzufahren, was das Lesen erleichtert. Der Befehl ist äquivalent zu:

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

Soweit ich sehe, versuchen Sie, die Gruppen Ihres Benutzers in einen yaml umzuwandeln Array, versuchen Sie es mit:

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

groups:
  - users
  - lp
  - vboxusers
  - kvm

Sie können auch verwenden:

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

groups: [ myuser, lp, vboxusers, kvm ]

mit bash :

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

mit tr :

groups | tr \  \\n

Linux
  1. Wie lösche ich gedruckte Zeichen in einer Konsolenanwendung (Linux)?

  2. Wie liste ich einen Dateinamen pro Ausgabezeile in Linux auf?

  3. So rufen Sie die Java-Version mit einem einzeiligen Befehl unter Linux ab

  4. So ersetzen Sie eine Zeichenfolge in mehreren Dateien in der Linux-Befehlszeile

  5. Wie führe ich mehrere Hintergrundbefehle in Bash in einer einzigen Zeile aus?

So fügen Sie einen Benutzer zu einer Gruppe in Linux hinzu

Wie man Gruppen in Linux auflistet

So erstellen Sie Gruppen unter Linux (Befehl groupadd)

So führen Sie mehrere Linux-Befehle in einem einzigen Befehl aus

Gruppenverwaltungsbefehle in Linux

Wie drucke ich eine große Seite auf mehrere kleinere Seiten?