이 프로그램이 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

좀 더 다양성을 원 하고 cut:grep

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

이는 passwd 항목을 검색하고 첫 번째 필드(사용자 이름)를 제거한 다음 grep에게 -x전체 줄( )에 걸쳐 5~10자( )를 포함하는 확장 정규식 일치를 요청합니다 ..

관련 정보