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


1

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

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

我截断的输出some_command使用head,但我需要搜索的输出some_command(使用awk在这种情况下)以查找在其截断的行号。

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


想到这一点,我可以使用sed而不是head截断文本...但我仍然想知道它是否可以这样做。
Ashley G

Answers:


1

对于此特定任务,您可以使用sed而不是head - 或者您可以使用awk而不是head

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

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

您描述的问题的更一般的解决方案是

some_command | tee >(command2) | command3

要么

some_command | tee >(command2) >(command3)

这些可以使用bash,但可能没有太多其他的shell(包括sh)。  为您提供运行进程的管道的文件句柄。您可能知道,让您获取数据流并将其写入多个位置。>(command)commandtee

但是你的问题比你说的更复杂。你不是想做

                                          A→B和A→C并联

你想要做的

                A→B→C和A→C并联

其中head命令(对应C于图中)从“ some_command”()获取输入,A但也有一个从awkB)的输出设置的命令行参数。我怀疑对此的一般解决方案会棘手。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.