从配置文件清理到实时监控用tee命令提升你的Linux命令行效率附真实案例每次在Linux终端里操作时你是否遇到过这样的困扰执行命令后既想在屏幕上看到实时输出又需要把结果保存到文件里或者在进行系统维护时希望同时记录下所有操作日志这就是tee命令大显身手的时候了。作为一个系统管理员或开发者掌握tee的妙用可以显著提升工作效率特别是在处理配置文件、监控日志和自动化脚本等场景下。tee命令得名于管道中的T型接头它就像这个接头一样能够将数据流同时导向两个方向——终端屏幕和文件。与简单的重定向不同tee保留了命令输出的实时可见性同时确保了数据的持久化存储。下面我将通过一个完整的系统管理任务流程展示tee在实际工作中的多种应用场景。1. 清理配置文件从混乱到有序系统配置文件往往充斥着大量注释和示例内容真正有效的配置可能只占很小一部分。以SSH配置文件为例原始文件通常包含数十行注释而实际配置可能只有几行。这时tee就能帮我们高效地提取有效配置。1.1 过滤注释并保存配置使用grep -v可以轻松过滤掉以#开头的注释行而tee则能同时将结果输出到屏幕和文件grep -v ^# /etc/ssh/ssh_config | tee clean_ssh_config.conf这个命令做了两件事grep -v ^#过滤掉所有注释行tee将结果同时显示在终端并保存到clean_ssh_config.conf文件重要提示如果目标文件已存在tee会默认覆盖它。如果需要追加内容而不是覆盖可以使用-a选项echo 新增配置项 | tee -a clean_ssh_config.conf1.2 配置文件对比技巧清理后的配置文件更易于阅读和维护但有时我们需要对比新旧配置。这时可以结合diff和teediff /etc/ssh/ssh_config clean_ssh_config.conf | tee config_diff.txt这个命令会比较原始配置和清理后的配置将差异同时显示在屏幕上和保存到config_diff.txt2. 实时监控日志既要看得见也要存得下系统管理员经常需要监控日志文件的实时变化传统的tail -f虽然能实时显示日志但无法保存这些内容供后续分析。tee完美解决了这个问题。2.1 基础日志监控tail -f /var/log/syslog | tee syslog_monitor.log这个命令组合实现了tail -f实时跟踪日志文件的新内容tee将这些内容同时显示在终端并记录到syslog_monitor.log2.2 带时间戳的增强型监控为了更方便后续分析我们可以给每条日志加上时间戳tail -f /var/log/syslog | while read line; do echo $(date %Y-%m-%d %H:%M:%S) $line; done | tee timestamped_syslog.log这个更复杂的管道tail -f实时获取新日志while read循环逐行处理date命令为每行添加精确到秒的时间戳tee同时输出到屏幕和文件2.3 多日志源监控有时需要同时监控多个日志文件可以使用tail的-F选项注意是大写的Ftail -F /var/log/{syslog,nginx/access.log} | tee combined_logs.log-F与-f的不同之处在于它还能跟踪被轮转(rotate)的日志文件非常适合生产环境使用。3. 脚本中的审计日志透明操作与完整记录在自动化脚本中tee的另一个重要用途是创建审计日志既让用户看到脚本执行进度又完整记录所有操作细节。3.1 基础脚本日志#!/bin/bash echo 开始部署流程 $(date) | tee deployment.log echo 检查系统版本... | tee -a deployment.log uname -a | tee -a deployment.log echo 安装必要软件包... | tee -a deployment.log apt-get install -y nginx | tee -a deployment.log echo 部署完成 $(date) | tee -a deployment.log这个脚本会在执行时在终端显示所有消息同时将这些消息和命令输出追加到deployment.log3.2 多级日志记录更复杂的脚本可能需要不同级别的日志记录#!/bin/bash log() { local level$1 local message$2 echo $(date %Y-%m-%d %H:%M:%S) [$level] $message | tee -a script.log } log INFO 脚本启动 log DEBUG 检查依赖项 which nginx || log WARNING Nginx未安装将自动安装 apt-get install -y nginx log INFO Nginx安装成功 || log ERROR 安装失败这种实现方式定义了带日志级别的log函数自动添加时间戳同时输出到终端和日志文件根据不同情况记录不同级别的消息3.3 错误流重定向默认情况下tee只处理标准输出(stdout)错误输出(stderr)仍然会直接显示在终端。要同时捕获错误信息需要重定向stderr./deploy.sh 21 | tee deploy_full.log这里的21将标准错误(文件描述符2)重定向到标准输出(文件描述符1)然后tee就能捕获所有输出了。4. 高级技巧与实战组合掌握了tee的基础用法后让我们看看一些更高级的应用场景和技巧组合。4.1 权限提升时的日志记录使用sudo执行命令时tee需要特殊处理才能正确写入文件echo 需要root权限的内容 | sudo tee /root/restricted_file /dev/null这里的关键点将sudo放在tee前面而不是整个管道前/dev/null抑制终端输出因为有时我们只需要写入文件4.2 多文件写入tee可以同时写入多个文件dmesg | tee system_info.log kernel_messages.log /dev/null这个命令将dmesg的输出同时保存到两个不同的日志文件中。4.3 与压缩工具结合对于需要长期保存的大型日志可以边记录边压缩journalctl -f | tee (gzip journal.log.gz) (awk /error/ {print} errors.log) /dev/null这个复杂的命令实时获取系统日志(journalctl -f)同时压缩保存完整日志到journal.log.gz提取包含error的行到errors.log丢弃终端输出(重定向到/dev/null)4.4 性能敏感场景的缓冲控制处理大量数据时可以使用stdbuf控制缓冲行为stdbuf -oL generate_large_output | tee bigfile.txt-oL设置行缓冲模式避免tee积累大量数据才写入文件在意外中断时减少数据丢失。5. 真实案例从问题排查到解决方案去年我们遇到一个生产环境问题某服务间歇性不可用但日志中没有明显错误。使用tee建立了完整的监控和记录系统最终找到了根本原因。5.1 问题重现环境搭建# 监控服务日志 tail -f /var/log/service.log | tee service_monitor_$(date %Y%m%d).log # 同时监控系统资源 vmstat 1 | tee system_stats_$(date %Y%m%d).log5.2 关键发现通过分析tee保存的日志发现每次问题发生时磁盘I/O等待时间激增服务日志中有微秒级的处理延迟5.3 最终解决方案# 部署修复脚本时 ./apply_fix.sh 21 | tee -a deployment_$(date %Y%m%d).log # 验证修复时 stress_test | tee -a test_results_$(date %Y%m%d).log整个过程中tee帮助我们保留了完整的排查记录实现了实时监控和历史回溯的结合确保了所有操作的可审计性