Podemos canalizar a saída de who
para awk
para imprimir somente a primeira célula de cada registro (linha) e então canalizá-la para o comando sort
, que classificará a valores alfabeticamente e produzirá apenas as entradas -u
exclusivas:
who | awk '{print }' | sort -u
Ou podemos usar apenas awk
em desta forma :
who | awk '!seen[]++ {print }'
Uma solução compatível com POSIX, fornecida por @dessert - onde cut
usará os espaços como delimitador -d' '
e imprimirá apenas o primeiro campo de cada registro -f1
:
who | cut -d' ' -f1 | sort -u
Graças a @DavidFoerster aqui é uma sintaxe muito mais curta que não perde a informação de todos os outros colunas:
who | sort -u -k 1,1
Para os mesmos propósitos, podemos usar o comando w
com a opção -h
(ignorar cabeçalhos), por exemplo:
w -h | awk '!seen[]++ {print }'
Poderíamos usar também o comando users
combinado com o comando rs
(reshape data) com a opção de transposição -T
e, em seguida, novamente sort -u
:
users | rs -T | sort -u
Poderíamos usar e who -q
com transposição da seguinte maneira - onde o comando head -1
irá cortar apenas a primeira linha da saída do comando anterior:
who -q | head -1 | rs -T | sort -u
Veja também: