GNU/Linux >> Znalost Linux >  >> Linux

Jak tisknout názvy linuxových skupin na více řádcích namísto jednořádkového výstupu

V reakci na komentář @Chris that

Toto funguje pouze pro skupiny bez mezer v názvech!

Měl bych zmínit, že přijaté řešení od @c4f4t0r a řešení od @bibi bude ve většině případů fungovat. Používám Cygwin a Windows součástí rovnice je pravděpodobně důvod, proč jsem na tento problém narážel častěji. Přesto by skupina mohla být vytvořena s nestandardními znaky v normálním Linuxu (myslím), takže uvedu řešení pro názvy skupin s mezerami. Prostory vždy dělají život zábavou!

Rychle uvedu příklad, kdy mezery způsobují problém. Abychom viděli názvy skupin s mezerami, podíváme se na celý výstup id

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

(Poznámka:Zde na StackOverflow jsem udělal výstup trochu příjemnějšímu pro oko.)

Z toho vidíme, že skupiny jsou {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}

V tomto případě vidíme problém s přijatým řešením.

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

Několik skupin si rozdělí jména. Abychom získali požadovaný výstup, musíme použít příkaz id, který má --zero ( -z ) vlajka. Další podrobnosti o všech příznacích předaných do id , viz zde.

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

Náš přístup se bude muset trochu lišit od těch, které jsou uvedeny výše, ale řídit se mnoha stejnými zásadami:

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

Důvod, proč máme trochu komplikovanější awk je, že vždy je na konci NUL , což v tomto případě nechceme. \ umožňuje mi pokračovat na další řádek se stejným příkazem, což usnadňuje čtení. Příkaz je ekvivalentní:

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

Z toho, co vidím, se snažíte převést skupiny svého uživatele na yaml pole, zkuste použít:

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

groups:
  - users
  - lp
  - vboxusers
  - kvm

Můžete také použít:

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

groups: [ myuser, lp, vboxusers, kvm ]

pomocí bash :

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

pomocí tr :

groups | tr \  \\n

Linux
  1. Jak přidat uživatele do skupiny v Linuxu

  2. Jak komprimovat více souborů v systému Linux

  3. Jak vytvořit každý výběr nabídky v 1 řádku namísto více výběrů v 1 řádku?

  1. Jak tisknout víceřádkový výstup na stejném řádku?

  2. Jak vymažu tištěné znaky v konzolové aplikaci (Linux)?

  3. Jak mohu uvést jeden název souboru na výstupní řádek v Linuxu?

  1. Jak načíst verzi Java pomocí jednořádkového příkazu v Linuxu

  2. Jak nahradit řetězec ve více souborech v příkazovém řádku linuxu

  3. Jak dostat ps do tiskové skupiny?