tee 命令用于从标准输入读取数据,并同时将数据写入标准输出和指定的文件。它就像水管工使用的 T 型管接头,可以将数据流同时导向多个方向,是 Linux 管道操作中非常重要的工具。
tee [选项] [文件...]
常用形式:
# 基本用法
命令 | tee 文件
# 写入多个文件
命令 | tee 文件1 文件2 文件3
# 追加到文件
命令 | tee -a 文件
# 查看文件内容并保存到日志文件
cat important.txt | tee output.log
# 查看进程信息并保存
ps aux | tee process_info.txt
# 同时查看和保存命令输出
ls -la | tee directory_listing.txt
# 追加到文件而不是覆盖
echo "新的日志条目" | tee -a app.log
# 多次追加日志
date | tee -a system_log.txt
who | tee -a system_log.txt
uptime | tee -a system_log.txt
# 查看追加结果
tail -5 system_log.txt
# 同时写入多个文件
ls -l | tee file1.txt file2.txt file3.txt
# 验证所有文件内容相同
diff file1.txt file2.txt
diff file2.txt file3.txt
# 同时写入日志文件和备份文件
df -h | tee disk_usage.log disk_backup.txt
# 在复杂管道中保存中间结果
cat data.txt | grep "error" | tee errors.txt | wc -l
# 处理数据并保存原始输出
cat numbers.txt | tee raw_data.txt | sort | uniq > unique_numbers.txt
# 查看处理前后的数据
echo -e "3\n1\n2\n3\n1" | tee original.txt | sort | uniq > sorted.txt
#!/bin/bash
# 使用tee记录脚本执行过程
LOG_FILE="script_$(date +%Y%m%d_%H%M%S).log"
echo "脚本开始执行..." | tee "$LOG_FILE"
echo "当前时间: $(date)" | tee -a "$LOG_FILE"
# 执行命令并记录输出
ls -la | tee -a "$LOG_FILE"
df -h | tee -a "$LOG_FILE"
echo "脚本执行完成" | tee -a "$LOG_FILE"
echo "日志文件: $LOG_FILE"
#!/bin/bash
# 监控系统状态并记录
MONITOR_LOG="/var/log/system_monitor.log"
ALERT_THRESHOLD=80
# 检查磁盘使用率
df -h | grep -v tmpfs | tee -a "$MONITOR_LOG" | awk '
$5 > '"$ALERT_THRESHOLD"' {
print "警告: 磁盘 " $1 " 使用率 " $5 " > '"$ALERT_THRESHOLD"'%"
}'
# 检查内存使用
free -h | tee -a "$MONITOR_LOG" | grep Mem | awk '
$3/$2 * 100 > '"$ALERT_THRESHOLD"' {
print "警告: 内存使用率 > '"$ALERT_THRESHOLD"'%"
}'
# 记录软件安装过程
sudo apt update | tee install.log
sudo apt install nginx -y | tee -a install.log
# 配置服务并记录
sudo systemctl enable nginx | tee -a install.log
sudo systemctl start nginx | tee -a install.log
# 验证安装
nginx -v | tee -a install.log
echo "安装完成,详细日志见 install.log"
#!/bin/bash
# 备份数据并验证
BACKUP_SRC="/home/user/documents"
BACKUP_DEST="/backup/documents_$(date +%Y%m%d).tar.gz"
LOG_FILE="/var/log/backup.log"
echo "开始备份: $(date)" | tee -a "$LOG_FILE"
# 创建备份并记录过程
tar -czf "$BACKUP_DEST" "$BACKUP_SRC" 2>&1 | tee -a "$LOG_FILE"
# 验证备份文件
if [ -f "$BACKUP_DEST" ]; then
echo "备份成功: $BACKUP_DEST" | tee -a "$LOG_FILE"
echo "文件大小: $(du -h "$BACKUP_DEST" | cut -f1)" | tee -a "$LOG_FILE"
else
echo "备份失败!" | tee -a "$LOG_FILE"
exit 1
fi
echo "备份完成: $(date)" | tee -a "$LOG_FILE"
# 同时将输出发送到多个命令处理
ls -la | tee >(grep ".txt" > txt_files.txt) >(grep ".log" > log_files.txt) > all_files.txt
# 验证结果
wc -l *.txt
# 输出:
# 15 all_files.txt
# 3 log_files.txt
# 5 txt_files.txt
# 实时监控日志并记录特定事件
tail -f /var/log/syslog | tee full_log.txt | grep -i "error" > errors.txt
# 在另一个终端查看错误
# tail -f errors.txt
# 监控网络连接并记录
netstat -tulpn | tee network_connections.txt | grep LISTEN
#!/bin/bash
# 调试复杂的数据处理管道
INPUT_FILE="data.csv"
DEBUG_LOG="debug.log"
echo "开始数据处理..." | tee "$DEBUG_LOG"
# 在管道的每个阶段保存中间结果
cat "$INPUT_FILE" | \
tee raw_data.txt | \
grep -v "^#" | \
tee cleaned_data.txt | \
awk -F, '{print $1 "," $3}' | \
tee selected_columns.txt | \
sort | \
tee sorted_data.txt | \
uniq > final_result.txt
echo "数据处理完成" | tee -a "$DEBUG_LOG"
echo "中间文件已保存用于调试" | tee -a "$DEBUG_LOG"
#!/bin/bash
# 使用sudo记录特权操作
AUDIT_LOG="/var/log/sudo_audit.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
echo "=== Sudo操作审计 ===" | sudo tee -a "$AUDIT_LOG"
echo "时间: $TIMESTAMP" | sudo tee -a "$AUDIT_LOG"
echo "用户: $(whoami)" | sudo tee -a "$AUDIT_LOG"
echo "命令: $@" | sudo tee -a "$AUDIT_LOG"
# 执行命令并记录输出
sudo "$@" 2>&1 | sudo tee -a "$AUDIT_LOG"
echo "=== 操作结束 ===" | sudo tee -a "$AUDIT_LOG"
# 同时捕获标准输出和标准错误
ls -la /root /nonexistent 2>&1 | tee output.log
# 分别处理标准输出和标准错误
(ls -la /root | tee stdout.log) 2>&1 | tee stderr.log
# 合并输出但分别标记
{
echo "=== 标准输出 ==="
ls -la /etc/passwd
echo "=== 标准错误 ==="
ls -la /nonexistent
} 2>&1 | tee combined.log
# 使用不同的文件描述符
exec 3>&1 # 保存标准输出到文件描述符3
ls -la | tee log.txt | cat >&3 # 同时输出到文件和屏幕
# 复杂的重定向
{
echo "开始任务..."
find /etc -name "*.conf" 2>/dev/null
echo "任务完成"
} | tee task.log | grep "\.conf" > conf_files.txt
| 命令 | 功能 | 适用场景 |
|---|---|---|
tee |
双向数据流 | 同时输出到屏幕和文件,管道中间保存数据 |
> 重定向 |
输出到文件 | 简单地将输出保存到文件,不显示在屏幕 |
| 管道 |
连接命令 | 将一个命令的输出作为另一个命令的输入 |
script |
记录整个会话 | 记录终端的所有输入输出 |
tail -f |
实时查看文件 | 监控文件变化,但不修改文件 |
tee -a 追加日志,避免覆盖重要数据2>&1 可以同时捕获标准输出和标准错误tee >(command) 可以实现复杂的数据分流exec > >(tee log.txt) 可以自动记录所有输出sudo tee 可以将输出写入需要特权访问的文件timestamp 命令可以为日志添加时间戳-a 选项追加