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

Regex 使用shell脚本从passwd文件获取用户名,regex,perl,shell,awk,Regex,Perl,Shell,Awk,从/etc/passwd,我只需要“用户”部分 例如: backup:x:34:34:backup:/var/backups:/bin/sh 作为用户进行备份 要提取我现在使用的用户部件,请执行以下操作: perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd 编辑:实际上,Python可能更像这样: python -c 'print "\n".join([u.split(":")[0] for u in open("/etc/passwd")])' 嗯。

/etc/passwd
,我只需要“用户”部分

例如:

backup:x:34:34:backup:/var/backups:/bin/sh
作为用户进行
备份

要提取我现在使用的用户部件,请执行以下操作:

perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd
编辑:实际上,Python可能更像这样:

python -c 'print "\n".join([u.split(":")[0] for u in open("/etc/passwd")])'
嗯。。。还是很冗长

perl -F: -lane 'print $F[0]' < /etc/passwd

意思:在
上拆分:
,输出第一个字段。

我个人会使用awk解决方案。切割是可行的,但我经常发现它不够灵活

awk -F: '{print $1}' /etc/passwd
或者,更一般地说,使用
getentpasswd
。这将查询在
/etc/nsswitch.conf
中配置的所有用户数据库源,这些数据库源可以是远程LDAP服务器(也可以是
/etc/passwd

如果您想要一个只有bash的解决方案,您可以这样做。它看起来很奇怪,但它不调用任何外部命令。设置字段间分隔符
$IFS
告诉
读取
要拆分的字符。最后的
重定向对整个循环生效

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

因此,不用担心弄乱
$IFS

Perl为您提供了一个内置功能:


getpwuid和getpwnam可用于查找特定的名称或id;这三个get函数都返回一行中所有标准字段的列表。

如果您只需要用户名,“id”命令就足够了,而且更简单

USER=`id -un`

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

Mamma mia,那
cut
one liner真是太棒了,伙计。我做错了@Robottinosino已修复,忘记放置
IFS=:
。我还担心会覆盖系统$USER变量?:(和改变IFS?:(@Robottinosino每个脚本都有自己的环境,因此更改
$USER
将是您的脚本的本地部分。当然,您可以使用任何您喜欢的变量名。这很公平。我只是想在CLI中键入该名称,而不是将其作为单独的脚本使用。这很混乱。.Bash变量区分大小写,所以请保留ALLUPPER将大小写名称添加到shell中。
read user 
同样有效,并避免在任何shell中覆盖
user
perl -F: -lane 'print $F[0]' < /etc/passwd
cut -d: -f1 < /etc/passwd
awk -F: '{print $1}' /etc/passwd
getent passwd | awk -F: '{print $1}'
while IFS=: read USER _; do
    echo "$USER"
done < /etc/passwd
$ FOO=foo
$ echo $FOO
foo
$ FOO=bar true
$ echo $FOO
foo
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();
USER=`id -un`