t solução para extrair o gecos de / etc / passwd com base no nome de usuário

0

Eu preciso de uma solução sed para o trabalho que estou fazendo. Preciso extrair o nome do arquivo /etc/passwd com base no ID do usuário do AIX (nome de usuário). Até agora eu tenho isso e não está funcionando. Qualquer solução de trabalho seria apreciada.

sed "/^Ravi02/s/\(^.\{21\}\).\([a-zA-Z]\{50\}\)//p" /export/home/Ravi02/passwd

Aqui estão alguns exemplos de entradas do arquivo 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

Com base no id, preciso extrair o nome. Se o id é "Jose01" eu deveria pegar "Freeman, Joseph III" ou se o id for "Ravi02" então eu devo pegar "Dronavalli, Ravi".

    
por Ravi.D 19.09.2016 / 20:14

2 respostas

1

O arquivo passwd é um arquivo delimitado por : . Portanto, o primeiro campo é sempre o nome de usuário e assim por diante.

(Nota lateral: man 5 passwd descreve os campos).

Neste caso, dado um nome de usuário, você deseja o campo GECOS.

Isso poderia ser feito com sed , mas outras ferramentas podem ser melhores. awk simplifica:

awk -F: '$1 == "Ravi02" { print $5 }' /etc/passwd
    
por 19.09.2016 / 21:11
0

A solução padrão sed seria

sed -n '/^Ravi02:/s/^[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$//p'

que pode ser simplificado ligeiramente para

sed -n 's/^Ravi02:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$//p'

A chave é que você precisa estar olhando (contando) dois pontos ( : ) e outros caracteres além de dois pontos em vez de contar caracteres ( .\{21\} ) e letras ( [a-zA-Z]\{50\} ) - especialmente desde que você quer ser capaz para corresponder caracteres como vírgula ( , ) e espaço no campo de nome completo.

No meu sistema, as seguintes variações também funcionam:

  • sed -n '/^Ravi02:/s/^\([^:]*:\)\{4\}\([^:]*\)\(:[^:]*\)\{2\}$//p'
  • sed -n 's/^Ravi02:\([^:]*:\)\{3\}\([^:]*\)\(:[^:]*\)\{2\}$//p'
  • sed -nE '/^Ravi02:/s/^([^:]*:){4}([^:]*)(:[^:]*){2}$//p'
  • sed -nE 's/^Ravi02:([^:]*:){3}([^:]*)(:[^:]*){2}$//p'

mas não tenho certeza se todos eles funcionarão em todos os sistemas (por exemplo, AIX).

    
por 19.09.2016 / 21:28