Linux 文本处理 cat 与 tee 命令详解 📜 掌握「看内容」「写文件」「分流输出」三大核心技
Linux 文本处理 cat 与 tee 命令详解 📜
掌握「看内容」「写文件」「分流输出」三大核心技能,提升命令行工作效率
📖 目录导航
✨ 命令特点
- 📖 简洁高效: 两个命令解决大多数文本处理需求
- 🔄 灵活组合: 可与管道符和其他命令完美配合
- 💾 双向操作: 既支持读取也支持写入文件
- 🎯 精准控制: 支持追加、覆盖等多种写入模式
- 🛡️ 安全可靠: 提供防止误操作的保护机制
🎯 一、命令定位
命令 |
核心能力 |
类比说明 |
适用场景 |
cat |
读取、拼接、创建文件 |
文本胶水 |
查看内容、合并文件、创建文档 |
tee |
分流输出,同时显示和保存 |
三通水管 |
日志记录、调试输出、权限提升写入 |
📊 功能对比矩阵
功能 |
cat |
tee |
说明 |
读取文件 |
✅ |
❌ |
cat 主要用于读取 |
写入文件 |
✅ |
✅ |
两者都支持写入 |
屏幕输出 |
✅ |
✅ |
都可输出到终端 |
管道处理 |
✅ |
✅ |
都支持管道操作 |
多文件操作 |
✅ |
✅ |
都支持多个文件 |
输出分流 |
❌ |
✅ |
tee 的独特功能 |
🔍 二、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 命令详解
📝 基本语法
🎯 常用选项
选项 |
说明 |
示例 |
-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
是输出分流的多面手。掌握这两个命令,就能高效处理大多数文本操作任务!
✅ 最佳实践清单
- ✅ 总是备份重要文件 - 使用
cat file | tee backup
模式
- ✅ 使用追加模式防覆盖 - 记得
tee -a
和 >>
- ✅ 处理权限问题 -
sudo tee
是你的好朋友
- ✅ 记录操作日志 - 重要操作都用
tee
记录
- ✅ 测试命令效果 - 先用
cat
预览再操作
- ✅ 使用 heredoc - 复杂内容用
<<'EOF'
语法
- ✅ 管道组合 - 多个命令用管道连接
- ✅ 错误处理 - 检查命令返回值
$?
- ✅ 资源监控 - 大文件处理注意内存使用
- ✅ 安全第一 - 重要操作前确认再确认
🔧 故障排查指南
- 文件无法读取 → 检查权限
ls -l file
- 输出乱码 → 检查文件编码
file -i filename
- 权限不足 → 使用
sudo tee
提升权限
- 磁盘空间不足 → 检查
df -h
- 命令不存在 → 检查
which cat
和 which tee
- 管道中断 → 使用
tee -i
忽略中断信号
- 特殊字符问题 → 使用
<<'EOF'
避免扩展
通过掌握 cat
和 tee
命令的各种用法和技巧,你将能够在 Linux 命令行环境中高效地处理文本数据,实现复杂的文本处理工作流。🐧✨