사용자가 입력한 UID를 가져온 다음 이를 사용하여 /etc/passwd 디렉토리를 참조하고 데이터를 이름별로 정렬하고 사용자 이름, 이름, 성만 순서대로 표시해야 합니다. 내가 겪고있는 문제는 출력을 정렬하는 것입니다. 다음과 같은 명령을 사용하면
cat /etc/passwd |grep $id_prefix | sort | cut -d: -f1,5
출력은 사용자 이름을 기준으로 정렬되고 성, 이름 순서로 표시됩니다. 명령을 이와 같이 변경할 수 있다는 것을 알고 있습니다.
cat /etc/passwd |grep $id_prefix | sort | cut -d: -f5 | sed 's/\([^ ]*\)[ ][ ]*\([^ ]*\)/\2 \1/'
그런 다음 출력을 정렬하고 원하는 대로 잘라내겠습니다. 하지만 FIELD1(사용자 이름)은 포함되지 않습니다. 필요한 모든 필드를 올바르게 표시하고 정렬하려면 어떻게 작성해야 합니까?
답변1
다음을 수행할 수 있습니다.
awk -F: '{ print $1" "$5 }' /etc/passwd | sort -k2
/etc/passwd
그러면 두 번째 필드의 사용자 이름 및 설명 필드가 구문 분석됩니다. 이 필드는 sort
이름과 성 순서로 나열되어 있는 경우 사용자의 이름이 됩니다.
다음은 병합의 예입니다 grep
.
grep "500\|501\|502" /etc/passwd | awk -F: '{ print $1" "$5 }' | sort -k2
jira Atlassian JIRA
dick Richard Jameson
bob Robert Gillespie
편집하다:
파일에서 이름과 성의 순서를 바꾸려면 다음을 사용하십시오 /etc/passwd
.
awk -F: '{ print $1" "$5 }' /etc/passwd | awk '{ print $1" "$3" "$2 }' | sort -k2
위의 예에서는 /etc/passwd
파일의 이름과 성을 수정합니다.
grep "500\|501\|502" /etc/passwd | awk -F: '{ print $1" "$5 }' | awk '{ print $1" "$3" "$2 }' | sort -k2
이는 이름/성, 성/이름을 구분하는 쉼표가 없고 없어도 되는 경우에 작동합니다.
편집 (두 번째):
성/이름은 쉼표로 구분되므로 다음과 같이 작동합니다.
awk -F: /$id_prefix/'{ print $1" "$5 }' /etc/passwd | awk -F, '{ print $1" "$2 }' | awk '{ print $1" "$3" "$2 }' | sort -k2
grep
에서 파이핑 하지 말 것을 제안한 @Jidder에게 감사드립니다 awk
.
답변2
당신은 이것을 해야 합니다:
grep mohsen /etc/passwd | awk -F':' {'split($5,a,",");printf "username is :%s ,uid is: %s , name is %s \n",$1,$3,a[1] '}
출력은 다음과 같습니다
username is :mohsen ,uid is: 1000 , name is Mohsen Pahlevanzadeh
답변3
나는 당신이 다음과 같이 벗어날 수 있다고 생각합니다 :
grep $id_prefix /etc/passwd | cut --delimiter: --fields=1,5 | sort --field-separator=: --key=2
상황에 따라 필요한 경우 --ignore-case
옵션을 추가할 수도 있습니다. sort
확인하다문서더 많은 선택을 위해.
답변4
사람들이 왜 grep을 awk로 가져오는지 잘 모르겠습니다.
awk를 사용하면 이 모든 작업을 수행할 수 있습니다. 이는 성과 이름이 공백으로 구분되어 있다고 가정합니다.
여기서 USERNAME은 검색어입니다.
awk -F: '/USERNAME/{split($5,a," ");print $1,a[2],a[1]}' etc/passwd