tee 命令 #
tee
命令用于读取标准输入,并同时将内容写入到标准输出和一个或多个文件中。这个命令的名称来源于T型管道接头,它可以将流分成两个方向。
语法 #
tee [选项] [文件...]
常用选项 #
选项 | 描述 |
---|---|
-a, --append |
追加到文件,而不是覆盖 |
-i, --ignore-interrupts |
忽略中断信号 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
常见用法 #
1. 将输出同时显示在屏幕上并写入文件 #
command | tee output.txt
例如:
ls -la | tee file_list.txt
这将列出当前目录的文件,并同时将输出保存到file_list.txt
文件中。
2. 追加到文件而不是覆盖 #
command | tee -a output.txt
例如:
echo "Additional line" | tee -a existing_file.txt
3. 同时写入多个文件 #
command | tee file1.txt file2.txt file3.txt
例如:
date | tee date1.txt date2.txt
4. 将输出写入文件并传递给另一个命令 #
command | tee output.txt | another_command
例如:
cat file.txt | tee copy.txt | grep "pattern"
5. 忽略中断信号 #
command | tee -i output.txt
这在长时间运行的命令中很有用,可以防止意外的中断导致输出丢失。
6. 将输出写入文件并统计行数 #
command | tee output.txt | wc -l
例如:
find / -name "*.log" | tee log_files.txt | wc -l
实用示例 #
1. 记录命令输出并查看 #
sudo apt update | tee update_log.txt
这将执行apt update
命令,同时将输出显示在屏幕上并保存到update_log.txt
文件中。
2. 在管道中间保存输出 #
cat large_file.txt | grep "error" | tee errors.txt | awk '{print $1}'
这将从large_file.txt
中提取包含"error"的行,保存到errors.txt
文件中,并继续处理提取每行的第一个字段。
3. 同时更新多个配置文件 #
echo "new_setting=value" | sudo tee -a /etc/config1.conf /etc/config2.conf
4. 记录脚本执行过程 #
#!/bin/bash
{
echo "Script started at $(date)"
command1
command2
echo "Script finished at $(date)"
} | tee script_log.txt
5. 使用sudo写入需要权限的文件 #
echo "127.0.0.1 mysite.local" | sudo tee -a /etc/hosts
这比使用sudo echo "127.0.0.1 mysite.local" >> /etc/hosts
更可靠,因为后者会遇到权限问题(重定向是由shell执行的,而不是sudo)。
6. 备份文件并修改 #
cat original.conf | tee original.conf.bak | sed 's/old/new/g' > modified.conf
7. 记录命令输出并统计 #
find /var/log -type f -name "*.log" | tee logs.txt | xargs du -sh | sort -hr
这将找到所有日志文件,保存文件列表到logs.txt
,然后计算每个文件的大小并按大小排序。
与其他命令的组合 #
与grep组合 #
dmesg | tee dmesg.log | grep -i error
与awk组合 #
ps aux | tee processes.txt | awk '{print $2, $11}'
与sed组合 #
cat config.txt | tee config.bak | sed 's/debug=false/debug=true/' > config.new
与sort组合 #
find . -type f -name "*.py" | tee python_files.txt | sort
注意事项 #
-
文件权限:如果要写入的文件需要特殊权限,需要使用
sudo tee
而不是sudo echo ... > file
。 -
缓冲问题:在某些情况下,管道中的命令可能会缓冲输出,导致
tee
不能实时写入。可以使用stdbuf
或unbuffer
命令解决:command | stdbuf -oL tee output.txt
-
二进制数据:
tee
可以处理二进制数据,但在查看时可能会显示乱码。 -
文件描述符:
tee
默认只处理标准输出(stdout),不处理标准错误(stderr)。要同时捕获stderr,需要使用shell重定向:command 2>&1 | tee output.txt
与类似命令的比较 #
命令 | 功能 | 区别 |
---|---|---|
tee |
读取标准输入并写入文件和标准输出 | 同时输出到屏幕和文件 |
cat |
连接文件并打印到标准输出 | 只输出到屏幕,不能同时写入文件 |
script |
记录终端会话 | 记录整个会话,而不是单个命令 |
logger |
向系统日志添加条目 | 写入系统日志而不是普通文件 |
提示 #
- 使用
tee
记录长时间运行命令的输出,即使你需要中断命令也能保留已有输出 - 在复杂的管道中使用
tee
可以帮助调试中间步骤 - 使用
tee /dev/null
可以查看输出而不保存到文件 - 在需要sudo权限写入文件时,
tee
是一个很好的解决方案 - 使用
tee >(command1) >(command2)
可以将输出同时发送到多个命令(在支持进程替换的shell中) - 在脚本中使用
tee
可以同时记录日志并显示进度