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.