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

标签 linux unix sed yaml

我尝试了 getent、组命令、id -Gn $user 和一些 sed 组合,但我认为我无法实现,因此请与其他程序员联系。
我希望能够打印这个:groups abc123
输出 abc123 : devops 构建测试设计

预期输出
群组:
- 开发运营
- build
- 测试
- 设计

最佳答案

响应comment通过@Chris 那个

This only works for groups without spaces in the names!

我应该提到@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}'

关于linux - 如何在多行而不是单行输出上打印 linux 组名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34766078/

相关文章:

macos - 从 shell 脚本 (Unix) 中关闭终端窗口?

linux - 如果缓冲区大小太小而无法容纳 read() 系统调用返回的读取数据,会发生什么情况?

bash - 使用 sed 脚本从文本文件中删除时间戳

bash - 如何提取具有公共(public)字段的行

bash - 如何使用 sed 找到一个模式,然后找到第二个模式,然后仅在第二个模式之后附加文本?

linux - 使用 pthread 的工作队列

linux - 优化基于MAC地址匹配提取子串的bash脚本

linux - 为 bash 脚本设置默认输入

linux - sed 替换字符串结尾略有不同的相同模式

c - UNIX:退出时等待进程子进程?