id 명령의 출력을 세 부분으로 "잘라내는" 스크립트를 작성해야 합니다. 예를 들어:
id가 다음과 같은 출력을 제공한다고 가정합니다.uid=12345(mylogin) gid=100(users)
내 스크립트는 다음과 같이 출력되어야 합니다.
Login: mylogin
Id: 12345
Group: users
답변1
굳이 분석하지 마세요. POSIX필요id
이를 자동화하기 위해 다양한 옵션이 지원됩니다 .
printf "Login: %s\nId: %s\nGroup: %s\n" "$(id -un)" "$(id -u)" "$(id -gn)"
더 많은 작업이 필요할 뿐만 아니라 id
로캘 종속 출력을 생성하는 옵션이 허용되지 않기 때문에 구문 분석도 복잡합니다.
LC_MESSAGES 로케일 클래스가 POSIX 로케일을 지정하는 경우 다음 형식을 사용해야 합니다.다른 로케일에서는 uid, gid, euid, egid 및 groups 문자열을 로케일에 해당하는 보다 적절한 문자열로 대체할 수 있습니다.
가장 합리적인 구문 분석 도구로 이 문제를 처리할 수 있지만 유니코드를 지원하지 않는 도구는 문제를 일으킬 가능성이 높습니다.
답변2
여러 문자 필드 구분 기호 사용awk
$ echo 'uid=12345(mylogin) gid=100(users)' | awk -F'[=()]' '{print "Login: " $3 "\nId: " $2 "\nGroup: " $6}'
Login: mylogin
Id: 12345
Group: users
-F'[=()]'
=
또는 필드 구분 기호(
로 설정)
$3
첫 번째 필드 다음의 세 번째 필드가 되며=
첫 번째 필드(
로 끝납니다)
. 이런 식으로 우리는 가치를 얻습니다.mylogin
- 다른 필드는 동일하며 필요에 따라 인쇄됩니다.
답변3
한 가지 접근 방식은 다음과 같습니다.
# 0 | 1 | 2 | 3 | 4 | 5 |
#uid=12345(mylogin) gid=100(users)
IFS='(=)' read -a A <<<"$(id)"
printf '%s: %s\n' Login "${A[2]}" Id "${A[1]}" Group "${A[5]}"
# remember array A indexing begins at 0.
답변4
말 그대로 다음을 사용하십시오 cut
.
echo Login: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f1)
echo Id: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f2 | cut -d ')' -f1)
echo Group: $(id | cut -d ' ' -f2 | cut -d '(' -f2 | cut -d ')' -f1)