Featured image of post Linux 文本处理 cat 与 tee 命令详解 📜

Linux 文本处理 cat 与 tee 命令详解 📜

Linux 文本处理 cat 与 tee 命令详解 📜 掌握「看内容」「写文件」「分流输出」三大核心技

Linux 文本处理 cat 与 tee 命令详解 📜

掌握「看内容」「写文件」「分流输出」三大核心技能,提升命令行工作效率


📖 目录导航


✨ 命令特点

  • 📖 简洁高效: 两个命令解决大多数文本处理需求
  • 🔄 灵活组合: 可与管道符和其他命令完美配合
  • 💾 双向操作: 既支持读取也支持写入文件
  • 🎯 精准控制: 支持追加、覆盖等多种写入模式
  • 🛡️ 安全可靠: 提供防止误操作的保护机制

🎯 一、命令定位

命令 核心能力 类比说明 适用场景
cat 读取、拼接、创建文件 文本胶水 查看内容、合并文件、创建文档
tee 分流输出,同时显示和保存 三通水管 日志记录、调试输出、权限提升写入

📊 功能对比矩阵

功能 cat tee 说明
读取文件 cat 主要用于读取
写入文件 两者都支持写入
屏幕输出 都可输出到终端
管道处理 都支持管道操作
多文件操作 都支持多个文件
输出分流 tee 的独特功能

🔍 二、cat 命令详解

📝 基本语法

1
cat [选项] [文件...]

🎯 常用选项

选项 说明 示例
-n 显示行号 cat -n file.txt
-b 显示行号(跳过空行) cat -b file.txt
-s 压缩连续空行 cat -s file.txt
-A 显示所有字符(包括控制字符) cat -A file.txt
-E 在每行末尾显示 $ cat -E file.txt
-T 将制表符显示为 ^I cat -T file.txt

💡 实用示例

1. 基础文件操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看文件内容
cat filename.txt

# 查看多个文件
cat file1.txt file2.txt

# 显示行号
cat -n server.log

# 显示行号(忽略空行)
cat -b config.conf

2. 文件创建与编辑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 创建新文件(Ctrl+D 结束输入)
cat > newfile.txt
Hello World
This is a new file
Ctrl+D

# 追加内容到文件
cat >> existing.txt
Additional content
Ctrl+D

# 使用 heredoc 创建文件
cat > script.sh << 'EOF'
#!/bin/bash
echo "Hello from script"
EOF

3. 文件合并与处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 合并多个文件
cat part1.txt part2.txt > complete.txt

# 合并并排序
cat file1.txt file2.txt | sort > sorted.txt

# 查看文件并分页显示
cat longfile.txt | less

# 显示文件开头几行
cat file.txt | head -10

# 显示文件末尾几行
cat file.txt | tail -10

4. 高级用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 查看二进制文件(十六进制)
cat binaryfile | hexdump -C

# 创建多行配置文件
cat > config.json << 'EOF'
{
  "server": "localhost",
  "port": 8080,
  "enabled": true
}
EOF

# 批量处理文件
for file in *.txt; do
    cat "$file" | grep "error" >> all_errors.txt
done

🔀 三、tee 命令详解

📝 基本语法

1
命令 | tee [选项] 文件...

🎯 常用选项

