【问题标题】:Get username from passwd file using shell scripting使用 shell 脚本从 passwd 文件中获取用户名
【发布时间】:2012-08-28 16:32:38
【问题描述】:

来自/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")])'

嗯……还是很冗长。

【问题讨论】:

    标签: regex perl shell awk


    【解决方案1】:
    perl -F: -lane 'print $F[0]' < /etc/passwd
    

    几乎没有awk 解决方案的作用。 -a 表示将每一行输入拆分为字段,-F: 表示: 是字段分隔符。 -l 为每行输入输出一个换行符,因此您不必说 print "$F[0]\n"

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

    cut -d: -f1 < /etc/passwd
    

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

    【讨论】:

    • 妈妈咪呀,cut 单线真是太棒了,伙计。我做错了!
    【解决方案2】:

    就个人而言,我会使用 awk 解决方案。 Cut 可以,但我经常发现它不够灵活。

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

    或者,更一般地说,使用getent passwd。这将查询在/etc/nsswitch.conf 中配置的所有用户数据库源,这可能是远程LDAP 服务器(以及/etc/passwd)之类的东西。

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

    如果您想要一个仅限 bash 的解决方案,您可以这样做。它看起来很奇怪,但它不调用任何外部命令。设置字段间分隔符$IFS 告诉read 要拆分的字符。末尾的&lt; /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。)

    【讨论】:

    • @Robottinosino 已修复,忘记输入IFS=:
    • 我也担心覆盖系统$USER变量? :( AND 改变 IFS? :(
    • @Robottinosino 每个脚本都有自己的环境,因此更改 $USER 将是您的脚本本地的。当然,你可以使用任何你喜欢的变量名。
    • 很公平。我只是想将它输入到 CLI 中,而不是将其用作单独的脚本。这就是混乱..
    • Bash 变量区分大小写,因此将全大写名称留给 shell。 read user _ 也可以正常工作,并避免在任何 shell 中覆盖 USER
    【解决方案3】:

    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 函数都返回一行中所有标准字段的列表。

    【讨论】:

      【解决方案4】:

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

      USER=`id -un`
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多