我使用以下代码来查找重复的用户名。但是,它给出了一个错误。
#!/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
答案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 包含空格,这会表现得很奇怪。