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



当前,当我对创建的访问者组运行grep命令时

grep visitors:x:1011: /etc/group

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

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

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

ellipsiscoterie
magnetcommonest
wizardmeans
beakskeletal
lemonwellmade
ralphpaperclips

我建议用sed代替grep

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

UPD:sed部分的详细说明在这里。您可以在这里找到tr示例

使用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

使用您显示的示例,请尝试以下awk程序。

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

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

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

解释:简单的解释是,将所有行的字段分隔符设置为:。然后在主程序中,如果行从visitors:x:1011开始,并且字段数为4,则在第4个字段中全局替换逗号,并将其打印出来。



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

awk -F':' '/^visitors:x:1011/ && NF==4{if($4==""){print "NO entry found in /etc/group"} else{gsub(/,/,ORS,$4);print $4};exit}' /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;$0=$4;$1=$1}1'

可以使用awk:

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

如果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
  • initial regexp:如果该行开头匹配visitors:,执行以下操作。
  • 的操作:使用sub()消除:后面的所有字符,然后使用gsub()替换ORS的默认值。

相关内容