如何在 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'
一种选择是使用 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 useradd
和 man 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
。
目前,当我 运行 在我创建的访客组上执行 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'
一种选择是使用 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
中。 Returnsusers
中的元素数并将其放入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 useradd
和 man 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
。