回应@Chris 的comment
这仅适用于名称中没有空格的组!
我应该提到@c4f4t0r 接受的解决方案和@bibi 的解决方案在大多数情况下都可以工作。我正在运行 Cygwin,等式的 Windows 部分可能是我更经常遇到这个问题的原因。不过,在普通 Linux 中可以使用非标准字符创建一个组(我认为),所以我将给出带有空格的组名的解决方案。空间总是让生活充满乐趣!
我将快速举一个空格导致问题的示例。要查看带空格的组名,我们查看id 的整个输出
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(注意:我确实在 StackOverflow 上使输出更令人赏心悦目。)
由此,我们看到群组是{'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
在这种情况下,我们可以看到accepted solution 的问题。
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
几个小组的名字被分开了。为了得到我们想要的输出,我们需要使用 id 命令,它带有一个--zero (-z) 标志。有关传递给id 的所有标志的更多详细信息,请参阅here。
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
我们的方法需要与上面给出的方法有些不同,但遵循许多相同的原则:
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
我们有一个稍微复杂的awk 的原因是总是有一个尾随NUL,在这种情况下我们不想要它。 \ 允许我使用相同的命令继续到下一行,使事情更容易阅读。该命令相当于:
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'