私は/ 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)) }'