在 CentOS 上查找重复用户

在 CentOS 上查找重复用户

我使用以下代码来查找重复的用户名。但是,它给出了一个错误。

#!/bin/bash
cat /etc/passwd | cut -f1 -d":" | /bin/sort -n | /usr/bin/uniq -c |\
    while read x; do [ -z "${x}" ] && break set - $x
        if [ $1 -gt 1 ]; then
            uids=`/bin/gawk -F: '($1 == n) { print $3 }' n=$2 \
            /etc/passwd | xargs`
            echo "Duplicate User Name ($2): ${uids}"
        fi
    done

我在标记“完成”和数字错误附近遇到语法错误。我该如何修复这个错误?

答案1

$ cut -d: -f1 /etc/passwd | sort | uniq -d

:这将提取分隔文件的第一个字段(用户名)/etc/passwd,对结果进行排序并报告任何重复项。

同时获取 UID 和其余重复passwd条目:

cut -d: -f1 /etc/passwd | sort | uniq -d |
while read -r username; do
  grep "^$username:" /etc/passwd
done

仅获取重复的用户名及其 UID:

cut -d: -f1 /etc/passwd | sort | uniq -d |
while read -r username; do
  awk -F: -vu="$username" '$1 == u { print $1, $3 }' /etc/passwd
done

关于您的脚本的简短说明。语法看起来大部分都可以,但是您需要;afterbreak并且两者后面都有一个空格\(这可能是剪切和粘贴错误(现已通过编辑删除))。另外,如果没有充分的理由,我会避免提供标准实用程序的完整路径,并且该awk程序不需要 GNU,awk所以就awk可以了。

答案2

  1. 您需要在和do之间有一个- 通常是在 之后,或者在检查您是否获得数据之后。whiledoneread
  2. set - $x应该单独占一行,或者至少break用分号 ( ;) 分隔。 (这可能是放置 的好地方do。)

建议:

  1. 与其做set - $x,不如考虑read x改变read count name
  2. 为了清楚起见,您可能需要更改`…`$(…)- 请参阅, , 和

答案3

我会用 awk (单行)做类似的事情:

awk -F: '{if ($1 in users) print "Duplicate Username: "$1 ; else users[$1]}' /etc/passwd

在 users 数组变量中查找用户名,如果重复则打印消息,否则将用户添加到数组中

答案4

灵感来自埃巴尔的回答,这个awk命令复制了 OP 脚本的预期功能:

awk -F: '{ uids[$1] = uids[$1] " " $3; }
         END { for (u in uids) { if (uids[u] ~ /. /)
                         print "Duplicate User Name (" u "):" uids[u]; } }'

正如 ebal 的答案一样,它创建一个关联数组,其中每个唯一的用户名都有一个条目。它将每个条目的值设置为空格和用户每行的 UID 的串联。然后,在读取整个文件后,它会循环访问唯一的用户名并检查它是否出现多次(通过 UID 列表除第一个字符之外还有空格这一事实来识别)并报告所需的信息。

如果文件中的 UID 包含空格,这会表现得很奇怪。

相关内容