管道命令中如何保存终端屏幕的统计摘要输出而非大文件输出?
解决管道中单独保存命令屏幕输出(stderr)的问题
这事儿核心在于搞清楚命令的输出流向:你说的那个大文件输出是走的标准输出(stdout)——这也是管道默认会传递给下一个命令的内容;而终端上显示的统计摘要,其实是走的标准错误(stderr),这部分默认只会打在屏幕上,不会进入管道。
你之前用tee或者普通重定向拿到大文件,是因为这些操作默认都是针对stdout的,自然抓不到你要的摘要。给你两种常用的解决办法:
1. 直接把摘要保存到文件,同时让大输出继续走管道
用文件描述符重定向,把stderr(对应文件描述符2)单独写到你要的文件里,stdout保持原样传给下一个命令:
你的第一个命令 2> 统计摘要文件.txt | 后面的管道命令
比如举个实际例子,假设第一个命令是big-data-gen,后面是data-processor:
big-data-gen 2> stats.txt | data-processor
这样data-processor会正常处理大输出,而stats.txt里就存着终端原本显示的统计摘要。
2. 既保存摘要到文件,又在屏幕上能看到它
如果你想同时保留屏幕输出和文件备份,可以用bash的进程替换结合tee命令:
你的第一个命令 2> >(tee 统计摘要文件.txt) | 后面的管道命令
这里2> >(tee ...)的意思是把stderr的内容传给tee,tee会一边把内容写到文件,一边输出到屏幕,而stdout还是正常通过管道传给后续命令,完美兼顾你的需求。
为啥之前的方法没用?
&> someFile.txt是把stdout和stderr都重定向到文件,所以大输出和摘要会混在一起;> someFile.txt只重定向stdout,所以拿到的是大文件,摘要还是打在屏幕上;- 单纯用
tee默认也是处理stdout,自然抓不到stderr的内容。
内容的提问来源于stack exchange,提问作者Bella
相关产品推荐
相关产品推荐

