如何在多行而不是单行输出上打印linux组名

时间:2016-01-13 11:56:02

标签: linux unix sed yaml

我已经尝试了getent,group命令,id -Gn $ user和一些sed组合,但我认为我无法实现与其他程序员的联系。 我希望能够打印出来:group abc123
产量 abc123:devops构建测试设计

预期输出
组:
   - devops
   - 建造
   - 测试
   - 设计

3 个答案:

答案 0 :(得分:4)

回应@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}'

答案 1 :(得分:0)

使用bash

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

使用tr

groups | tr \  \\n

答案 2 :(得分:0)

从我看到的,您正在尝试将用户组转换为yaml数组,尝试使用:

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

groups:
  - users
  - lp
  - vboxusers
  - kvm

您也可以使用:

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

groups: [ myuser, lp, vboxusers, kvm ]