Diretamente:
who | head -2
who | tail -2
Eu tenho que usar o comando who
para exibir quem está on-line e, em seguida, usar canais para exibir os primeiros e os últimos dois usuários on-line. a única coisa que sei fazer é algo como:
who | head -5 | tail -2
.
Isso não funciona, no entanto.
Diretamente:
who | head -2
who | tail -2
Você pode usar tee
e um redirecionamento para stderr
who | tee >(head -n2 1>&2 ) | tail -n2
Em que tee
permite copiar stdin
para um arquivo e stdout
. Aqui, na verdade, substituímos o arquivo pelo comando head
e redirecionamos sua saída de stdout
para stderr
(via 1>&2
), pois todo o stout
é canalizado para o comando tail
e processado, então precisamos para contornar tail
ing o resultado head
, também. O próprio stderr
, no entanto, ainda está impresso no terminal.
Atualizações após discussão nos comentários
Como apontado por Stéphane, head
pode enviar um sinal SIGPIPE para matar o pipe prematuramente, para que tail
não consiga ver o final real do fluxo de entrada.
Para evitar isso, pode-se ignorar o sinal SIGPIPE conforme descrito aqui , usando um trap
com um comando vazio. Testado em bash
apenas .....
who | { trap "" PIPE ; tee >( head -n 2 3>&1 >&2 ) ; } | tail -n 2
Além disso, mencionado nos comentários: não- bash
shells pode alterar a ordem dos resultados - veja a solução proposta por Stéphane para isso.
Ocorreu mal quando você está tentando usar o comando tail
. Você não está realmente usando para extrair o que deseja da saída do comando who
, mas do comando head
.
Se você precisar usar head
e tail
combinados com a tubulação, você poderá fazer assim, por exemplo:
(who |head -n5 && who |tail -n2)
Modifique os números para atender às suas necessidades