如何在 bash 中分割和重新组合 stdout 管道?

如何在 bash 中分割和重新组合 stdout 管道?

我正在命令行上解析文本。如何获取一个命令的输出并在下一个命令的两个地方使用它?

some_command | head -n $( awk '/search_term/ {print FNR} output_of_some_command ) output_of_some_command

some_command我正在截断使用的输出,但我需要搜索(在本例中为使用)head的输出以找到要截断的行号。some_commandawk

我可以这样做吗,还是我需要写入临时文件?

答案1

对于这个特定的任务,您可以使用 –sed而不是–head 或者您可以使用:awkhead

some_command | awk '{print} /search_term/{exit}'

打印行,但是,当找到与搜索词匹配的行时,退出(并且之后不再处理任何行)。

您描述的问题的更通用的解决方案是

some_command | tee >(command2) | command3

或者

some_command | tee >(command2) >(command3)

这些可以在 中工作bash,但可能在很多其他 shell 中都行不通(包括sh)。  为你提供一个文件句柄,指向正在运行的进程的管道>(command)command. 您可能知道,tee可以让您获取数据流并将其写入多个地方。

但你的问题比你所说的要复杂得多。你不是想做

                                          A→B 和 A→C 并行

你想做的

                A→B→C 和 A→C 并行

其中head命令(对应于C图中的)从“ some_command”(A)获取输入,但还具有从awkB。我怀疑对此的一般解决方案是很多更加棘手。

相关内容