从文件中检查重复登录

从文件中检查重复登录

我对我的代码有疑问。我正在编写一个Bourne shell脚本,通过命令从服务器获取用户列表,who然后将其放入文件中,然后它将检查名称,read line如果脚本发现重复的名称,它将打印出带有用户名的警告消息,否则它将打印出没有发现重复项。当脚本找到重复名称时,一切都正常工作,但是当脚本找不到任何重复名称时,它不会打印任何内容,我知道这与最后一条语句有关,if但我尝试了很多解决方案,但仍然卡住了。如果有人有任何建议请帮助我。真的很感激并提前回答。 (见下面的代码)

    #!/bin/sh
    #who -u | sort -k1,5 > test3
    log=~/Desktop/test3
        while [ -f test ]; do
          while IFS= read line; do
           user=( $line )

            if [ "$olduser" = "${user[0]}" ]; then
              printf '\nThe user %s duplicated' "$olduser"
            fi

           olduser="${user[0]}"
          done<"$log"

            if [[ "$olduser" != "${user[0]}" ]]; then
              printf '\nNo duplication found.\n';
            fi


            #Testing store value                       
            #printf '\nolduser value = %s\n' "$olduser" 
           printf '\n=================================================================\n'
sleep 3
done

答案1

您的代码至少使用了标准sh不支持的两个内容:

  1. [[ ... ]],这是 POSIX 语法的扩展,例如bash用于引入自己的条件表达式。

  2. user=( $line ),这会创建一个数组,这是 POSIX 的另一个扩展sh


要查找文本文件中的重复行:

sort file | uniq -d

sort将对输入文件进行排序,并且uniq -d仅输出连续出现多次的行。

要在输出上使用它who并且只关心用户列(第一列):

who | awk '{ print $1 }' | sort | uniq -d

在脚本中使用它:

who | awk '{ print $1 }' | sort | uniq -d >duplicates.txt

if [ -s duplicates.txt ]; then
    echo 'The following dupes were found:'
    cat duplicates.txt
else
    echo 'No dupes'
fi

-s测试对于非空文件来说是正确的。


要在 shell 中手动执行此操作,请在发现重复项时设置一个标志:

dupe=0

who | awk '{ print $1 }' | sort -o users.txt

while IFS= read -r user; do
    if [ -n "$prev_user" ] && [ "$user" = "$prev_user" ]; then
        printf 'Duplication for "%s"\n' "$user"
        dupe=1
    fi

    prev_user=$user
done <users.txt

if [ "$dupe" -ne 1 ]; then
    echo 'No dupes'
fi

相关内容