Usando pipes para listar os dois primeiros e os dois últimos usuários no sistema?

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.

    
por user217538 23.02.2017 / 03:41

3 respostas

4

Diretamente:

who | head -2
who | tail -2
    
por 23.02.2017 / 05:21
0

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.

    
por 23.02.2017 / 15:19
-1

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

    
por 23.02.2017 / 04:05

Tags