在管道中的同一位置收集命令
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。
我会将第一个命令的输出复制到一个临时文件中,然后将其提供给两个命令 head
和 tail
。如果您在子 shell 中启动 head
和 tail
,您可以将它们的组合输出提供给另一个命令:
顺便说一句,大括号之间的代码块不会启动子 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
并打印最后一行,如果是的话。
如何在管道中的同一位置有多个命令(收集在一起)?即,管道中之前出现的内容分别按顺序输入到这些命令中的每一个,并且它们的组合输出被输入到管道的下一步。例如,我怎样才能对这个管道进行一些改动
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。
我会将第一个命令的输出复制到一个临时文件中,然后将其提供给两个命令 head
和 tail
。如果您在子 shell 中启动 head
和 tail
,您可以将它们的组合输出提供给另一个命令:
顺便说一句,大括号之间的代码块不会启动子 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
并打印最后一行,如果是的话。