考虑到所有带有 id >= 1000
的用户都是非系统用户,我们该如何在一个命令中获取这些用户的列表?
您需要获取所有gid
大于或等于1000的用户。请使用以下命令:
awk -F: '($3>=1000)&&($1!="nobody"){print $1}' /etc/passwd
如果您想要系统用户(gid<1000),则为:
awk -F: '($3<1000){print $1}' /etc/passwd
libvirt-qemu
安装时的 GID 是 64055。我留下了一个答案,展示如何忽略像 libvirt-qemu
这样的系统用户:https://dev59.com/YlwX5IYBdhLWcg3w-Tlv#62051801 - Nick ODellawk -F: '$3 >= 1000' /etc/passwd
/etc/passwd
文件,然后如果第3个字段(用户ID)大于或等于1000,则打印整个/etc/passwd
记录。awk -F: '$3 >= 1000 {print $1}' /etc/passwd
其中$1是/etc/passwd
文件的第一个字段,即用户名。
/etc/passwd
中记录的用户,而不是通过远程服务(如LDAP、NIS或Winbind)进行身份验证的用户),您可以使用grep
、sed
或awk
从/etc/passwd
中提取数据。其中,awk
最为灵活,但是您是否考虑过使用sed
来解决问题呢?sed -n '/^\([^:]\+\):[^:]\+:[1-9][0-9]\{3\}/ { s/:.*//; p }' /etc/passwd
您需要忽略小于1000的GID,同时也要忽略大于60000的GID。Ubuntu/Debian将这些保留给各种系统服务。
awk -F: '($3>=1000)&&($3<60000)&&($1!="nobody"){print $1}' /etc/passwd
以下是使用Ansible和awk
在所有机器上执行此操作的答案,基于JNevill的回答:
ansible -i inventories/cd_staging all -m shell -a "awk -F: '\$3 >= 1000 && \$7 \!~ /nologin/ {print \$1}' \/etc\/passwd |sort"