GNU/Linux >> Belajar Linux >  >> Linux

Cara mencetak nama grup linux pada banyak baris alih-alih keluaran satu baris

Menanggapi komentar oleh @Chris that

Ini hanya berfungsi untuk grup tanpa spasi di namanya!

Saya harus menyebutkan bahwa solusi yang diterima oleh @ c4f4t0r dan solusi oleh @bibi akan berfungsi dalam banyak kasus. Saya menjalankan Cygwin, dan Windows bagian dari persamaan mungkin mengapa saya lebih sering mengalami masalah ini. Tetap saja, grup dapat dibuat dengan karakter non-standar di Linux normal (menurut saya), jadi saya akan memberikan solusi untuk nama grup dengan spasi. Ruang selalu membuat hidup menyenangkan!

Saya akan segera memberikan contoh di mana spasi menyebabkan masalah. Untuk melihat nama grup dengan spasi, kita melihat keseluruhan output dari id

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

(Catatan:Saya memang membuat hasilnya sedikit lebih enak dipandang di sini di StackOverflow.)

Dari sini, kita melihat bahwa grupnya adalah {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}

Kami dapat melihat masalah dengan solusi yang diterima dalam kasus ini.

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

Beberapa kelompok mendapatkan nama mereka berpisah. Untuk mendapatkan output yang kita inginkan, kita perlu menggunakan perintah id, yang membutuhkan --zero ( -z ) bendera. Untuk detail selengkapnya tentang semua flag yang diteruskan ke id , lihat di sini.

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

Pendekatan kami harus sedikit berbeda dengan yang diberikan di atas, tetapi mengikuti banyak prinsip yang sama:

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

Alasan kami memiliki awk yang sedikit lebih rumit adalah bahwa selalu ada NUL yang tertinggal , yang tidak kita inginkan dalam kasus ini. \ memungkinkan saya untuk melanjutkan ke baris berikutnya dengan perintah yang sama, membuatnya lebih mudah dibaca. Perintah ini setara dengan:

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

Dari apa yang saya lihat, Anda mencoba mengonversi grup pengguna Anda menjadi yaml larik, coba gunakan:

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

groups:
  - users
  - lp
  - vboxusers
  - kvm

Anda juga dapat menggunakan:

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

groups: [ myuser, lp, vboxusers, kvm ]

menggunakan bash :

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

menggunakan tr :

groups | tr \  \\n

Linux
  1. Bagaimana cara mendaftar satu nama file per baris keluaran di Linux?

  2. Cara mengambil versi Java menggunakan perintah baris tunggal di Linux

  3. Cara mengganti string dalam banyak file di baris perintah linux

  1. Bagaimana cara menambahkan pengguna ke grup di Linux

  2. Bagaimana cara menggabungkan beberapa baris keluaran menjadi satu baris?

  3. Bagaimana cara mendapatkan ps untuk mencetak grup?

  1. Cara Membuat Zip Banyak File di Linux

  2. Bagaimana Cara Membuat Setiap Pilihan Menu Dalam 1 Baris Alih-alih Beberapa Pilihan Dalam 1 Baris?

  3. Bagaimana Mencetak Output Multiline Pada Baris Yang Sama?