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가 사용자 이름으로 대체됩니다. 예를 들어 다음과 같은 항목이 있을 수 있습니다.finger
sendmail
passwd
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
제거하여 가장 긴 이름을 선택합니다 .sort
head
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
사용자 이름, x
UID, 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