내가하고있는 일에 sed 솔루션이 필요합니다. /etc/passwd
AIX 사용자 ID(사용자 이름)를 기반으로 파일에서 이름을 추출 해야 합니다 . 지금까지 나는 이것을 가지고 있지만 작동하지 않습니다. 가능한 모든 솔루션을 높이 평가하겠습니다.
sed "/^Ravi02/s/\(^.\{21\}\).\([a-zA-Z]\{50\}\)/\1/p" /export/home/Ravi02/passwd
다음은 passwd 파일의 몇 가지 예시 항목입니다.
Jose01:!:49030:49082:Freeman, Joseph III:/export/home/p1jxf01:/bin/ksh
Ravi02:!:37242:1580:Dronavalli, Ravi:/export/home/j1rxd02:/bin/ksh
Beny01:!:49335:49040:Young, Ben:/export/home/p1bmy01:/bin/ksh
ID를 기반으로 이름을 추출해야 합니다. ID가 "Jose01"이면 "Freeman, Joseph III"를 가져와야 하고, ID가 "Ravi02"이면 "Dronavalli, Ravi"를 가져와야 합니다.
답변1
파일 은 구분된 파일 passwd
입니다 :
. 따라서 첫 번째 필드는 항상 사용자 이름 등입니다.
(참고: man 5 passwd
설명 필드).
이 경우 사용자 이름이 주어지면 GECOS 필드가 필요합니다.
이것할 수 있다완료되었지만 sed
다른 도구가 더 나을 수도 있습니다. awk
간단하게:
awk -F: '$1 == "Ravi02" { print $5 }' /etc/passwd
답변2
표준 sed
솔루션은
sed -n '/^Ravi02:/s/^[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$/\1/p'
약간 단순화 될 수 있습니다
sed -n 's/^Ravi02:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$/\1/p'
요점은 콜론(:
.\{21\}
) 및 콜론을 사용하여 문자( ) 및 문자( ) 를 계산하는 대신 — 특히 전체 이름 필드에서 쉼표( ) 및 공백과 같은 문자를 [a-zA-Z]\{50\}
일치시킬 수 있기를 원하기 때문입니다 .,
내 시스템에서는 다음 변형도 작동합니다.
sed -n '/^Ravi02:/s/^\([^:]*:\)\{4\}\([^:]*\)\(:[^:]*\)\{2\}$/\2/p'
sed -n 's/^Ravi02:\([^:]*:\)\{3\}\([^:]*\)\(:[^:]*\)\{2\}$/\2/p'
sed -nE '/^Ravi02:/s/^([^:]*:){4}([^:]*)(:[^:]*){2}$/\2/p'
sed -nE 's/^Ravi02:([^:]*:){3}([^:]*)(:[^:]*){2}$/\2/p'
하지만 모든 시스템(예: AIX)에서 모두 작동하는지 확실하지 않습니다.