使用进程替换或通过分组和管道,可以将输出 ( stdout ) 一组命令作为另一个命令的输入传递。
例子 :
wc < <(echo hi;echo bye)
(echo hi; bye) | wc
但是有相反的吗?
也就是说,有没有办法在一行中将一个命令的输出作为许多其他命令的输入发送?
就像是 :
cat testfile | wc | tail -n 5
(不要从字面上理解管道)。在这里,我试图将输出传递cat testfile
给两者wc
tail -n 5
另一个例子是:
(得到一个句子的最后一个词)
echo "some random words"| wc -c | cut -f(out put of wc -c) (output of first echo)
快速回答。您可以使用
tee >(what_to_do) >(another_thing_to_do)
您的命令继续执行您想做的许多不同的事情。例子:
原始测试文件输出:
tee
添加了命令的输出:tee 中的每个命令只是您将在命令行上使用的普通命令,就像 add in
>(head -1 | wc)
一样。awk
或者你也可以通过使用with来抓住最后一行的最后一句话,$NF
就像wc
这样:注意:将
|
管道命令添加到末尾可以使用命令中的多个命令覆盖tee
。我在这里有一些我一直在测试的例子:示例 1(管道命令拉取所有最后的单词):
示例 2(不显示 wc 命令的输出。管道命令抓取第三个单词。):
示例 3(抓取 echo 行的第三个字。Tee 命令。):
示例 4(抓取 echo 行的最后一个单词。Tee 命令。):
希望这可以帮助!
您需要
tee
将流分成几部分。尝试:笔记:
如果多个进程 (
wc
,tail
) 都在写入标准输出:您可能会得到乱码输出。
无法保证它们的输出出现的顺序。要看到这一点,请尝试
sleep 1; wc -w
作为第二个消费者。tee
如果它的任何目的地没有足够快地消耗流,将阻塞。这意味着,目的地将以大致相似的速度(以固定大小的缓冲为模)输入。对此没有简单的解决方法,唯一的选择是将流保存到文件中,然后分别将其提供给消费者。因为这不是问题wc
。tail
最后一句话,做起来更简单:
该
moreutils
包提供的命令pee
(管道和三通的合并,你怎么看?)正是这样做的。对于您的第一个示例,您将使用:
第二个示例更复杂,因为您想将两个输入传递给最后一个命令。我可能会
awk
用作其他答案。链接:https ://joeyh.name/code/moreutils/