如何在 Linux bash 中为每个用户在一行中显示组下的用户

how to display users under a group in a line for each user in Linux bash

目前,当我 运行 在我创建的访客组上执行 grep 命令时

grep visitors:x:1011: /etc/group

这是上述命令的示例结果,因为实际结果太长了。

visitors:x:1011:ellipsiscoterie,magnetcommonest,wizardmeans,beakskeletal,lemonwellmade,ralphpaperclips etc..

如何显示上面的结果如下所示(没有 visitors:x:1101 和分隔逗号),因为我很难做到。

ellipsiscoterie
magnetcommonest
wizardmeans
beakskeletal
lemonwellmade
ralphpaperclips

我建议使用 sed 而不是 grep

sed -n -e 's/^visitors\:x\:1011\://p' /etc/group | tr ',' '\n'

更新:sed 部分的详细解释是 here. tr examples you can find here

一种选择是使用 awk:

awk -F: ' == "visitors" {
    size = split(, users, ",");
    for(i=1; i<=size; ++i) print users[i];
    exit }' /etc/group
  • -F: - 使用:作为字段分隔符
  • == "visitors" - 如果第一个字段匹配 visitors 执行以下语句(在 { ... } 内)
  • size = split(, users, ","); - 拆分 , 上的 4:th 字段并将结果存储在数组 users 中。 Returns users 中的元素数并将其放入 size.
  • for 循环 - 遍历 users 中的所有元素并打印出来。
  • exit - 终止 awk - 无需继续阅读文件的其余部分。

使用 awk,您可以使用 -F: 将字段分隔为冒号,并检查字符串是否以 visitors:x:1011:

开头

由于逗号分隔值似乎总是在末尾,因此将最后一个字段 $NF 拆分为逗号并循环拆分值。

awk -F: '
/^visitors:x:1011:/ {
  count=split($NF, ary, ",");
  for(i=1; i<=count; i++) print ary[i];
}' /etc/group

查询组和用户的一个好方法是使用 getent 命令,因为它也适用于 ldap 系统。

$ getent group visitors | cut -d: -f4 | tr ',' '\n'

在标准系统上,这将始终有效,因为用户名和组名不能包含 <逗号> 字符或 <冒号> 字符。 (如果你有一个非标准的 Linux 或 Unix 系统,请参阅 man useraddman groupadd 来检查用户名和组名规则)

如果您想使用 awk 而不是这个小管道,那么一个优雅但神秘的版本将是:

$ getent group visitors | awk -F: '{FS=",";OFS=ORS;[=11=]=;=}1'

使用您显示的示例,请尝试遵循 awk 程序。

awk -F':' '/^visitors:x:1011/ && NF==4{gsub(/,/,ORS,);print }' /etc/group

如果条目 visitors:x:1011 在您的文件中只出现一次,请尝试以下操作:

awk -F':' '/^visitors:x:1011/ && NF==4{gsub(/,/,ORS,);print ;exit}' /etc/group

解释: 简单的解释就是,将所有行的字段分隔符设为 :。然后在主程序中,检查条件是否行从 visitors:x:1011 开始并且字段数为 4 然后在第 4 个字段中用换行符(ORS)全局替换逗号并打印它。



OR 如果带有 visitors:x:1011 的行出现一次并且第 4 个字段为 NULL(意味着没有条目存在,这在某些情况下)并且您想为其打印消息,然后尝试以下操作:

awk -F':' '/^visitors:x:1011/ && NF==4{if(==""){print "NO entry found in /etc/group"} else{gsub(/,/,ORS,);print };exit}' /etc/group

如果grep visitors:x:1011: /etc/group的结果是文本行:

visitors:x:1011:ellipsiscoterie,magnetcommonest,wizardmeans,beakskeletal,lemonwellmade,ralphpaperclips

你可以试试这个 awk:

awk '/^visitors:/ {sub(/([^:]+:)+/,"");gsub(/,/, ORS)} 1' file
ellipsiscoterie
magnetcommonest
wizardmeans
beakskeletal
lemonwellmade
ralphpaperclips
  • 初始正则表达式:如果该行在开头匹配 visitors:,请执行以下操作。
  • 操作:使用sub()消除所有字符直到最后:,然后使用gsub()替换,所有逗号替换为默认值ORS