Como listar usuários com UIDs maiores que 10?

1

Quais comandos posso usar para exibir todos os usuários que têm um identificador (UID) maior que 10?

    
por alex 12.05.2015 / 01:45

3 respostas

5

Você pode analisar o banco de dados passwd usando awk . No formato passwd , cada entrada é uma lista de campos delimitados por : , com o primeiro campo sendo o nome de usuário e o terceiro campo sendo o UID. Então, no awk, você poderia fazer:

getent passwd | awk -F: '$3 > 10 {print $1}'
    
por muru 12.05.2015 / 01:55
2

SOLUÇÃO 1:

Você pode usar:

#!/bin/bash
while IFS= read -r line; do
    [[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$line"
done </etc/passwd

Considerando que você não tem um nome de usuário contendo : .

Se você quer apenas os nomes de usuário:

#!/bin/bash
while IFS= read -r line; do
    [[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$(cut -d: -f1 <<<"$line")"
done </etc/passwd

Aqui estamos lendo cada linha do arquivo /etc/passwd e comparando o terceiro campo delimitado por : (UID) para verificar se ele é maior que 10. Se é verdade, imprimimos a linha (ou nome de usuário no segundo script).

Isso seria muito mais simples usando um array (graças ao muru):

#!/bin/bash
while IFS=: read -a line; do
    [[ "${line[2]}" -gt 10 ]] && echo "${line[0]}"
done </etc/passwd

SOLUÇÃO 2:

Usando grep com o PCRE:

getent passwd | grep -P '^[^:]+:[^:]+:(?!(?:\d|10):)' | cut -d: -f1
  • ^[^:]+: corresponderá ao primeiro campo (nome de usuário), incluindo :

  • [^:]+: corresponderá ao segundo campo (senha), incluindo o trailing :

  • (?!(?:\d|10):) parte é complicada, é um padrão lookahead negativo de largura zero de PCRE ( grep -P ), significa que não há um único dígito ( \d ) número ou número 10 próximo, seguido por um %código%.

  • : imprimirá apenas o primeiro campo (nome de usuário).

Como alternativa, você pode evitar o cut -d: -f1 , usando o lookahead negativo cut dentro do padrão lookahead (?!) positivo (graças a Avinash Raj):

getent passwd | grep -Po '^[^:]+(?=:[^:]+:(?!(?:\d|10):))'

SOLUÇÃO 3:

usando (?=) :

#!/usr/bin/env python2
with open('/etc/passwd') as f:
    print '\n'.join([line.split(':')[0] for line in f if int(line.split(':')[2]) > 10])

Aqui estamos imprimindo nomes de usuário se o terceiro campo for maior que 10. python dividirá os campos de cada linha em line.split(':') , tornando-se uma lista de campos.

    
por heemayl 12.05.2015 / 02:01
1

Usando o awk:

 awk -F: '{if ($3 > 10) { print $1 ":" $3 } }' /etc/passwd

isso listará todos os usuários com seu UID associado, onde UID > 10.

Graças a @sadi note, para listar apenas nomes de usuário

awk -F: '{if ($3 > 10) {print $1}}' /etc/passwd
    
por Maythux 12.05.2015 / 09:23