Linux tee命令:从基础到高级的管道数据分流实战

📅 2026/6/17 22:52:07
Linux tee命令:从基础到高级的管道数据分流实战
1. 为什么你需要掌握tee命令第一次接触Linux管道时我像发现新大陆一样兴奋。但很快遇到了一个头疼的问题当我把grep、awk这些命令用管道串联起来时中间结果就像变魔术一样消失了。比如想调试一个复杂的日志处理命令既想看到中间结果又要把最终结果保存到文件这时候tee就成了救命稻草。简单来说tee就像水管上的三通接头。想象你在给花园浇水主水管连接着喷头终端输出但你想接个分支水管把水引到蓄水池文件。普通的重定向会把喷头完全关闭而tee能让你两不耽误。这个特性在以下场景特别实用调试长管道命令时实时观察数据流同时记录日志文件和查看实时输出把相同数据分发到多个处理流程2. 基础用法从零开始玩转tee2.1 最简使用模式先看个最简单的例子把ls命令的输出同时显示到屏幕和保存到文件ls -l | tee directory_listing.txt这时你会看到终端正常显示ls -l的结果当前目录下会生成directory_listing.txt文件内容和终端显示完全一致2.2 追加模式实战默认情况下tee会覆盖目标文件就像用重定向。如果想保留原文件内容需要-a参数echo 第一行 | tee log.txt echo 第二行 | tee -a log.txt现在log.txt里会有两行内容。这个模式特别适合记录长时间运行的脚本输出比如while true; do date | tee -a status.log sleep 1 done2.3 多文件写入技巧tee最强大的功能之一是能同时写入多个文件dmesg | tee system.log kernel.log debug.log这条命令会把内核消息同时保存到三个不同文件。我在监控服务器启动过程时经常这样用把关键信息分类存储。3. 高级组合技管道中的瑞士军刀3.1 与grep的黄金组合排查系统问题时经常需要既过滤日志又保存原始信息。比如查看SSH登录失败记录journalctl -u sshd | tee ssh_raw.log | grep Failed password ssh_failures.log这样ssh_raw.log保存完整日志ssh_failures.log只包含失败记录终端实时显示过滤后的结果3.2 调试复杂管道的利器当管道命令变得复杂时tee就像给管道开了观察窗。假设我们要分析Nginx访问日志cat access.log | tee original.log \ | awk {print $1} | tee ips.log \ | sort | uniq -c | sort -nr top_ips.txt这个命令链中原始日志保存到original.log提取的IP列表保存到ips.log最终统计结果到top_ips.txt3.3 实时监控与记录并行处理大文件时可以用teepv实现带进度显示的备份pv huge_file.dat | tee backup.dat | md5sum checksum.txt这里pv显示进度条和传输速率tee同时写入备份文件md5sum计算校验和4. 生产环境实战案例4.1 安全审计日志方案在安全审计中我们常需要不可篡改的日志记录。结合tee和sudo可以这样做sudo tcpdump -i eth0 | tee raw_traffic.log \ | awk {print $3} suspicious_ips.txt这里用sudo获取权限原始流量保存到raw_traffic.log只有root可写同时提取可疑IP供分析。4.2 自动化部署中的双日志在CI/CD流程中我习惯这样记录部署日志./deploy.sh 21 | tee /var/log/deploy.log | logger -t DEPLOY这样实现实时终端输出持久化到文件同时写入系统日志4.3 多终端广播技巧通过结合tee和/dev/pts可以把输出广播到多个登录终端top | tee /dev/pts/1 /dev/pts/2 /dev/pts/3在需要多人协作监控服务器时特别有用。先用who命令查看所有登录终端然后选择要广播的目标。5. 性能优化与陷阱规避5.1 缓冲区问题解决方案默认情况下管道会使用缓冲区可能导致输出延迟。如果需要实时性可以stdbuf -o0 command | tee log.txtstdbuf -o0禁用输出缓冲确保即时显示和写入。在监控实时数据流时这个技巧很重要。5.2 处理大文件时的内存管理当处理GB级文件时错误的tee用法可能导致内存溢出。应该避免cat huge_file | tee copy1 copy2 copy3 # 危险推荐改用分流处理cat huge_file | tee (process1) (process2) (process3) /dev/null5.3 权限与错误处理使用tee写入系统目录时要注意权限问题。安全做法是command | sudo tee /var/log/protected.log /dev/null这样既避免了用root运行整个管道又能写入受保护文件。注意重定向stdout到/dev/null否则sudo会保留原用户终端权限。6. 超实用技巧合集6.1 彩色输出保留方案如果想保存带颜色的命令输出到文件需要特殊处理script -q -c ls --coloralways | tee colored.txtscript命令会保留ANSI颜色代码这样在终端和文件中都能显示彩色。6.2 时间戳记录模式给每行输出添加时间戳可以这样实现command | while read line; do echo $(date %T) $line | tee -a timed.log done6.3 多用户协作日志用tee和mkfifo创建共享日志管道mkfifo shared_pipe tail -f shared_pipe | tee user1.log user2.log command1 shared_pipe command2 shared_pipe不同用户或进程可以通过同一个管道共享日志流。