Listando grupos de usuários
Você pode obter uma lista de todos os seus usuários locais com este comando:
$ getent passwd | awk -F: '{print $1}'
OBSERVAÇÃO: getent
retornará usuários locais supondo que você não tenha sssd
(ou algum serviço semelhante em execução que também atrai usuários LDAP) e seu /etc/nsswitch.conf
esteja restrito a arquivos, ou seja, não está incluindo coisas como NIS ou NIS +. Somente para usuários locais, você pode recorrer a awk -F: '{print $1}' /etc/passwd
.
Uma lista de quem está conectado no momento:
$ who
Uma lista de usuários que atualmente não estão logados:
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
<(getent passwd | awk -F: '{print $1}')
Este último leva a lista de usuários que estão logados e mostra a lista de todos os usuários menos os usuários logados, usando grep -vf
.
Obtendo contagens
Para obter contagens, basta levar um wc -l
para o final dos comandos.
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
<(getent passwd | awk -F: '{print $1}') | wc -l
53
logado
$ who | awk '{print $1}' | sort -u | wc -l
1
grep flags
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines,
any of which is to be matched.
-x, --line-regexp
Select only those matches that exactly match the whole line.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains
zero patterns, and therefore matches nothing.
Usando join em vez de grep
Você também pode abrir mão usando grep
e usar join
, já que esse tipo de problema é maior na casa do leme de join
. Precisamos usar join -v 2
, o que significa que queremos excluir correspondências e mostrar apenas os únicos do nosso segundo argumento, getent ...
.
-a FILENUM
also print unpairable lines from file FILENUM, where FILENUM is
1 or 2, corresponding to FILE1 or FILE2
-v FILENUM
like -a FILENUM, but suppress joined output lines
$ join -v 2 <(who | awk '{print $1}' | sort -u) \
<(getent passwd | awk -F: '{print $1}' | sort) | wc -l
53
OBSERVAÇÃO: A única ressalva de usar join
é que ambas as listas precisam ser classificadas, por isso, precisamos adicionar um | sort
a getent ...
.