¿Utiliza tuberías para enumerar los dos primeros y los dos últimos usuarios en el sistema?

Tengo que usar el command who para mostrar quién está en línea y luego usar pipes para mostrar los primeros y últimos 2 usuarios en línea. lo único que sé hacer es algo así como:

who | head -5 | tail -2 who | head -5 | tail -2 .

Eso no funciona, sin embargo.

Soy nuevo en Linux y no sé qué más hacer porque no hemos aprendido nada más que el uso básico de tuberías.

Directamente:

 who | head -2 who | tail -2 

Puede usar tee y una networkingirección a stderr

 who | tee >(head -n2 1>&2 ) | tail -n2 

Donde tee permite copyr stdin a un file y stdout . Aquí en realidad reemplazamos el file por el command head y networkingirigimos su salida de stdout a stderr (a través de 1>&2 ) ya que todos los stout se canalizan al command tail y se procesan, por lo que también debemos sortear el resultado del head . stderr sí está impreso en la terminal.


Actualizaciones después de discusión en comentarios

Como señala Stéphane, el head puede enviar una señal SIGPIPE que mate la tubería prematuramente para que la tail no vea el final real de la stream de input.

Para evitar esto, uno podría ignorar la señal SIGPIPE como se describe aquí , usando una trap con un command vacío. Probado en bash solo …..

 who | { trap "" PIPE ; tee >( head -n 2 3>&1 >&2 ) ; } | tail -n 2 

Además, se menciona en los comentarios: los proyectiles que no son bash pueden hacer que se caduque el order de los resultados; ver la solución propuesta por Stéphane para esto.

Te sale mal cuando estás tratando de usar el command tail . En realidad, no lo está usando para extraer lo que quiere de la salida del command sino del command principal.

Si necesita usar head y tail combinadas con tuberías, puede hacerlo así, por ejemplo:

(who |head -n5 && who |tail -n2)

Modifique los numbers para satisfacer sus necesidades