如何在Bash中处理输出流时同时打印完整日志?
解决输出分流问题:同时显示完整日志并处理管道
我来给你捋捋这个问题——你要的是一边把命令xxx的完整日志(包括stderr转过来的内容)输出到屏幕,一边还能把这些内容传给grep、sed做后续处理对吧?这是典型的输出分流需求,用tee命令就能完美解决,我给你具体方案:
直接可用的命令
把你的命令改成这样就行:
xxx 2>&1 | tee /dev/tty | grep 'Word:' | sed -e ...
为什么这个方案有效?
我拆解下每个部分的作用:
2>&1:把xxx命令的标准错误(stderr)重定向到标准输出(stdout),这样所有输出(正常输出+错误信息)都合并成一个流。tee /dev/tty:tee的核心功能是读取输入,同时输出到指定目标和标准输出。这里/dev/tty代表当前终端,所以它会把所有内容打印到屏幕,同时把内容原封不动地传给下一个管道(也就是后面的grep)。- 后面的
grep和sed就和你原来的逻辑一样,处理合并后的输出,完全不影响原有功能。
你之前尝试的问题在哪?
你用2>&1 | echo 2>&1是无效的,因为echo根本不会读取管道传过来的内容——它只会输出自己的命令参数(也就是2>&1这串字符),既没把xxx的输出显示到屏幕,也没把内容传给后续管道,所以自然达不到预期效果。
额外拓展:同时保存日志到文件
要是你不仅要在屏幕看完整日志,还想把日志永久保存到文件里,可以给tee多加一个文件参数:
xxx 2>&1 | tee /dev/tty full_command_log.txt | grep 'Word:' | sed -e ...
这样屏幕会显示完整输出,full_command_log.txt文件里也会保存一份一模一样的日志记录。
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

