Linux 文本处理工具详解:序列生成与数据处理
目录
- Linux 文本处理工具详解:序列生成与数据处理
- 目录
- 一、seq 命令 - 数字序列生成器
- 1.1 seq 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 1.2 seq 高级应用
- 生成测试数据
- 与循环结合使用
- 二、wc 命令 - 文本统计工具
- 2.1 wc 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 2.2 wc 高级应用
- 代码统计工具
- 系统监控脚本
- 三、sort 命令 - 排序工具
- 3.1 sort 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 3.2 sort 高级应用
- 多字段排序
- 系统资源排序
- 四、uniq 命令 - 去重工具
- 4.1 uniq 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 4.2 uniq 高级应用
- 日志分析去重
- 数据清洗脚本
- 五、shuf 命令 - 随机排序工具
- 5.1 shuf 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 5.2 shuf 高级应用
- 随机抽样系统
- 随机测试数据生成
- 六、paste 命令 - 合并列工具
- 6.1 paste 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 6.2 paste 高级应用
- 数据报表生成
- 系统信息合并
- 七、cut 命令 - 列提取工具
- 7.1 cut 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 7.2 cut 高级应用
- 日志分析
- 数据提取脚本
- 八、rev 命令 - 反转行工具
- 8.1 rev 命令基础
- 功能说明
- 基本语法
- 实战示例
- 8.2 rev 高级应用
- 数据处理技巧
- 九、tac 命令 - 反向cat
- 9.1 tac 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 9.2 tac 高级应用
- 日志分析(查看最新记录)
- 数据处理脚本
- 十、xargs 命令 - 参数传递大师
- 10.1 xargs 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 10.2 xargs 高级应用
- 批量文件操作
- 系统管理脚本
- 十一、tee 命令 - 分流输出
- 11.1 tee 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 11.2 tee 高级应用
- 实时监控和记录
- 调试复杂管道
- 十二、tr 命令 - 字符转换工具
- 12.1 tr 命令基础
- 功能说明
- 基本语法
- 常用选项
- 字符集表示
- 实战示例
- 12.2 tr 高级应用
- 数据清洗
- 密码生成器
- 十三、综合实战练习
- 练习1:日志分析系统(30分钟)
- 练习2:数据清洗管道(25分钟)
- 练习3:系统监控仪表板(20分钟)
一、seq 命令 - 数字序列生成器
1.1 seq 命令基础
功能说明
生成数字序列,支持整数和浮点数
基本语法
seq [选项] 第一个数 [增量] 最后一个数常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-w |
等宽输出(前导零) | seq -w 1 10 |
-s |
指定分隔符 | seq -s " " 1 5 |
-f |
格式化输出 | seq -f "%02g" 1 5 |
实战示例
# 基础序列生成
seq 5 # 1到5
# 输出:1 2 3 4 5
seq 3 7 # 3到7
# 输出:3 4 5 6 7
seq 1 2 10 # 1到10,步长为2
# 输出:1 3 5 7 9
# 等宽输出(前导零)
seq -w 8 12 # 08到12
# 输出:08 09 10 11 12
# 自定义分隔符
seq -s " -> " 1 3 # 使用箭头分隔
# 输出:1 -> 2 -> 3
seq -s $'\n' 1 3 # 每行一个数字(默认)
# 输出:
# 1
# 2
# 3
# 格式化输出
seq -f "Number %02g" 1 3
# 输出:
# Number 01
# Number 02
# Number 03
# 浮点数序列
seq 0.5 0.1 1.0 # 0.5到1.0,步长0.1
# 输出:0.5 0.6 0.7 0.8 0.9 1.01.2 seq 高级应用
生成测试数据
# 生成100个测试用户ID
seq -f "user%03g" 1 100 > user_ids.txt
# 生成日期序列
seq -f "2023-12-%02g" 1 31 > dates.txt
# 创建测试文件
seq 1 100 | while read num; do
echo "这是第$num个测试文件的内容" > "test_file_$num.txt"
done与循环结合使用
# for循环中使用seq
for i in $(seq 1 5); do
echo "执行第$i次操作"
done
# while循环中使用seq
seq 1 10 | while read num; do
echo "处理数字: $num"
# 复杂处理逻辑
done二、wc 命令 - 文本统计工具
2.1 wc 命令基础
功能说明
统计文件的行数、单词数、字节数
基本语法
wc [选项] 文件...常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-l |
只统计行数 | wc -l file.txt |
-w |
只统计单词数 | wc -w file.txt |
-c |
只统计字节数 | wc -c file.txt |
-m |
统计字符数 | wc -m file.txt |
-L |
显示最长行的长度 | wc -L file.txt |
实战示例
# 创建测试文件
echo -e "Hello World\nThis is a test\nLinux commands" > test.txt
# 完整统计
wc test.txt
# 输出:3 7 38 test.txt
# 含义:3行 7个单词 38字节
# 分别统计
wc -l test.txt # 行数:3
wc -w test.txt # 单词数:7
wc -c test.txt # 字节数:38
wc -m test.txt # 字符数:38(ASCII相同)
# 统计多个文件
wc *.txt
# 输出:
# 3 7 38 test.txt
# 5 12 60 another.txt
# 8 19 98 total
# 统计最长行
wc -L test.txt # 最长行:13个字符
# 结合管道使用
ls -l /bin | wc -l # 统计/bin下文件数量
ps aux | wc -l # 统计进程数量2.2 wc 高级应用
代码统计工具
#!/bin/bash
# code_stats.sh - 统计代码行数
echo "=== 代码统计报告 ==="
echo "生成时间: $(date)"
echo
# 统计不同语言代码
for ext in py sh js java c html css; do
count=$(find . -name "*.$ext" -type f 2>/dev/null | wc -l)
if [ $count -gt 0 ]; then
lines=$(find . -name "*.$ext" -exec cat {} + 2>/dev/null | wc -l)
echo "$ext 文件: $count 个, 总行数: $lines"
fi
done
echo
echo "=== 总行数统计 ==="
find . -name "*.py" -o -name "*.sh" -o -name "*.js" | xargs wc -l | tail -1系统监控脚本
#!/bin/bash
# system_monitor.sh
echo "系统资源统计:"
echo "用户数量: $(who | wc -l)"
echo "运行进程: $(ps aux | wc -l)"
echo "网络连接: $(netstat -an | wc -l)"
echo "打开文件: $(lsof | wc -l)"
# 监控日志增长
log_size=$(wc -c /var/log/syslog | awk '{print $1}')
echo "系统日志大小: $log_size 字节"三、sort 命令 - 排序工具
3.1 sort 命令基础
功能说明
对文本行进行排序,支持多种排序规则
基本语法
sort [选项] 文件...常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-n |
按数值大小排序 | sort -n file.txt |
-r |
反向排序(降序) | sort -r file.txt |
-k |
指定排序字段 | sort -k2,2 file.txt |
-t |
指定字段分隔符 | sort -t: -k3 file.txt |
-u |
去重(相当于uniq) | sort -u file.txt |
-f |
忽略大小写 | sort -f file.txt |
-h |
人类可读数字排序 | sort -h file.txt |
实战示例
# 创建测试数据
echo -e "apple\nbanana\ncherry\nApple\nBanana" > fruits.txt
echo -e "10\n2\n25\n100\n5" > numbers.txt
# 基本排序(字典序)
sort fruits.txt
# 输出:Apple Banana apple banana cherry
# 数值排序
sort -n numbers.txt
# 输出:2 5 10 25 100
# 反向排序
sort -nr numbers.txt
# 输出:100 25 10 5 2
# 忽略大小写排序
sort -f fruits.txt
# 输出:apple Apple banana Banana cherry
# 去重排序
echo -e "apple\nbanana\napple\ncherry" | sort -u
# 输出:apple banana cherry3.2 sort 高级应用
多字段排序
# 创建复杂数据
echo -e "Alice 25 5000\nBob 30 6000\nCharlie 25 5500" > employees.txt
# 按年龄排序,年龄相同按薪资排序
sort -k2,2n -k3,3nr employees.txt
# 输出:
# Alice 25 5000
# Charlie 25 5500
# Bob 30 6000
# 使用分隔符排序(CSV文件)
echo -e "name,age,salary\nAlice,25,5000\nBob,30,6000" > data.csv
sort -t, -k2,2n -k3,3nr data.csv系统资源排序
# 按内存使用排序进程
ps aux --sort=-%mem | head -10
# 按CPU使用排序进程
ps aux --sort=-%cpu | head -10
# 按文件大小排序
ls -l | sort -k5,5nr
# 按修改时间排序
ls -lt | sort -k6,7四、uniq 命令 - 去重工具
4.1 uniq 命令基础
功能说明
注意:uniq只能处理相邻的重复行,通常先sort再uniq
基本语法
uniq [选项] [输入文件] [输出文件]常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-c |
统计重复次数 | uniq -c file.txt |
-d |
只显示重复行 | uniq -d file.txt |
-u |
只显示不重复行 | uniq -u file.txt |
-i |
忽略大小写 | uniq -i file.txt |
实战示例
# 创建测试数据(必须先排序!)
echo -e "apple\napple\nbanana\ncherry\napple\nbanana" > fruits.txt
sort fruits.txt | uniq
# 输出:apple banana cherry
# 统计重复次数
sort fruits.txt | uniq -c
# 输出:
# 3 apple
# 2 banana
# 1 cherry
# 只显示重复行
sort fruits.txt | uniq -d
# 输出:apple banana
# 只显示不重复行
sort fruits.txt | uniq -u
# 输出:cherry
# 结合sort去重(常用模式)
sort fruits.txt | uniq > unique_fruits.txt4.2 uniq 高级应用
日志分析去重
# 分析Apache访问日志
cut -d' ' -f1 /var/log/apache2/access.log | sort | uniq -c | sort -nr
# 分析SSH登录尝试
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr
# 查找重复文件(基于MD5)
find . -type f -exec md5sum {} \; | sort | uniq -d -w32数据清洗脚本
#!/bin/bash
# data_cleaner.sh
echo "开始数据清洗..."
# 1. 去重处理
echo "去重前行数: $(wc -l raw_data.txt)"
sort raw_data.txt | uniq > cleaned_data.txt
echo "去重后行数: $(wc -l cleaned_data.txt)"
# 2. 统计频率
echo "数据频率统计:"
sort cleaned_data.txt | uniq -c | sort -nr > frequency_report.txt
# 3. 异常值检测
echo "异常值检测(出现次数少于3次):"
awk '$1 < 3' frequency_report.txt五、shuf 命令 - 随机排序工具
5.1 shuf 命令基础
功能说明
生成随机排列(打乱顺序)
基本语法
shuf [选项] [文件]常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-e |
直接指定项目 | shuf -e A B C |
-n |
输出前N个项目 | shuf -n 5 file.txt |
-r |
允许重复(有放回抽样) | shuf -r -n 10 file.txt |
-i |
生成数字范围 | shuf -i 1-100 |
实战示例
# 打乱文件行顺序
seq 1 10 > numbers.txt
shuf numbers.txt
# 输出:随机顺序的1-10
# 直接打乱参数
shuf -e apple banana cherry date
# 输出:随机顺序的水果
# 随机选择3个项目
shuf -n 3 numbers.txt
# 输出:3个随机数字
# 有放回随机抽样
shuf -r -n 5 numbers.txt
# 输出:5个数字(可能重复)
# 生成随机数字范围
shuf -i 1-100 -n 10
# 输出:1-100中的10个随机数5.2 shuf 高级应用
随机抽样系统
# 随机选择幸运用户
cut -d: -f1 /etc/passwd | shuf -n 1
# 输出:随机选择一个系统用户
# A/B测试分组
seq 1 100 | shuf > shuffled_users.txt
head -50 shuffled_users.txt > group_a.txt
tail -50 shuffled_users.txt > group_b.txt
# 随机密码生成
shuf -n 4 -e {A..Z} | tr -d '\n'
shuf -n 4 -e {a..z} | tr -d '\n'
shuf -n 2 -e {0..9} | tr -d '\n'
shuf -n 2 -e '!@#$%^&*' | tr -d '\n'
# 组合成:Aa1!Bb2@ 格式的密码随机测试数据生成
#!/bin/bash
# random_data_generator.sh
# 生成随机姓名
first_names=("Alice" "Bob" "Charlie" "David" "Eve")
last_names=("Smith" "Johnson" "Williams" "Brown" "Jones")
generate_random_person() {
local first=${first_names[$(shuf -i 0-4 -n 1)]}
local last=${last_names[$(shuf -i 0-4 -n 1)]}
local age=$(shuf -i 20-65 -n 1)
local salary=$(shuf -i 30000-100000 -n 1)
echo "$first $last $age $salary"
}
# 生成100个随机人员记录
for i in $(seq 1 100); do
generate_random_person
done > random_people.txt六、paste 命令 - 合并列工具
6.1 paste 命令基础
功能说明
合并多个文件的列(类似数据库的JOIN)
基本语法
paste [选项] 文件1 文件2 ...常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-d |
指定分隔符 | paste -d, file1 file2 |
-s |
串行粘贴(转置) | paste -s file.txt |
实战示例
# 创建测试数据
echo -e "1\n2\n3" > col1.txt
echo -e "A\nB\nC" > col2.txt
echo -e "X\nY\nZ" > col3.txt
# 基本合并(默认TAB分隔)
paste col1.txt col2.txt col3.txt
# 输出:
# 1 A X
# 2 B Y
# 3 C Z
# 指定分隔符
paste -d, col1.txt col2.txt col3.txt
# 输出:
# 1,A,X
# 2,B,Y
# 3,C,Z
# 串行粘贴(转置)
paste -s col1.txt col2.txt col3.txt
# 输出:
# 1 2 3
# A B C
# X Y Z
# 复杂分隔符
paste -d " : " col1.txt col2.txt
# 输出:
# 1 : A
# 2 : B
# 3 : C6.2 paste 高级应用
数据报表生成
# 创建月度销售数据
echo -e "Jan\nFeb\nMar" > months.txt
echo -e "1000\n1500\n1200" > sales.txt
echo -e "800\n900\n1100" > costs.txt
# 生成报表
paste -d " | " months.txt sales.txt costs.txt
# 输出:
# Jan | 1000 | 800
# Feb | 1500 | 900
# Mar | 1200 | 1100
# 计算利润
paste months.txt sales.txt costs.txt | while read month sales costs; do
profit=$((sales - costs))
echo "$month: 利润 $profit"
done系统信息合并
# 合并系统信息
ps aux | awk '{print $1}' | sort | uniq > users.txt
ps aux | awk '{print $11}' | sort | uniq > commands.txt
# 创建用户-命令矩阵(简化版)
paste -d " - " users.txt commands.txt | head -10七、cut 命令 - 列提取工具
7.1 cut 命令基础
功能说明
从文本行中提取特定列
基本语法
cut [选项] 文件...常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-d |
指定分隔符 | cut -d: -f1 file.txt |
-f |
指定字段 | cut -f1,3 file.txt |
-c |
按字符位置切割 | cut -c1-5 file.txt |
--complement |
反选(排除指定字段) | cut -f2 --complement |
实战示例
# 创建测试数据
echo -e "Alice:25:5000\nBob:30:6000\nCharlie:25:5500" > data.txt
# 提取第一列(姓名)
cut -d: -f1 data.txt
# 输出:Alice Bob Charlie
# 提取多列(姓名和薪资)
cut -d: -f1,3 data.txt
# 输出:
# Alice:5000
# Bob:6000
# Charlie:5500
# 按字符位置提取
echo "Hello World" | cut -c1-5
# 输出:Hello
echo "Hello World" | cut -c7-
# 输出:World
# 排除某些字段
cut -d: -f2 --complement data.txt
# 输出:排除第二列(年龄)
# Alice:5000
# Bob:6000
# Charlie:55007.2 cut 高级应用
日志分析
# 分析Apache访问日志(提取IP)
cut -d' ' -f1 /var/log/apache2/access.log | sort | uniq -c | sort -nr
# 分析系统登录用户
last | cut -d' ' -f1 | sort | uniq -c
# 提取进程信息
ps aux | cut -c1-80 | head -10 # 只显示前80字符数据提取脚本
#!/bin/bash
# data_extractor.sh
echo "=== 数据提取报告 ==="
# 1. 提取用户名
echo "系统用户:"
cut -d: -f1 /etc/passwd | head -10
# 2. 提取文件扩展名
echo "文件扩展名统计:"
find . -type f -name "*.*" | cut -d. -f2 | sort | uniq -c
# 3. 提取URL域名
echo "访问域名统计:"
cut -d/ -f3 access.log | sort | uniq -c | sort -nr | head -10八、rev 命令 - 反转行工具
8.1 rev 命令基础
功能说明
反转每行字符的顺序
基本语法
rev [文件]实战示例
# 基本使用
echo "hello" | rev
# 输出:olleh
echo "Linux" | rev
# 输出:xuniL
# 反转文件内容
echo -e "abc\ndef\nghi" > test.txt
rev test.txt
# 输出:
# cba
# fed
# ihg
# 实用案例:检查回文
echo "radar" | rev
# 输出:radar(回文不变)8.2 rev 高级应用
数据处理技巧
# 反转IP地址
echo "192.168.1.1" | rev
# 输出:1.1.861.291
# 配合其他命令使用
echo "hello world" | rev | cut -d' ' -f1 | rev
# 输出:world(提取最后一个单词)
# 检查对称结构
echo "A man a plan a canal Panama" | tr -d ' ' | rev
# 可以用于回文检查九、tac 命令 - 反向cat
9.1 tac 命令基础
功能说明
反向显示文件内容(从最后一行到第一行)
基本语法
tac [选项] 文件...常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-s |
指定分隔符 | tac -s "---" file.txt |
-b |
在分隔符前插入 | tac -b -s "---" |
实战示例
# 创建测试数据
echo -e "第一行\n第二行\n第三行" > test.txt
# 正常顺序
cat test.txt
# 输出:
# 第一行
# 第二行
# 第三行
# 反向顺序
tac test.txt
# 输出:
# 第三行
# 第二行
# 第一行
# 使用分隔符
echo -e "A\n---\nB\n---\nC" > segmented.txt
tac -s "---" segmented.txt
# 输出:
# C
# ---
# B
# ---
# A9.2 tac 高级应用
日志分析(查看最新记录)
# 查看最新的日志记录
tail -100 /var/log/syslog | tac | less
# 分析倒序的访问日志
tac /var/log/apache2/access.log | head -20
# 监控实时日志(从最新开始)
tail -f /var/log/application.log | tac数据处理脚本
#!/bin/bash
# reverse_processor.sh
# 处理CSV文件(从最新数据开始)
tac data.csv | while read line; do
# 处理每一行数据(从最新到最旧)
echo "处理: $line"
done
# 生成倒序报告
echo "=== 倒序系统报告 ==="
ps aux | tac | head -10十、xargs 命令 - 参数传递大师
10.1 xargs 命令基础
功能说明
将标准输入转换为命令行参数
基本语法
命令 | xargs [选项] 目标命令常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-n |
每次传递N个参数 | `echo “1 2 3” |
-I |
指定替换字符串 | `echo “file” |
-P |
并行执行 | xargs -P4 -n1 command |
-0 |
处理包含空格的文件名 | `find -print0 |
-t |
显示执行的命令 | xargs -t echo |
实战示例
# 基本使用
echo "1 2 3" | xargs echo "数字:"
# 输出:数字: 1 2 3
# 每次传递一个参数
echo "1 2 3" | xargs -n1 echo "数字:"
# 输出:
# 数字: 1
# 数字: 2
# 数字: 3
# 使用替换字符串
echo "file.txt" | xargs -I {} cp {} {}.backup
# 执行:cp file.txt file.txt.backup
# 处理多个文件
find . -name "*.txt" | xargs -I {} echo "找到文件: {}"
# 并行处理
seq 1 10 | xargs -P4 -n1 sleep
# 同时运行4个sleep进程10.2 xargs 高级应用
批量文件操作
# 批量重命名
ls *.txt | xargs -I {} mv {} {}.old
# 批量删除
find /tmp -name "*.tmp" -mtime +7 | xargs rm -f
# 批量更改权限
find /home -name "*.sh" | xargs chmod +x
# 批量搜索内容
find . -name "*.py" | xargs grep -l "import requests"系统管理脚本
#!/bin/bash
# system_maintenance.sh
echo "=== 系统维护任务 ==="
# 1. 清理旧日志
find /var/log -name "*.log" -mtime +30 | xargs rm -f
echo "已清理30天前的日志"
# 2. 压缩大文件
find /var/log -size +100M -type f | xargs -I {} gzip {}
echo "已压缩大日志文件"
# 3. 批量杀进程
ps aux | grep zombie | awk '{print $2}' | xargs kill -9
echo "已清理僵尸进程"
# 4. 并行备份
find /important -type f | xargs -P4 -I {} cp {} /backup/
echo "并行备份完成"十一、tee 命令 - 分流输出
11.1 tee 命令基础
功能说明
从标准输入读取并写入标准输出和文件
基本语法
命令 | tee [选项] 文件...常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-a |
追加模式(不覆盖) | `echo “new” |
-i |
忽略中断信号 | tee -i file.txt |
-p |
诊断错误写入管道 | tee -p file.txt |
实战示例
# 基本使用
echo "Hello World" | tee output.txt
# 输出:Hello World(屏幕显示)
# 同时写入output.txt文件
# 多个文件
ls -l | tee file1.txt file2.txt file3.txt
# 追加模式
echo "Line 1" | tee log.txt
echo "Line 2" | tee -a log.txt
# log.txt内容:
# Line 1
# Line 2
# 管道中调试
find . -name "*.txt" | tee files.txt | wc -l
# 显示文件数量,同时保存文件列表到files.txt
# 复杂管道调试
cat data.txt | sort | tee sorted.txt | uniq | tee unique.txt | wc -l11.2 tee 高级应用
实时监控和记录
# 监控系统并记录
top -b -d 1 | tee system_monitor.log
# 网络监控
ping google.com | tee -a ping_log.txt
# 安装过程记录
apt-get install nginx | tee install.log
# 脚本执行记录
#!/bin/bash
{
echo "开始执行: $(date)"
apt-get update
apt-get install -y nginx
systemctl status nginx
echo "执行完成: $(date)"
} | tee -a /var/log/script_execution.log调试复杂管道
# 调试数据处理管道
cat raw_data.txt | tee /tmp/step1_raw.txt | \
sort | tee /tmp/step2_sorted.txt | \
uniq | tee /tmp/step3_unique.txt | \
wc -l | tee /tmp/step4_count.txt
# 检查每个步骤的结果
echo "=== 管道调试结果 ==="
wc -l /tmp/step*.txt十二、tr 命令 - 字符转换工具
12.1 tr 命令基础
功能说明
字符转换、删除和压缩
基本语法
tr [选项] 字符集1 字符集2常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-d |
删除字符 | tr -d 'abc' |
-s |
压缩重复字符 | tr -s ' ' |
-c |
使用字符集的补集 | tr -c 'a-z' ' ' |
字符集表示
| 表示法 | 说明 | 示例 |
|---|---|---|
a-z |
小写字母 | tr 'a-z' 'A-Z' |
A-Z |
大写字母 | tr 'A-Z' 'a-z' |
0-9 |
数字 | tr '0-9' 'X' |
[:alpha:] |
所有字母 | tr '[:alpha:]' 'X' |
[:digit:] |
所有数字 | tr -d '[:digit:]' |
实战示例
# 大小写转换
echo "Hello World" | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
# 输出:hello world
# 字符替换
echo "hello123" | tr '0-9' 'X'
# 输出:helloXXX
# 删除字符
echo "hello123" | tr -d '0-9'
# 输出:hello
# 压缩重复字符
echo "hello world" | tr -s ' '
# 输出:hello world
# 字符映射
echo "abc" | tr 'abc' '123'
# 输出:123
# 删除非数字字符
echo "Phone: 123-456-7890" | tr -cd '0-9'
# 输出:123456789012.2 tr 高级应用
数据清洗
# 清理文本数据
echo " Hello World 123! " | tr -s ' ' | tr -d '!'
# 输出:Hello World 123
# 提取数字
echo "Price: $123.45" | tr -cd '0-9.'
# 输出:123.45
# URL编码解码
echo "Hello World" | tr ' ' '+'
# 输出:Hello+World
echo "Hello+World" | tr '+' ' '
# 输出:Hello World密码生成器
#!/bin/bash
# password_generator.sh
# 生成随机密码
generate_password() {
# 生成12字符密码:大小写字母+数字+特殊字符
tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 12
}
echo "生成密码:"
for i in $(seq 1 5); do
echo "密码$i: $(generate_password)"
done十三、综合实战练习
练习1:日志分析系统(30分钟)
任务:分析Apache访问日志,生成统计报告
# 要求:
# 1. 统计访问量前10的IP
# 2. 统计最常访问的URL
# 3. 分析HTTP状态码分布
# 4. 生成时间段的访问统计参考答案:
#!/bin/bash
# apache_log_analyzer.sh
LOG_FILE="/var/log/apache2/access.log"
echo "=== Apache访问日志分析报告 ==="
echo "分析文件: $LOG_FILE"
echo "生成时间: $(date)"
echo
# 1. 访问量前10的IP
echo "📊 访问量前10的IP:"
cut -d' ' -f1 "$LOG_FILE" | sort | uniq -c | sort -nr | head -10
echo
# 2. 最常访问的URL
echo "🔗 最常访问的URL:"
cut -d' ' -f7 "$LOG_FILE" | sort | uniq -c | sort -nr | head -10
echo
# 3. HTTP状态码分布
echo "⚡ HTTP状态码分布:"
cut -d' ' -f9 "$LOG_FILE" | sort | uniq -c | sort -nr
echo
# 4. 时间段访问统计
echo "⏰ 时间段访问统计:"
cut -d' ' -f4 "$LOG_FILE" | cut -d: -f2 | sort | uniq -c练习2:数据清洗管道(25分钟)
任务:处理杂乱数据,生成规整报表
# 原始数据格式:
# 姓名:年龄:薪资:部门
# 要求清洗并生成统计报表参考答案:
#!/bin/bash
# data_cleaning_pipeline.sh
# 生成测试数据
cat > raw_data.txt << EOF
Alice:25:5000:IT
Bob:30:6000:Sales
Alice:25:5000:IT
Charlie:25:5500:IT
David:35:7000:HR
Eve:28:6500:Sales
Frank:40:8000:IT
EOF
echo "=== 数据清洗管道 ==="
# 1. 去重
echo "步骤1: 数据去重"
sort raw_data.txt | uniq > cleaned_data.txt
echo "去重后记录数: $(wc -l cleaned_data.txt)"
# 2. 按部门分组统计
echo
echo "步骤2: 部门统计"
cut -d: -f4 cleaned_data.txt | sort | uniq -c | while read count dept; do
echo "部门 $dept: $count 人"
done
# 3. 薪资分析
echo
echo "步骤3: 薪资分析"
cut -d: -f3 cleaned_data.txt | sort -n | \
xargs -n1 | awk '
{sum+=$1; count++}
END {
print "平均薪资: " sum/count
print "最高薪资: " max
print "最低薪资: " min
}'练习3:系统监控仪表板(20分钟)
任务:创建实时系统监控脚本
# 要求:
# 1. 显示当前用户和进程
# 2. 监控系统资源使用
# 3. 检测异常进程
# 4. 生成健康报告参考答案:
#!/bin/bash
# system_dashboard.sh
echo "🖥️ 系统监控仪表板"
echo "更新时间: $(date)"
echo "══════════════════════════════════════"
# 1. 用户和进程统计
echo "👥 用户统计:"
echo "当前用户: $(who | wc -l)"
echo "总进程数: $(ps aux | wc -l)"
echo
# 2. 资源使用Top 5
echo "📈 资源使用Top 5:"
echo "CPU使用前5:"
ps aux --sort=-%cpu | head -6 | cut -c1-80
echo
echo "内存使用前5:"
ps aux --sort=-%mem | head -6 | cut -c1-80
echo
# 3. 系统负载
echo "⚖️ 系统负载:"
uptime | cut -d: -f4- | xargs echo "负载平均值:"
echo
# 4. 磁盘使用
echo "💾 磁盘使用:"
df -h | xargs -I {} echo {} | grep -E "^/dev" | cut -d' ' -f1,5 | head -5通过本教程的深入学习,你应该能够熟练运用这些文本处理工具,构建复杂的数据处理管道,提高日常系统管理和数据分析的效率。
作者:严锋 创建时间:2025-11-01 11:37
最后编辑:严锋 更新时间:2025-11-04 14:01
最后编辑:严锋 更新时间:2025-11-04 14:01