Eu tenho uma pergunta semelhante a outra neste site em que o indivíduo precisou encontrar uma lista de todos os usuários usando grep ou awk em / etc / passwd. Isso funcionou para mim, mas tentei traduzi-lo para encontrar e listar os diretórios pessoais deles também. Eu já sei que você não pode fazer isso em uma linha, então eu sei que usaria um pipeline. Eu fiz minha pesquisa on-line, mas não consigo descobrir o problema. Se eu usar grep e fazer algo como o seguinte:
grep -oE '^[/*/]$' /etc/passwd
... provavelmente me daria um erro ou também me mostraria os arquivos / bin / bash que não é o que eu quero. Eu só preciso dos nomes de usuário e seus diretórios pessoais listados usando grep! Também não tenho certeza se o * mostrará outras barras como caracteres, pois alguns diretórios pessoais têm mais do que apenas dois / '(barras).
fonte
/etc/passwd
pode ou não estar onde estão todos os usuários. Considere tambémgetent passwd
.Respostas:
O Grep não é realmente a ferramenta para analisar dados dessa maneira, o grep é mais para correspondência de padrões e você está tentando processar o texto. Você gostaria de usar o awk.
awk
O comando-F":"
Define o delimitador de dados para:$7 == "/bin/false"
Verifica se a 7ª coluna de dados é / bin / false{print "User: "$1 "Home Dir: "$6}'
Diz para imprimir a primeira e a sexta coluna no formato especificado./etc/passwd
O arquivo que estamos processandofonte
grep -oE '^[^:]+' /etc/passwd
que me dá apenas os usuários que eu preciso para pipline algo assim ou algo semelhante para ter os diretórios home lá com elesVocê pode usar
cut
para dividir arquivos com colunas em um delimitador específico:Ou
-f1,6
para as colunas (campos) 1 e 6.fonte
Como outros já apontaram,
grep
não é a melhor ferramenta para isso. Se você insistir em usá-lo, e se vocêgrep
suporta-o
(imprima apenas a parte correspondente da linha) e-P
(use Expressões Regulares Compatíveis com Perl), faça o seguinte:Observe que isso imprimirá todos os usuários, incluindo os usuários do sistema. Estou apenas mostrando 4 linhas como exemplo.
Isso imprimirá o nome do usuário e os diretórios pessoais de todos os usuários, mas em linhas separadas. Você precisa unir cada par de linhas para juntá-las:
Explicação
O regex tem duas partes: procura
^[^:]+
OR (é isso que|
significa).*:\K[^:]+(?=:[^:]+)
. O primeiro procura por um ou mais não:
caracteres desde o início da linha. Isso corresponde ao nome do usuário. A segunda parte procura o máximo de caracteres possível até a:
(.*:
) e os descarta (é o que\K
faz) para que não sejam impressos. Em seguida, corresponde a uma sequência de não -:
que é seguida por:
e não -:
. A(?=foo)
construção é chamada de aparência positiva e é uma maneira de corresponder os caracteres após um padrão sem incluir esses caracteres na própria correspondência.O
perl
comando substituirá as novas linhas por:
e espaços se o número da linha atual ($.
) for divisível por 2. Portanto, a cada segunda linha.fonte
perl -naf: -e 'print $F[0]." : ".$F[5].$/'
portantosed 'N;s/\n/ : /'
pode ser um parceiro melhor paragrep -oP
.Eu acredito que você pode fazer isso com "cut", usando apenas um binário, evitando pipes, atingindo os mesmos resultados que as outras respostas, mas de uma maneira mais elegante :), assim:
Se você deseja obter uma saída melhor formatada + ordem alfabética, aqui está, mas a desvantagem é essa, você precisa usar mais binários:
fonte