在管道中的同一位置收集命令

Collecting commands at the same place in pipe

如何在管道中的同一位置有多个命令(收集在一起)?即,管道中之前出现的内容分别按顺序输入到这些命令中的每一个,并且它们的组合输出被输入到管道的下一步。例如,我怎样才能对这个管道进行一些改动

echo -e "1\n2\n3" | { head -1; tail -1; } | xargs echo

打印1 3,而不仅仅是1

谢谢

what comes before in the pipe gets fed into each of those commands separately and sequentially, and their combined output gets fed into the next step of the pipe

由于管道的性质,这是不可能的。一旦从管道中读取数据,它就会从管道中删除。这就是为什么只能有一个reader。

我会将第一个命令的输出复制到一个临时文件中,然后将其提供给两个命令 headtail。如果您在子 shell 中启动 headtail,您可以将它们的组合输出提供给另一个命令:

顺便说一句,大括号之间的代码块不会启动子 shell。您需要使用括号。以下命令似乎最接近您想要的:

echo -e "1\n2\n3" > file.tmp ; ( head -1 file.tmp ; tail -qn1 file.tmp; rm file.tmp ) | next_command

关于特殊用例:打印文件的第一行和最后一行

为此我会使用 sed

sed -n '1p;$p'

这将打印文件的第一行和最后一行。但是,它仅适用于至少包含两行的文件。如果文件包含一行,它将被打印两次。您可以使用以下命令绕过此限制:

sed -n 'x;s/^/1/;x;1p;${x;/11/{x;p}}'

上面的命令在每一行的保持缓冲区中添加一个1。在脚本的末尾(可能在第一行之后),它检查保留缓冲区中是否至少有两个 1 并打印最后一行,如果是的话。