当前,当我对创建的访问者组运行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 useradd
和man 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
的默认值。