tee命令

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

注意事项 #

  1. 文件权限:如果要写入的文件需要特殊权限,需要使用sudo tee而不是sudo echo ... > file

  2. 缓冲问题:在某些情况下,管道中的命令可能会缓冲输出,导致tee不能实时写入。可以使用stdbufunbuffer命令解决:

    command | stdbuf -oL tee output.txt
    
  3. 二进制数据tee可以处理二进制数据,但在查看时可能会显示乱码。

  4. 文件描述符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可以同时记录日志并显示进度