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.