Como faço para reverter a saída já canalizada dos comandos de classificação e recorte

2

Eu tenho que pegar a entrada do UID do URI então usá-lo para referenciar o diretório / etc / passwd e ordenar os dados pelo primeiro nome e exibir apenas username, firstname, lastname nessa ordem. O problema que estou tendo é classificar a saída. se eu usar um comando como

cat /etc/passwd |grep  $id_prefix | sort | cut -d: -f1,5

A saída classifica por nome de usuário e exibe em um sobrenome, ordem de primeiro nome. Eu sei que eu poderia mude o comando para algo como.

cat /etc/passwd |grep  $id_prefix | sort | cut -d: -f5 | sed 's/\([^ ]*\)[ ][ ]*\([^ ]*\)/ /'

Então eu vou ter a saída ordenada e cortar como eu quero, mas ela não conterá FIELD1, os nomes de usuários. Como eu iria escrever isso para exibir corretamente todos os campos que eu preciso e também classificá-los?

    
por eric botelho 24.10.2014 / 01:50

4 respostas

1

Você poderia fazer algo assim:

awk -F: '{ print $1"   "$5 }' /etc/passwd | sort -k2

Isso analisará os campos nome de usuário e comentário de /etc/passwd e sort no segundo campo, que será o primeiro nome do usuário, desde que eles estejam listados no primeiro nome e na ordem do sobrenome.

Aqui está um exemplo de incorporação de grep :

grep "500\|501\|502" /etc/passwd | awk -F: '{ print $1"    "$5 }' | sort -k2

jira    Atlassian JIRA
dick    Richard Jameson
bob    Robert Gillespie

EDITAR:

Use isso para reverter o sobrenome, a ordenação do nome do arquivo /etc/passwd :

awk -F: '{ print $1"   "$5 }' /etc/passwd | awk '{ print $1"    "$3" "$2 }' | sort -k2

O exemplo acima foi modificado para lastname, firstname no arquivo /etc/passwd :

grep "500\|501\|502" /etc/passwd | awk -F: '{ print $1"    "$5 }' |  awk '{ print $1"    "$3" "$2 }' | sort -k2

Isso funciona se não houver e não houver nenhuma vírgula separando primeiro / último, último / primeiro nome.

EDIT (o segundo):

Como os últimos / primeiros nomes são separados por vírgula, isso deve funcionar:

awk -F: /$id_prefix/'{ print $1"    "$5 }' /etc/passwd | awk -F, '{ print $1"    "$2 }' | awk '{ print $1"    "$3"    "$2 }' | sort -k2

Obrigado ao @Jidder por recomendar que não seja canalizado de grep para awk .

    
por 24.10.2014 / 03:01
0

Você precisa fazer isso:

grep mohsen /etc/passwd | awk -F':' {'split($5,a,",");printf "username is :%s ,uid is: %s , name is %s \n",$1,$3,a[1]  '}

A saída é:

username is :mohsen ,uid is: 1000 , name is Mohsen Pahlevanzadeh
    
por 24.10.2014 / 02:22
0

Eu acho que você poderia se safar com algo assim:

grep $id_prefix /etc/passwd | cut --delimiter: --fields=1,5 | sort --field-separator=: --key=2

Você também pode adicionar a opção --ignore-case a sort se necessário em seu contexto. Verifique seus documentos para mais opções.

    
por 27.10.2014 / 07:25
0

Não sei porque as pessoas estão direcionando o grep para o awk.
Você poderia fazer tudo no awk. Isso pressupõe que nome e sobrenome são separados por um espaço.
Onde USERNAME é o termo de pesquisa

awk -F: '/USERNAME/{split($5,a," ");print $1,a[2],a[1]}' etc/passwd
    
por 27.10.2014 / 10:30