选项 说明 示例
-a 追加模式(不覆盖) `cmd
-i 忽略中断信号 `cmd
-p 诊断写入错误 `cmd

💡 实用示例

1. 基础输出分流

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 同时输出到屏幕和文件
ls -la | tee directory_listing.txt

# 追加到文件(不覆盖)
echo "New entry" | tee -a log.txt

# 输出到多个文件
dmesg | tee system.log boot.log

# 同时输出到屏幕和多个文件
ps aux | tee process_list.txt /tmp/backup_process.log

2. 调试与日志记录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 记录命令输出并查看
python script.py 2>&1 | tee execution.log

# 安装软件并记录日志
sudo apt install nginx | tee install.log

# 编译项目并记录输出
make 2>&1 | tee build.log

# 带时间戳的日志记录
echo "Task started at $(date)" | tee -a task_log.txt

3. 权限管理

1
2
3
4
5
6
7
8
# 使用 sudo 写入受保护文件
echo "new config value" | sudo tee /etc/config.conf

# 追加到受保护文件
echo "additional setting" | sudo tee -a /etc/settings.conf

# 多用户共享日志
systemctl status nginx | tee /var/log/nginx-status.log | sudo tee /shared/nginx-status.log

4. 高级分流技巧

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 多重分流处理
netstat -tulpn | tee raw_connections.txt | grep ":80" | tee http_connections.txt

# 实时监控并记录
tail -f /var/log/syslog | tee monitor.log | grep "error"

# 条件性分流
df -h | tee disk_usage.txt | awk '$5 > "80%" {print "Warning:", $0}'

# 编码转换分流
cat file.txt | tee original.txt | iconv -f UTF-8 -t ASCII > ascii_version.txt

🚀 四、黄金组合技巧

1. 备份 + 修改配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安全修改配置文件
cat /etc/nginx/nginx.conf | \
  sudo tee nginx.conf.backup | \
  sed 's/listen 80;/listen 8080;/' | \
  sudo tee /etc/nginx/nginx.conf

# 解释:
# 1. 读取原配置
# 2. 备份到文件
# 3. 修改配置(端口80→8080)
# 4. 写回原位置

2. 安装与日志记录

1
2
3
4
5
6
7
8
9
# 完整安装日志记录
{
  echo "=== 开始安装: $(date) ==="
  sudo apt update
  sudo apt install -y git nodejs npm
  echo "=== 安装完成: $(date) ==="
} 2>&1 | tee /var/log/software_install.log

# 同时显示进度和保存日志

3. 多日志实时聚合

1
2
3
4
5
6
# 监控多个日志文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log | \
  tee nginx_combined.log | \
  grep -E "(ERROR|WARN|40[0-9]|50[0-9])"

# 实时监控并过滤重要信息

4. 数据流水线处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 复杂数据处理流水线
cat raw_data.csv | \
  tee original_data_backup.csv | \
  grep -v "test" | \
  tee filtered_data.csv | \
  awk -F',' '{print $1","$3","$5}' | \
  tee final_data.csv | \
  wc -l

# 每个阶段都保存中间结果

5. 系统监控与告警

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 系统健康检查与告警
{
  echo "=== 系统健康检查: $(date) ==="
  echo "--- 内存使用 ---"
  free -h
  echo "--- 磁盘空间 ---"
  df -h
  echo "--- CPU负载 ---"
  uptime
} | tee /var/log/health_check.log | \
  awk '/^Warning:/ {print "ALERT:", $0; system("mail -s \"系统告警\" admin@example.com")}'

⚠️ 五、注意事项

🚫 常见陷阱与解决方案

问题 风险 解决方案
文件覆盖 意外丢失数据 使用 >>tee -a 追加
权限不足 写入失败 使用 sudo tee 提权
特殊字符 解析错误 heredoc 加引号 <<'EOF'
大文件处理 内存溢出 使用 less/head/tail
二进制文件 终端乱码 避免用 cat 显示二进制文件

🛡️ 安全最佳实践

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 总是验证文件内容
cat important_file.txt | less

# 2. 使用别名防止误覆盖
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 3. 重要操作前备份
cp file.txt file.txt.bak
# 或者
cat file.txt > file.txt.backup

# 4. 使用 set -u 避免未定义变量
set -u

# 5. 检查命令返回值
if cat file.txt > /dev/null; then
    echo "文件读取成功"
else
    echo "文件读取失败" >&2
fi

🔧 性能优化建议

1
2
3
4
5
6
7
8
9
# 处理大文件时使用缓冲
cat largefile.txt | buffer | tee backup.txt | processing_command

# 使用 pigz 等多线程工具加速压缩
cat bigfile.txt | tee original.txt | pigz > compressed.gz

# 避免不必要的tee操作
# 不好: cat file | tee output.txt | grep pattern
# 好: grep pattern file | tee matches.txt

🧩 六、速查表

⚡ 快速参考

需求 命令 示例
查看文件 cat file cat config.txt
显示行号 cat -n file cat -n script.sh
创建文件 cat > file cat > note.txt
追加内容 cat >> file cat >> log.txt
合并文件 cat f1 f2 > f3 cat part1 part2 > whole
屏幕+文件输出 `cmd tee file`
追加输出 `cmd tee -a file`
多文件输出 `cmd tee f1 f2`
sudo 写入 `cmd sudo tee file`

🎯 场景化模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 1. 快速文档创建
cat > README.md << 'EOF'
# 项目标题
项目描述...
EOF

# 2. 实时监控日志
tail -f /var/log/app.log | tee monitor.log

# 3. 安装软件记录
sudo apt install package | tee install.log

# 4. 配置备份修改
cat config | tee backup | sed 's/old/new/' | sudo tee config

# 5. 多级处理流水线
cat data | tee raw | filter | tee cleaned | transform | tee final

🔧 七、高级用法

🎨 彩色输出处理

1
2
3
4
5
6
7
8
# 保持颜色输出同时保存到文件
grep --color=always "pattern" file.txt | tee output.txt

# 使用ansi2txt转换颜色代码
cat colored_output.txt | ansi2txt > clean_output.txt

# 带颜色的日志监控
tail -f app.log | awk '/ERROR/ {print "\033[31m" $0 "\033[0m"} /WARN/ {print "\033[33m" $0 "\033[0m"}' | tee -a colored_log.txt

🔄 实时数据流处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 实时网络监控
tcpdump -i eth0 -w - | tee raw.pcap | tshark -i - | tee parsed.txt | grep "HTTP"

# 实时系统性能监控
vmstat 1 | tee system_stats.log | awk '$1 ~ /[0-9]+/ {print "CPU idle:", $15"%"}'

# 实时日志分析管道
tail -f /var/log/application.log | \
  tee raw_logs.log | \
  grep "ERROR\|WARN" | \
  tee errors.log | \
  awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' | \
  tee timestamped_errors.log

📊 数据转换与编码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 编码转换流水线
cat file.txt | tee original_utf8.txt | iconv -f UTF-8 -t ASCII > ascii.txt

# 压缩归档处理
tar czf - directory/ | tee backup.tar.gz | md5sum > backup.md5

# 加密解密流水线
cat sensitive.txt | gpg --encrypt | tee encrypted.gpg | base64 > encrypted.b64

# 数据格式转换
cat data.csv | tee original.csv | csv2json | tee data.json | jq . > formatted.json

🤖 自动化脚本集成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# 自动备份脚本 with tee logging

set -euo pipefail

LOG_FILE="/var/log/backup_$(date +%Y%m%d).log"

{
    echo "=== 备份开始: $(date) ==="
    
    # 备份数据库
    echo "备份 MySQL 数据库..."
    mysqldump -u root --all-databases | tee >(gzip > db_backup.sql.gz) | wc -l
    
    # 备份文件系统
    echo "备份重要文件..."
    tar czf - /etc /home | tee >(sha256sum > backup.sha256) | split -b 1G - backup_part_
    
    echo "=== 备份完成: $(date) ==="
    echo "备份大小: $(du -h db_backup.sql.gz)"
} | tee -a "$LOG_FILE"

# 发送日志邮件
mail -s "备份完成报告" admin@example.com < "$LOG_FILE"

🐧 系统管理高级技巧

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 1. 安全系统配置更新
cat /etc/ssh/sshd_config | \
  tee sshd_config.backup | \
  sed 's/#PermitRootLogin yes/PermitRootLogin no/' | \
  sudo tee /etc/ssh/sshd_config

# 2. 批量服务器配置分发
for server in web{1..5}; do
    ssh "$server" "cat > /tmp/config <<'EOF'
$(cat local_config.txt)
EOF" | tee "deploy_$server.log"
done

# 3. 系统审计日志记录
{
    echo "系统审计报告 - $(date)"
    echo "用户登录记录:"
    last
    echo "当前进程:"
    ps aux
    echo "网络连接:"
    netstat -tulpn
} | tee "/var/log/audit/audit_$(hostname)_$(date +%Y%m%d).log"

# 4. 实时性能监控看板
watch -n 1 '
echo "=== 实时系统监控 ==="
echo "CPU使用: $(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")% idle"
echo "内存使用: $(free -h | grep Mem | awk "{print \$3}/\$2}")"
echo "磁盘使用: $(df -h / | awk "NR==2 {print \$5}")"
' | tee -a /var/log/system_monitor.log

🎯 总结

cat 是文本处理的瑞士军刀,tee 是输出分流的多面手。掌握这两个命令,就能高效处理大多数文本操作任务!

✅ 最佳实践清单

  1. ✅ 总是备份重要文件 - 使用 cat file | tee backup 模式
  2. ✅ 使用追加模式防覆盖 - 记得 tee -a>>
  3. ✅ 处理权限问题 - sudo tee 是你的好朋友
  4. ✅ 记录操作日志 - 重要操作都用 tee 记录
  5. ✅ 测试命令效果 - 先用 cat 预览再操作
  6. ✅ 使用 heredoc - 复杂内容用 <<'EOF' 语法
  7. ✅ 管道组合 - 多个命令用管道连接
  8. ✅ 错误处理 - 检查命令返回值 $?
  9. ✅ 资源监控 - 大文件处理注意内存使用
  10. ✅ 安全第一 - 重要操作前确认再确认

🔧 故障排查指南

  1. 文件无法读取 → 检查权限 ls -l file
  2. 输出乱码 → 检查文件编码 file -i filename
  3. 权限不足 → 使用 sudo tee 提升权限
  4. 磁盘空间不足 → 检查 df -h
  5. 命令不存在 → 检查 which catwhich tee
  6. 管道中断 → 使用 tee -i 忽略中断信号
  7. 特殊字符问题 → 使用 <<'EOF' 避免扩展

通过掌握 cattee 命令的各种用法和技巧,你将能够在 Linux 命令行环境中高效地处理文本数据,实现复杂的文本处理工作流。🐧✨

最后更新于 2025-09-28