2

/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

4 回答 4

6

Personally, I would use the awk solution. Cut works, but I often find it not quite flexible enough.

awk -F: '{print $1}' /etc/passwd

Or, more generically, use getent passwd. This will query all the user DB sources configured in /etc/nsswitch.conf, which could be stuff like remote LDAP servers (and also /etc/passwd).

getent passwd | awk -F: '{print $1}'

If you want a bash-only solution, you could do this. It's weird looking, but it doesn't invoke any external commands. Setting the inter-field separator $IFS tells read what characters to split on. The < /etc/passwd redirection at the end takes effect for the entire loop.

while IFS=: read USER _; do
    echo "$USER"
done < /etc/passwd

(Setting $IFS this way only affects the read command. Generally, you can put variable assignments before any command and they'll only be in effect for that command. For example:

$ FOO=foo
$ echo $FOO
foo
$ FOO=bar true
$ echo $FOO
foo

So no worries about messing up $IFS.)

于 2012-09-04T03:21:44.827 回答
6
perl -F: -lane 'print $F[0]' < /etc/passwd

或多或少地完成awk解决方案的作用。-a表示将每行输入拆分为字段,-F:表示:为字段分隔符。并且-l为每行输入输出一个换行符,因此您不必说print "$F[0]\n".

既然您提出了要求,cut解决方案就更加简单:

cut -d: -f1 < /etc/passwd

含义:拆分:,输出第一个字段。

于 2012-09-04T03:13:52.340 回答
1

如果您只需要用户名,那么“id”命令就足够了,而且简单得多。

USER=`id -un`

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

于 2012-09-10T18:22:15.723 回答
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 函数都返回一行中所有标准字段的列表。

于 2012-09-04T05:09:32.843 回答