使用管道列出系统上的前两个和最后两个用户?

使用管道列出系统上的前两个和最后两个用户?

我必须使用 who命令来显示谁在线,然后使用管道显示第一个和最后两个在线用户。我唯一知道该怎么做的是:

who | head -5 | tail -2

但这是行不通的。

答案1

直接地:

who | head -2
who | tail -2

答案2

您可以使用tee并重定向到stderr

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

Wheretee允许您复制stdin到文件和stdout.在这里,我们实际上用命令替换文件head,并将其输出重定向stdoutstderr(通过1>&2),因为所有内容stout都通过管道传输到tail命令并进行处理,因此我们也需要规避tail结果headstderr然而它本身仍然打印在终端上。


根据评论中的讨论进行更新

正如 Stéphane 所指出的,head可能会发送 SIGPIPE 信号过早地终止管道,以便tail可能看不到输入流的实际结尾。

为了防止这种情况,可以忽略 SIGPIPE 信号,如下所述这里,通过使用trap带有空命令的 a 。仅在bash......进行了测试

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

评论中还提到:非bashshell 可能会打乱结果的顺序 - 请参阅 Stéphane 提出的解决方案。

答案3

当您尝试使用tail命令时,它会出错。您实际上并没有使用它从who命令的输出中提取您想要的内容,而是从head命令中提取您想要的内容。

如果您需要使用headtail与管道结合,您可以这样做,例如:

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

修改号码以满足您的需求

相关内容