使用shell脚本从passwd文件获取用户名

时间:2012-09-04 03:12:08

标签: regex perl shell awk

/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")])'
嗯......还是很啰嗦。

4 个答案:

答案 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`

对于密码文件条目的其他部分,我仍然会使用上述选项之一。