가장 긴 사용자 이름을 인쇄하세요.

가장 긴 사용자 이름을 인쇄하세요.

Linux에서 사용자 이름의 가장 긴 이름을 인쇄하는 방법이 있는지 알고 싶습니다. 할 수 있나요?

답변1

가장 긴 사용자 이름(및 길이)을 얻으려면:

$ getent passwd | awk -F':' '{ print length($1), $1 }' | sort -rn | head -n 1
11 _traceroute

즉, passwd파일을 가져와 각 사용자 이름의 길이(첫 번째 :구분 문자열)를 계산하고 길이별로 정렬한 후 첫 번째 항목을 선택합니다.

동일한 길이의 사용자 이름이 여러 개 있는 경우 사전순으로 마지막에 있는 사용자 이름이 선택됩니다.

가장 긴 실명을 얻으려면(그리고 실명이 무엇인지, 얼마나 긴지 확인하려면):

$ getent passwd | awk -F':' '{ print length($5), $1, $5 }' | sort -rn | head -n 1
32 _rtadvd IPv6 Router Advertisement Daemon

:이는 첫 번째 명령과 동일한 작업을 수행하지만 파일에서 다섯 번째로 구분된 문자열의 길이를 계산합니다 passwd. 이 필드에는 사용자의 실제 이름이 포함됩니다. 출력은 실제 이름, 사용자 이름 및 실제 이름의 길이입니다.

일부 시스템에서는 &특정 도구(예: 또는 )를 통해 필드에 액세스할 때 사용자의 실제 이름에 있는 a가 사용자 이름으로 대체됩니다. 예를 들어 다음과 같은 항목이 있을 수 있습니다.fingersendmailpasswd

operator:*:2:5:System &:/operator:/sbin/nologin

실명 길이를 계산할 때 다음 사항을 고려하세요.

getent passwd | awk -F':' '{ gsub("&", $1, $5); print length($5), $1, $5 }' | sort -rn | head -n 1

그리고 다음을 awk제거하여 가장 긴 이름을 선택합니다 .sorthead

getent passwd |
awk -F':' '
          { gsub("&", $1, $5) ; len = length($5)      }
len > max { line = $0         ; max = len;            }
END       { split(line, a, FS); print max, a[1], a[5] }'

이 코드를 통해,처음으로 발견동일한 길이의 이름이 여러 개 있는 경우 가장 긴 이름이 선택됩니다.

답변2

이는 상당히 최적화되지 않았지만 느린 데이터베이스에는 일반적으로 수만 명의 사용자가 없기 때문에 가능할 수 있습니다.

getent passwd | cut -d: -f1 \
| grep $(getent passwd | cut -d: -f1 | tr '[:print:]' '.' | sort | tail -n1)

이 내용을 조금 풀어보겠습니다. getent passwd사용자 데이터베이스가 나열됩니다. 행의 형식은 다음과 같습니다.

root:x:0:0:root:/root:/bin/bash

사용자 이름, xUID, GID, GECOS(요즘에는 일반적으로 사람이 읽을 수 있는 사용자 이름), 홈 디렉터리, 셸. 일반적으로 첫 번째 구분 필드(예: 사용자 이름)를 제외한 모든 항목을 cut -d:1 -f1제거합니다 .:

전체적으로 이 작업을 두 번 수행합니다. 한 번은 가장 긴 사용자 이름의 길이(라인 2)를 찾고, 그 다음에는 실제로 해당 길이의 사용자 이름을 찾습니다.

가장 긴 사용자 이름의 길이를 찾으려면 tr모든 문자를 .s로 바꾸면 됩니다. 그런 다음 간단히 목록을 정렬하고 .s의 가장 긴 문자열이 마지막 문자열임을 알 수 있으므로 다음을 tail -n1사용하여 얻을 수 있습니다. (기술적으로 이를 위해서는 항상 최소 한 명의 사용자가 필요하지만 루트 사용자여야 하므로 꽤 안전한 가정입니다.)

이제 가장 긴 사용자 이름만큼 긴 점 문자열이 생겼습니다. 운 좋게도 .정규식에서 "모든 문자"에 대한 와일드카드이기 때문에 점입니다. 따라서 이를 사용하여 grep모든 사용자 이름을 해당 공백 문자열과 일치시키고 가장 긴 문자만 일치시킵니다.

(FWIW, 내 CentOS 컴퓨터에서는 입니다 systemd-network.)

사람이 읽을 수 있는 이름을 원한다면 기본적으로 cut -d: -f5그 반대를 원할 것입니다.

답변3

사용자의 이름, 성, 이메일 주소가 포함된 파일이 있습니다. 다음은 가장 긴 이름을 인쇄하는 방법입니다.

awk '{print length($1), $1}' filename | sort -nr | head -1| cut -d\  -f2

원하는대로 조정해 보세요. 다음에 스페이스 두 칸을 눌렀다는 점에 유의하세요.-d\

사용할 수 있는 가장 긴 사용자 이름을 인쇄하려면

grep -v "^#" /etc/passwd | awk -F: '{print length($1), $1}' | sort -nr | head -1 | cut -d\  -f2

실제 사용자 이름을 인쇄하려면 다음을 사용하십시오.

grep -v "^#" /etc/passwd | awk -F: '{print length($5), $5}' | sort -nr | head -1 | cut -d\  -f2-

-f2사용자의 실제 이름에 공백이 포함되도록 끝에 대시를 추가할 수 있습니다 .

답변4

다음은 시스템 사용자를 제외하고 가장 긴 사용자 이름 10개입니다.

sed -n '/sbin/!p' /etc/passwd|  awk -F ":" '{print length($1),$1}'| sort -k1 -nr| head

산출

   9 praveen10
9 lost_foud
8 p2_final
7 praveen
6 p1_new
5 user5
5 user4
5 user3
5 user2
5 user1

관련 정보