【问题标题】:Identifying usernames having duplicate user-id in /etc/passwd file识别 /etc/passwd 文件中具有重复用户 ID 的用户名
【发布时间】:2012-03-02 06:08:03
【问题描述】:

我试图找出我的 /etc/passwd 中用户 ID 为 0 的所有用户。它应该显示用户名和用户 ID。我尝试了以下方法:

awk -F: '{
count[$3]++;}END {
for (i in count)
   print i, count[i];
 }'  passwd

它给出了重复的用户 ID 以及它们出现的次数。我实际上还希望用户名以及类似的重复用户 ID

zama      0
root      0
bin       100
nologin   100

如果解决方案提供了 awk 关联数组,那就太好了。其他方法也可以。

【问题讨论】:

    标签: awk


    【解决方案1】:

    这是你想要的吗?

    awk -F: '{
    count[$3]++; names[$3 "," count[$3]] = $1}END {
    for (i in count) {
      for (j = 1; j <= count[i]; j++) {
       print names[i "," j], i, count[i];
      }
    }
     }'  passwd
    

    【讨论】:

    • 感谢您的回复。我之前尝试过上面的示例,它给出了用户名,但我希望所有用户名在第 3 列中都有重复的用户 ID。它现在只显示与 user-id 3 对应的唯一用户名。
    • 获取所有个用户名,连接遇到的值,像这样:names[$3] = names[$3] "\t" $1
    • 我更新了解决方案,允许您使用相同的 uid 遍历所有不同的名称。抱歉,我现在才发布它,但昨晚我在发布时失去了互联网 - 真令人沮丧:)
    【解决方案2】:

    这可能对你有用:

    awk -F: '$3~/0/{if($3 in a){d[$3];a[$3]=a[$3]"\n"$3" "$1}else{a[$3]=$3" "$1}};END{for(x in d)print a[x]}' /etc/passwd
    

    或者这个非 awk 解决方案:

    cut -d: -f1,3 /etc/passwd |
    sort -st: -k2,2n |
    tr ':' ' ' |
    uniq -Df1 | 
    sed 's/\(.*\) \(.*\)/\2 \1/p;d'
    

    【讨论】:

    • 嗨 Potong,非 awk 解决方案看起来很棒。但是你能解释一下 sed 语句是如何工作的吗?这对我来说有点复杂。还有,很抱歉回来晚了
    • 糟糕!我留下了一些调试命令。我现在把它删除了。基本上所有 sed 语句所做的都是反转前两个(实际上只有两个)字段,以便 used-id 出现在用户名之前。
    【解决方案3】:
    myid=`cat passwd|awk -F: '{print $3 }'| sort | uniq -d`
    for i in `echo "$myid"`;do
        egrep  "^.*:x:$i" passwd | awk -F: '{print $1 , $3}'
    done
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多