在 CentOS 上查找重复用户

jac*_*dez 4 users duplicate shell-script

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 8

$ cut -d: -f1 /etc/passwd | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)

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

还要获取 UID 和其余重复passwd条目:

cut -d: -f1 /etc/passwd | sort | uniq -d |
while read -r username; do
  grep "^$username:" /etc/passwd
done
Run Code Online (Sandbox Code Playgroud)

只获取重复的用户名及其 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
Run Code Online (Sandbox Code Playgroud)

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


G-M*_*ca' 7

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

建议:

  1. 与其做set - $x,不如考虑read x改为read count name
  2. 为清楚起见,您可能希望更改`…`$(…)- 参见thisthisthis