别再用 > 和 >> 了!Linux tee命令的5个实用场景,从日志记录到管道调试 别再用 和 了Linux tee命令的5个实用场景从日志记录到管道调试每次在终端敲下或时你是否想过这个简单的重定向操作其实隐藏着不少痛点当需要同时查看实时输出和保存日志时当复杂的管道命令中间结果需要调试时当同一份数据需要写入多个不同文件时——这些场景下传统的重定向就显得力不从心了。这正是tee命令大显身手的地方。tee这个命名来源于管道工程中的T型三通接头形象地表达了它分流数据的核心功能。与单纯的重定向不同tee能够在数据流动的过程中创建一个检查点既让数据继续流向标准输出终端屏幕又能够将数据副本写入指定文件。这种一箭双雕的特性在下面这些实际场景中尤为珍贵。1. 实时监控并持久化长时间运行的命令输出编译大型项目、处理海量数据或执行系统备份时我们常常面临一个两难选择如果只用重定向虽然能保存日志但执行过程中完全看不到进度如果直接输出到终端一旦终端关闭或需要回溯日志时就束手无策。tee完美解决了这个困境。make -j8 | tee build.log这个简单的命令组合实现了实时在终端显示编译输出包括警告和错误信息同时将所有输出完整保存到build.log文件保持输出的原始顺序和格式提示结合tail -f可以同时监控实时输出和日志文件这在持续集成环境中特别有用。当处理特别长时间的任务时你可能还想追加模式避免覆盖原有日志command | tee -a long_run.log同时输出到多个日志文件command | tee main.log backup.log过滤敏感信息后记录command | grep -v password | tee sanitized.log2. 复杂管道命令的中间调试利器管道(|)是Linux命令行最强大的特性之一但当一连串命令通过管道连接时如果最终结果不符合预期排查中间哪一步出了问题就变得异常困难。传统做法需要拆分管道逐步测试而tee提供了更优雅的调试方案。假设我们有一个复杂的日志处理流水线cat access.log | awk {print $1} | sort | uniq -c | sort -nr | head -10要调试这个命令可以在任意两个命令之间插入tee来检查中间结果cat access.log | tee raw.log | awk {print $1} | tee ips.log | sort | uniq -c | tee counts.log | sort -nr | head -10现在你得到了raw.log原始日志文件内容ips.log提取后的IP地址列表counts.log初步统计结果这种调试方式的优势在于不需要打断原有命令流程可以同时查看多个阶段的中间结果保留完整数据供后续分析特别适合自动化脚本的调试3. 多目标日志记录一份输入多处输出系统管理员经常需要将同一份数据写入不同格式的日志文件——可能是纯文本日志、CSV统计报表或者是过滤后的错误日志。传统方法需要多次执行相同命令而tee可以一次性完成。vmstat 1 10 | tee \ (grep -v memory memory_stats.log) \ (awk {print $1,$2,$3} cpu_stats.log) \ system_full.log这个命令实现了将vmstat的输出完整保存到system_full.log过滤掉内存相关行后保存到memory_stats.log提取前三个CPU相关字段保存到cpu_stats.log更复杂的多路分发示例nginx -t 21 | tee \ (grep emerg emergency.log) \ (grep error errors.log) \ (grep warn warnings.log) \ all_messages.log4. 突破权限限制与sudo的完美配合使用sudo执行命令时直接重定向会遇到权限问题因为重定向是由当前用户的shell处理的。tee配合sudo可以优雅解决这个问题。常见错误做法sudo echo 127.0.0.1 newhost /etc/hosts # 权限不足正确解决方案echo 127.0.0.1 newhost | sudo tee -a /etc/hosts /dev/null这里有几个关键点tee以sudo权限运行可以写入系统文件-a参数表示追加而非覆盖 /dev/null避免在终端显示输出因为sudo可能要求密码其他典型应用场景修改系统配置文件echo JAVA_HOME/opt/jdk | sudo tee -a /etc/environment更新crontabecho 0 3 * * * backup | sudo tee -a /var/spool/cron/root写入受保护日志diagnostic_tool | sudo tee /var/log/diagnostic.log5. 自动化脚本中的进度显示与日志记录在编写自动化部署脚本或批处理任务时我们既希望实时看到执行进度又需要完整记录所有输出以备查验。tee让这两个需求同时满足变得简单。考虑一个自动化部署脚本deploy.sh#!/bin/bash { echo 开始部署 $(date) git pull origin master 21 npm install 21 systemctl restart myapp 21 echo 部署完成 $(date) } | tee -a /var/log/deploy.log这种结构的优势在于大括号{}将多个命令的输出组合为一个流tee -a追加模式保留历史部署记录既在终端显示实时进度又完整记录到日志文件21确保错误信息也被捕获更完善的脚本可能会添加时间戳| while read line; do echo [$(date)] $line; done | tee -a log错误检测if ! grep -q ERROR log; then echo Success; fi日志轮转mv log log.$(date %Y%m%d)高级技巧与性能考量虽然tee非常实用但在高性能场景下也需要考虑一些优化技巧缓冲控制stdbuf -oL command | tee output.log # 行缓冲模式处理二进制数据dd if/dev/sda | tee disk.img | md5sum disk.md5与进程替换结合diff (command1 | tee proc1.log) (command2 | tee proc2.log)性能对比表方法内存占用磁盘I/O适用场景command file低一次写入只需保存输出commandtee file中多次写入commandtee file1 file2高多次写入在实际使用中如果处理GB级别的大文件可能需要考虑使用pv监控进度pv bigfile | tee backup.img /dev/null限制写入速度dd if/dev/sda | pv -L 10m | tee disk.img /dev/null并行处理command | tee (process1) (process2) output.log