我必须使用 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
,并将其输出重定向stdout
到stderr
(通过1>&2
),因为所有内容stout
都通过管道传输到tail
命令并进行处理,因此我们也需要规避tail
结果head
。stderr
然而它本身仍然打印在终端上。
根据评论中的讨论进行更新
正如 Stéphane 所指出的,head
可能会发送 SIGPIPE 信号过早地终止管道,以便tail
可能看不到输入流的实际结尾。
为了防止这种情况,可以忽略 SIGPIPE 信号,如下所述这里,通过使用trap
带有空命令的 a 。仅在bash
......进行了测试
who | { trap "" PIPE ; tee >( head -n 2 3>&1 >&2 ) ; } | tail -n 2
评论中还提到:非bash
shell 可能会打乱结果的顺序 - 请参阅 Stéphane 提出的解决方案。
答案3
当您尝试使用tail
命令时,它会出错。您实际上并没有使用它从who
命令的输出中提取您想要的内容,而是从head
命令中提取您想要的内容。
如果您需要使用head
并tail
与管道结合,您可以这样做,例如:
(who |head -n5 && who |tail -n2)
修改号码以满足您的需求