Imprime alguns campos de / etc / passwd

4

Eu tenho uma pergunta sobre o uso de curingas no Linux. Aqui eu tenho algumas linhas de uma longa lista de linhas no arquivo / etc / passwd.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

O que é e o comando / comandos apropriados para imprimir apenas o nome de usuário, o número UID e o número de GID dessa linha (se possível, mostrar várias maneiras para que eu possa explorar mais)?

    
por cash 16.11.2013 / 16:54

2 respostas

6

Uma maneira que não requer "curingas" ou expressões regulares é usar cut . cut pode lidar com linhas separadas por caracteres designados em arquivos de texto, o que /etc/passwd simplesmente é.

cut -d: -f1,3,4 /etc/passwd

A saída terá campos delimitados por dois pontos. Parece que o GNU cut tem uma opção extra, "--output-delimiter", mas você também pode usar tr :

cut -d: -f1,3,4 /etc/passwd | tr ':' '\t'

As opções para cut funcionam assim:

  • -d: - use um caractere de dois-pontos como um separador de campo. O padrão é a guia.
  • -f1,3,4 - campos de saída número 1, 3 e 4. cut usa campos indexados 1, começando no lado esquerdo da linha. O campo 2 seria o 'x', onde a senha criptografada apareceu no passado.

O comando awk também pode funcionar:

awk -F : '{print $1, $3, $3}' /etc/passwd

A opção -F : informa awk para usar dois pontos em campos separados. awk refere-se a campos em uma linha como $ 1, $ 2, $ 3 ... da esquerda para a direita. $ 0 armazena toda a linha, que geralmente é o que você deseja imprimir, mas não desta vez.

sed pode ser feito para fazer isso:

sed 's/^\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):..*/  /' /etc/passwd 

No comando sed , finalmente chegamos aos "curingas", embora eles pareçam feios neste caso.

Meu conselho seria preferir o comando cut . O exemplo sed mostra que uma expressão regular para obter o que você deseja pode ser feia e, portanto, complicada de se tornar correta. awk pode fazer mais do que cut , em que awk usa execuções de espaço em branco para separar os tokens por padrão. Isso pode economizar tempo com a especificação do separador de campo cut .

    
por 16.11.2013 / 17:02
1

Usando o read builtin:

while IFS=: read -r user _ uid gid _; do printf "%s\t%s\t%s\n" "$user" "$uid" "$gid"; done </etc/passwd

Isso define o separador de campo como : e descarta as variáveis indesejadas com _ antes de imprimir os campos necessários.

    
por 17.11.2013 / 21:33