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: