我正在使用“getent passwd | cut -d:-f 1 | xargs groups> users.txt”,但这会列出所有用户及其所在的群组。在我的情况下,有成千上万的用户我只需要用户列表特定组的一部分。
当前输出是pic我不需要linux_users组的成员
答案 0 :(得分:0)
您可以通过管道grep来缩小您获得的列表范围。使用类似grep groupname
。
Grep:http://www.gnu.org/software/grep/manual/grep.html
然后你可以使用awk只获得一行的一部分。
Awk:http://tldp.org/LDP/abs/html/awk.html
所以在你的情况下你可以这样做:getent passwd | cut -d : -f 1 | xargs groups | grep linux_admins | awk {'print $1'} > users.txt
答案 1 :(得分:0)
/etc/group
中的每条记录都以一组用户列表作为其补充组(参见http://linux.die.net/man/5/group)。
要获取目标组的所有成员,您需要获得那些以及将目标组作为主要组的所有用户(在/ etc / passwd中,由/etc/group中提到的目标组编号标识)。
这个脚本会让你们两个(你可以称之为group_ls或类似的东西):
#!/bin/sh
num_membs="$( getent group "$1" |cut -d: -f3,4 )"
num="${num_membs%:*}"; membs="${num_membs#*:}"
( IFS=,
printf '%s\n' $membs
awk -v num=$num -F: ' $4 == num { print $1 } ' /etc/passwd
) | sort -u
或者,根据您的方法
getent passwd | cut -d : -f 1 | xargs groups |
grep ":.* $1 .*" |cut -d : -f1
也应该这样做。
答案 2 :(得分:0)
您还可以使用以下内容将bash中与组关联的用户列表(例如:users
)读入数组:
IFS=$',\n' read -a names < <(grep '^users:' /etc/group | sed 's/^.*://')
然后,您可以通过简单的循环访问每个用户,例如
for i in ${names[@]}; do echo "$i"; done
这仅适用于支持索引数组和进程替换的shell,否则需要管道体操。