bash - 我可以链接多个命令并使它们都从标准输入获取相同的输入吗?

标签 bash unix shell awk

在 bash 中,有没有一种方法可以链接多个命令,所有命令都从 stdin 获取相同的输入?也就是说,一个命令读取标准输入,进行一些处理,然后将输出写入文件。链中的下一个命令获得与第一个命令获得的输入相同的输入。等等。

例如,考虑通过过滤内容将一个大文本文件拆分为多个文件。像这样:

cat food_expenses.txt | grep "coffee" > coffee.txt | grep "tea" > tea.txt | grep "honey cake" > cake.txt

这显然行不通,因为第二个 grep 获得了第一个 grep 的输出,而不是原始文本文件。我尝试插入T 恤,但这没有帮助。是否有一些 bash 魔法可以导致第一个 grep 将其输入 发送到管道,而不是输出?

顺便说一句,分割文件是一个简单的例子。考虑拆分(通过模式搜索归档)来自网络的连续实时文本流,并将输出写入不同的命名管道或套接字。我想知道是否有使用 shell 脚本的简单方法。

(这个问题是我的 earlier one 的清理版本,基于指出不清楚的回复)

最佳答案

对于这个例子,你应该按照半无用的建议使用 awk。

但通常要让 N 个任意程序读取单个输入流的副本,您可以使用 tee 和 bash 的进程输出替换运算符:

tee <food_expenses.txt \
  >(grep "coffee" >coffee.txt) \
  >(grep "tea" >tea.txt) \
  >(grep "honey cake" >cake.txt)

请注意,>(command) 是一个 bash 扩展。

关于bash - 我可以链接多个命令并使它们都从标准输入获取相同的输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/986017/

相关文章:

bash - 在逐个命令的基础上为 bash 完成设置不区分大小写

linux - 从原始数组创建一个数组,但基于代码运行的位置?

bash - “moveToLocal: Option ' -moveToLocal'尚未执行什么操作。”手段?

macos - 安装 CoffeeScript

python - 在无限循环中并行运行多个脚本

mysql - 如何在命令行上获取 mysql select 查询的树状输出?

c - 在 Kill() 中实现 EINVAL、EPERM、ESRCH

linux - 在多个主机上复制、安装和执行的脚本

linux - 我无法使用 sftp get 命令重命名我正在下载的文件

linux - 意外标记附近的语法错误 '{'