ファイルでの重複ログインの確認

ファイルでの重複ログインの確認

私のコードに問題があります。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あなたのコードは、標準がサポートしていない2つ以上を使用します。

  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テストは空でないファイルに適しています。


シェルでこれを手動で実行するには、重複した項目が見つかったときにフラグを設定します。

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

おすすめ記事