Linux 文本处理工具详解:序列生成与数据处理

目录

一、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.0

1.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 cherry

3.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.txt

4.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 : C

6.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:5500

7.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  
# ---
# A

9.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 -l

11.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'
# 输出:1234567890

12.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