사용자 이름을 기반으로 /etc/passwd에서 gecos를 추출하는 sed 솔루션

사용자 이름을 기반으로 /etc/passwd에서 gecos를 추출하는 sed 솔루션

내가하고있는 일에 sed 솔루션이 필요합니다. /etc/passwdAIX 사용자 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)에서 모두 작동하는지 확실하지 않습니다.

관련 정보