从/etc/passwd
开始,我只需要“用户”部分。
示例:
backup:x:34:34:backup:/var/backups:/bin/sh
以backup
为用户。
要提取我现在正在使用的用户部分:
perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd
这比我的旧方法少了几个字符:
while read line; do echo ${line%%:*}; done < /etc/passwd
但听起来有点矫枉过正。这要写很多文字。
谷歌搜索给了我:
awk -F ':' '{print $1}' < /etc/passwd
我想,相当于哪个?是吗?
cmp <(perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd) <(awk -F ':' '{print $1}' < /etc/passwd)
是否有标准的UNIX工具来执行此操作或使用perl更简单的方法?或cut
?
我是初学者。
顺便说一句,我在Python上尝试过如下手册,但我很尴尬,在Python中可能有更好的方法来实现这一点:(
python -c 'print "\n".join([u[:u.find(":")] for u in open("/etc/passwd")])'
编辑:实际上,对于Python来说可能更像是这样:
python -c 'print "\n".join([u.split(":")[0] for u in open("/etc/passwd")])'
嗯......还是很啰嗦。
答案 0 :(得分:6)
perl -F: -lane 'print $F[0]' < /etc/passwd
无论是awk
解决方案做什么都没有。 -a
表示将每行输入拆分为字段,-F:
表示:
是字段分隔符。 -l
为每行输入输出换行符,因此您不必说print "$F[0]\n"
。
由于您的要求,cut
解决方案更加直截了当:
cut -d: -f1 < /etc/passwd
含义:拆分:
,输出第一个字段。
答案 1 :(得分:6)
就个人而言,我会使用awk解决方案。切割工作,但我经常发现它不够灵活。
awk -F: '{print $1}' /etc/passwd
或者,更一般地说,使用getent passwd
。这将查询/etc/nsswitch.conf
中配置的所有用户数据库源,这些源可能是远程LDAP服务器(以及/etc/passwd
)。
getent passwd | awk -F: '{print $1}'
如果您想要一个仅限bash的解决方案,您可以这样做。这看起来很奇怪,但它不会调用任何外部命令。设置字段间分隔符$IFS
会告诉read
要分割的字符。最后的< /etc/passwd
重定向对整个循环生效。
while IFS=: read USER _; do
echo "$USER"
done < /etc/passwd
(以这种方式设置$IFS
只会影响read
命令。通常,您可以在任何命令之前放置变量赋值,它们只对该命令有效。例如:
$ FOO=foo
$ echo $FOO
foo
$ FOO=bar true
$ echo $FOO
foo
所以不用担心弄乱$IFS
。)
答案 2 :(得分:1)
Perl为您提供内置功能:getpwent
endpwent(); # reset to beginning of file in case some other code has read some entries already
while ( my ($username) = getpwent() ) {
print "user: $username\n";
}
endpwent();
getpwuid和getpwnam可用于查找特定名称或ID;所有三个get函数都返回一行上所有标准字段的列表。
答案 3 :(得分:1)
如果您只需要用户名,那么`id'命令就足够了,而且更简单。
USER=`id -un`
对于密码文件条目的其他部分,我仍然会使用上述选项之一。