我想编写一个脚本来检查重复项 例如:我有一个文本文件,其中包含格式为/ etc / passwd
的信息alice:x:1008:555:William Williams:/home/bill:/bin/bash
bob:x:1018:588:Bobs Boos:/home/bob:/bin/bash
bob:x:1019:528:Robt Ross:/home/bob:/bin/bash
james:x:1012:518:Tilly James:/home/bob:/bin/bash
我想简单地检查是否有重复的用户,如果有,请将该行输出到标准错误。所以在上面的例子中,因为bob出现两次,我的输出只会产生类似的东西:
Error duplicate user
bob:x:1018:588:Bobs Boos:/home/bob:/bin/bash
bob:x:1019:528:Robt Ross:/home/bob:/bin/bash
现在我有一个while循环,它读取每一行,并使用以“:”分隔的awk -F将每条信息存储在一个变量中。存储我的用户名后,我不太确定最好的方法来检查它是否已经存在。
我的代码的某些部分:
while read line; do
echo $line
user=`echo $line | awk -F : '{print $1}'`
match=`grep $user $1`($1 is the txtfile)
if [ $? -ne 0 ]; then
echo "Unique user"
else
echo "Not unique user"
then somehow grep those lines and output it
fi
done
匹配不会产生正确的结果
建议?
答案 0 :(得分:4)
而不是重新发明轮子,使用以下工具:
cut
提取第一个字段 sort
和uniq
仅保留重复的行。
cut -d : -f 1 | sort | uniq -d | while read i ; do
echo "error: duplicate user $i"
done
答案 1 :(得分:1)
听起来像awk
给我的工作:
% awk -F':' '
/:/ {
count[$1] += 1
}
END {
for (user in count) {
if (count[user] > 1) {
print user " appears in the file " count[user] " times."
}
}
}
' /etc/passwd
答案 2 :(得分:0)
Perl-proposal:
perl -F: -lanE 'push @{$h{$F[0]}},$_; END{for $k (keys %h){if(@{$h{$k}}>1){say "Error";say for @{$h{$k}}}}}' file