统计从一个进程到另一个进程的字节数

我正在运行一个shell脚本,将数据从一个进程pipe理到另一个进程

process_a | process_b 

有没有人知道一种方法来找出两个程序之间传递了多less字节? 我现在唯一能想到的解决scheme是编写一个小型的c程序,它可以读取标准input,写入标准输出并计算所有传输的数据,将计数存储在环境variables中,如:

 process_a | count_bytes | process_b 

有没有人有一个整洁的解决scheme?

通过ddpipe道。 dd的默认input是stdin,默认输出是stdout; 当它完成stdin / stdout I / O时,它会向stderr报告它传输了多less数据。

如果要捕获dd的输出,而其他程序已经与stderr交谈,则使用另一个文件描述符。 例如,

 $ exec 4>~/fred $ input-command | dd 2>&4 | output-command $ exec 4>&- 

使用pipe道查看器。 这是一个伟大的工具。 一旦你知道了它,你永远不会知道你没有它的生活。

它还可以显示进度条,以及转换的“速度”。

process_a | tee >(process_b) | wc --bytes process_a | tee >(process_b) | wc --bytes可能工作。 然后,您可以将wc的计数redirect到您需要的地方。 如果process_bstdout / stderr输出任何东西,那么你可能需要把它redirect到某个地方,如果只是/dev/null

对于一个稍微做作的例子:

 filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes 4295 

通过解释: tee可以让你直接输出到多个文件(加stdout), >()构造是bash的“进程replace”,这使得进程看起来像只写文件,所以你可以redirect到进程以及文件( 在这里看到,或者这个问题+答案的例子使用tee发送输出到许多进程)。

我知道我迟到了,但我相信我有一个很好的答案,可以增强这个有用的线程。
这是@Phil P和@David Spillett的结合,但是:

  • 与@Phil P不同,它避免了创build一个新文件
  • 与@David Spillett不同,它维护着pipe道结构

字节数被打印到标准输出,以及任何输出的process_b。
在使用输出时,可以使用前缀来标识包含字节的行(在本例中为Bytes:

 exec 3>&1 process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b exec 3>&- 

警告:
不要依赖输出中的行的顺序
顺序是不可预知的,即使调用相同参数的脚本也可能总是不一样!