このプログラムは、5〜10文字の長さのユーザー名のみを印刷しようとしています。

このプログラムは、5〜10文字の長さのユーザー名のみを印刷しようとしています。

私は/ etc / passwdをスキャンしてディレクトリ内のすべてのユーザー名を印刷するbashプログラムを作成しましたが、長さ5〜10文字のユーザー名のみを印刷するプログラムが必要です。変えなければなりません。

#!/bin/bash

MAXLENGTH=$(cut -d: -f1 < /etc/passwd | wc -L)
MINLENGTH=$MAXLENGTH
SMALLESTNAME=""

for NAME in $(cut -d: -f1 < /etc/passwd)
do
if [ ${#NAME} -eq $MAXLENGTH ]
then
        echo "The Longest UserName In The System 
Is:" $NAME
        echo " Its Length Is" $MAXLENGTH
elif [ ${#NAME} -lt $MINLENGTH ]
then
        MINLENGTH=${#NAME}
        SMALLESTNAME=$NAME
fi

done

 echo
 echo "The Smallest UserName In The System Is:" 
 $SMALLESTNAME
 echo "Its Length is:" $MINLENGTH

答え1

getent passwd | awk -F : 'length($1) >= 5 && length($1) <= 10 { print $1 }'

これにより、5〜10文字(含む)のユーザー名が印刷されます。

最も短い名前と最も長い名前の場合:

getent passwd |
awk -F : 's == "" || length($1) < length(s) { s = $1 }
          l == "" || length($1) > length(l) { l = $1 }
          END { printf("shortest: %s (%d chars)\n", s, length(s))
                printf("longest:  %s (%d chars)\n", l, length(l)) }'

どちらの操作もパスワードデータベースを一度だけ通過することができます(完全なbashスクリプトでは/bin/shスクリプトが特定の項目を使用しないため十分ですがbashどのシェルで実行できます):

#!/bin/bash
getent passwd |
awk -F : 'length($1) >= 5 && length($1) <= 10 { print $1 }
          s == "" || length($1) < length(s)   { s = $1   }
          l == "" || length($1) > length(l)   { l = $1   }
          END { printf("shortest: %s (%d chars)\n", s, length(s))
                printf("longest:  %s (%d chars)\n", l, length(l)) }'

答え2

非実用的ですがやや魅力的です:bash拡張ファイルモード:

shopt -s extglob

getent passwd | 
  cut -d: -f1 | 
  while IFS= read -r name; do 
    [[ $name == ?????@(|?|??|???|????|?????) ]] && echo "$name"
  done

答え3

宿題の解決策は次のとおりです。

#!/bin/bash
for NAME in $(cut -d: -f1 < /etc/passwd)
do
        if [[ ${#NAME} -gt 10 || ${#NAME} -lt 5 ]]
        then
                continue
        else
                echo "Username in the system is: $NAME"
                echo "Its length Is ${#NAME}"
        fi
done

千万です。

答え4

もっと多様性が欲しいcutgrep

getent passwd | cut -d: -f1 | grep -Ex '.{5,10}'

これはpasswdエントリを検索し、最初のフィールド(ユーザー名)を削除してから、grepに-x全行()にわたって5から10文字()を含む拡張正規表現の一致を要求します.

関連情報