【shell】每日shell练习:系统备份文件管理/系统性能趋势分析
题目9:系统备份文件管理
描述:管理备份文件,自动清理过期备份并生成备份报告。
测试数据(保存为 backup_files.txt):
-rw-r--r-- 1 root root 104857600 Dec 1 10:30 database_backup_20231201_1030.sql.gz
-rw-r--r-- 1 root root 103809024 Nov 30 10:25 database_backup_20231130_1025.sql.gz
-rw-r--r-- 1 root root 102760448 Nov 29 10:20 database_backup_20231129_1020.sql.gz
-rw-r--r-- 1 root root 101711872 Nov 28 10:15 database_backup_20231128_1015.sql.gz
-rw-r--r-- 1 root root 100663296 Nov 27 10:10 database_backup_20231127_1010.sql.gz
-rw-r--r-- 1 root root 99614720 Nov 26 10:05 database_backup_20231126_1005.sql.gz
-rw-r--r-- 1 root root 98566144 Nov 25 10:00 database_backup_20231125_1000.sql.gz
-rw-r--r-- 1 root root 97517568 Nov 24 09:55 database_backup_20231124_0955.sql.gz
-rw-r--r-- 1 root root 96468992 Nov 23 09:50 database_backup_20231123_0950.sql.gz
-rw-r--r-- 1 root root 95420416 Nov 22 09:45 database_backup_20231122_0945.sql.gz
-rw-r--r-- 1 root root 94371840 Nov 21 09:40 database_backup_20231121_0940.sql.gz
-rw-r--r-- 1 root root 93323264 Nov 20 09:35 database_backup_20231120_0935.sql.gz
-rw-r--r-- 1 root root 92274688 Nov 19 09:30 database_backup_20231119_0930.sql.gz
-rw-r--r-- 1 root root 91226112 Nov 18 09:25 database_backup_20231118_0925.sql.gz
-rw-r--r-- 1 root root 90177536 Nov 17 09:20 database_backup_20231117_0920.sql.gz
-rw-r--r-- 1 root root 89128960 Nov 16 09:15 database_backup_20231116_0915.sql.gz
-rw-r--r-- 1 root root 88080384 Nov 15 09:10 database_backup_20231115_0910.sql.gz
-rw-r--r-- 1 root root 87031808 Nov 14 09:05 database_backup_20231114_0905.sql.gz
-rw-r--r-- 1 root root 85983232 Nov 13 09:00 database_backup_20231113_0900.sql.gz
-rw-r--r-- 1 root root 84934656 Nov 12 08:55 database_backup_20231112_0855.sql.gz
-rw-r--r-- 1 root root 83886080 Nov 11 08:50 database_backup_20231111_0850.sql.gz
-rw-r--r-- 1 root root 82837504 Nov 10 08:45 database_backup_20231110_0845.sql.gz
-rw-r--r-- 1 root root 81788928 Nov 9 08:40 database_backup_20231109_0840.sql.gz
-rw-r--r-- 1 root root 80740352 Nov 8 08:35 database_backup_20231108_0835.sql.gz
-rw-r--r-- 1 root root 79691776 Nov 7 08:30 database_backup_20231107_0830.sql.gz
-rw-r--r-- 1 root root 78643200 Nov 6 08:25 database_backup_20231106_0825.sql.gz
-rw-r--r-- 1 root root 77594624 Nov 5 08:20 database_backup_20231105_0820.sql.gz
-rw-r--r-- 1 root root 76546048 Nov 4 08:15 database_backup_20231104_0815.sql.gz
-rw-r--r-- 1 root root 75497472 Nov 3 08:10 database_backup_20231103_0810.sql.gz
-rw-r--r-- 1 root root 74448896 Nov 2 08:05 database_backup_20231102_0805.sql.gz
#!/bin/bash
#备份文件管理脚本#当前日期
current_date=$(date +%s)#分析备份文件
echo "备份文件统计:"
awk '{#提取文件大小和日期size=$5;date_str=$6" "$7" "$8" "filename=$9#累计总大小total_size+=sizefile_count++#按日期分类dates[date_str]++# 按大小分类if (size>100000000){large_file++}else if (size>50000000){medium_file++}else {small_files++}}END{print " 总文件数: " file_countprint " 总大小: " int(total_size/1024/1024) " MB"print " 大文件 (>100MB): " large_filesprint " 中等文件 (50-100MB): " medium_filesprint " 小文件 (<50MB): " small_filesprint "\n按日期统计:"for (date in dates) {print " " date ": " dates[date] " 个文件"}
}' backup_files.txt#识别过期备份(假设保留三十天)
echo -e "\n===过期备份识别==="
awk -v current_date=$(date +%s)'{#提取文件日期mount=$6day=$7time=$8#简化日期处理(实际应用中需要更精确的日期计算)filename=$9if(NR>10){#模拟过期文件print" ⚠️ 过期备份: " filename " (建议清理)"expired_size+=$5}
}END{if (expired_count > 0) {print "\n 过期文件统计:"print " 数量: " expired_count " 个"print " 大小: " int(expired_size/1024/1024) " MB"print " 可释放空间: " int(expired_size/1024/1024) " MB"} else {print" ✅ 没有发现过期备份"}
}' backup_files.txt#备份的策略
echo -e "\n===备份策略建议==="
total_files=$(wc -l < backup_files.txt)
total_size_mb=$(awk '{sum += $5} END{print int(sum/1024/1024)}' backup_files.txt)echo " 📊 当前备份情况:"
echo " 文件数量: $total_files 个"
echo " 总大小: $total_size_mb MB"if [[ $total_size_mb -gt 5000 ]]; then echo " ⚠️ 备份文件占用空间较大,建议定期清理"
fiecho " 💡 建议的备份保留策略:"
echo " - 每日备份: 保留7天"
echo " - 每周备份: 保留4周"
echo " - 每月备份: 保留12个月"
echo " - 年度备份: 永久保留"
题目10:系统性能趋势分析
描述:分析系统监控数据,识别性能趋势并预测潜在问题。
测试数据(保存为 system_metrics.txt):
2023-12-01 00:00:00|CPU:25.3%|MEM:68.1%|DISK:/=25%,/home=88%|NET:rx=1.2MB,tx=0.8MB
2023-12-01 01:00:00|CPU:18.7%|MEM:65.2%|DISK:/=25%,/home=88%|NET:rx=0.9MB,tx=0.6MB
2023-12-01 02:00:00|CPU:12.4%|MEM:62.8%|DISK:/=25%,/home=88%|NET:rx=0.7MB,tx=0.5MB
2023-12-01 03:00:00|CPU:8.9%|MEM:60.1%|DISK:/=25%,/home=88%|NET:rx=0.5MB,tx=0.3MB
2023-12-01 04:00:00|CPU:5.6%|MEM:58.3%|DISK:/=25%,/home=88%|NET:rx=0.3MB,tx=0.2MB
2023-12-01 05:00:00|CPU:12.8%|MEM:59.7%|DISK:/=25%,/home=88%|NET:rx=0.6MB,tx=0.4MB
2023-12-01 06:00:00|CPU:28.4%|MEM:63.2%|DISK:/=25%,/home=88%|NET:rx=1.5MB,tx=1.1MB
2023-12-01 07:00:00|CPU:42.6%|MEM:67.8%|DISK:/=25%,/home=88%|NET:rx=2.8MB,tx=2.1MB
2023-12-01 08:00:00|CPU:56.7%|MEM:72.3%|DISK:/=25%,/home=88%|NET:rx=4.2MB,tx=3.5MB
2023-12-01 09:00:00|CPU:68.9%|MEM:76.5%|DISK:/=25%,/home=88%|NET:rx=5.1MB,tx=4.2MB
2023-12-01 10:00:00|CPU:75.2%|MEM:79.8%|DISK:/=25%,/home=88%|NET:rx=5.8MB,tx=4.8MB
2023-12-01 11:00:00|CPU:82.4%|MEM:83.1%|DISK:/=25%,/home=88%|NET:rx=6.2MB,tx=5.1MB
2023-12-01 12:00:00|CPU:88.7%|MEM:85.6%|DISK:/=25%,/home=88%|NET:rx=6.5MB,tx=5.3MB
2023-12-01 13:00:00|CPU:92.3%|MEM:87.2%|DISK:/=25%,/home=88%|NET:rx=6.7MB,tx=5.4MB
2023-12-01 14:00:00|CPU:89.6%|MEM:86.8%|DISK:/=25%,/home=88%|NET:rx=6.3MB,tx=5.1MB
2023-12-01 15:00:00|CPU:85.2%|MEM:85.1%|DISK:/=25%,/home=88%|NET:rx=5.9MB,tx=4.7MB
2023-12-01 16:00:00|CPU:78.9%|MEM:82.7%|DISK:/=25%,/home=88%|NET:rx=5.2MB,tx=4.1MB
2023-12-01 17:00:00|CPU:71.3%|MEM:80.2%|DISK:/=25%,/home=88%|NET:rx=4.6MB,tx=3.6MB
2023-12-01 18:00:00|CPU:62.7%|MEM:77.5%|DISK:/=25%,/home=88%|NET:rx=3.8MB,tx=2.9MB
2023-12-01 19:00:00|CPU:53.4%|MEM:74.1%|DISK:/=25%,/home=88%|NET:rx=3.1MB,tx=2.3MB
2023-12-01 20:00:00|CPU:41.8%|MEM:70.6%|DISK:/=25%,/home=88%|NET:rx=2.4MB,tx=1.7MB
2023-12-01 21:00:00|CPU:32.6%|MEM:67.2%|DISK:/=25%,/home=88%|NET:rx=1.8MB,tx=1.2MB
2023-12-01 22:00:00|CPU:24.1%|MEM:64.8%|DISK:/=25%,/home=88%|NET:rx=1.3MB,tx=0.9MB
2023-12-01 23:00:00|CPU:16.8%|MEM:62.3%|DISK:/=25%,/home=88%|NET:rx=0.9MB,tx=0.6MB
#!/bin/bash
#系统性能趋势分析echo "===系统性能趋势分析报告==="
#分析CPU使用趋势
echo "=== CPU使用率分析 ==="
awk -F'|' '{#提取CPU使用率split($2,cpu_parts,":")cpu_usage=substr(cpu_part[2],1,length(cpu_parts[2]-1))#统计total_cpu+=cpu_usagecount++#找出峰值if (cpu_usage>max_cpu){max_usage=cpu_usagemax_time=$1}#找出最低值if(NR==1||cpu_usage<min_cpu){min_cpu=cpu_usagemin_time =$1}#按时间段分类hour=substr($1,12,2)hourly_cpu[hour]+=cpu_usagehourly_count[hour]++
}
END{avg_cpu=total_cpu/countprint"平均cpu使用率:"sprint("%%.1f%",avg_cpu)print"最高cpu使用率:"max_cpu"% (时间:"max_time")"print"最低cpu使用率:"min_cpu"% (时间:"min_time")"#识别高峰时段print"\n各小时平均cpu使用率:"for(h in hourly){avg=hourly_cpu[h]/hour_count[h]if(avg>70){level=""} else if (avg>50){level=""}else{level=""}printf" %02d:00 - %02d:59: %.1f%% %s\n",h,h,avg,level}
}' system_metrics.txt#分析内存使用趋势
echo -e "\n===内存使用率分析==="
awk -F'|' '{#提取内存使用率split($3,mem_parts,":")mem_usage=substr(mem_parts[2],1,length(mem_parts[2])-1)#统计total_mem+=mem_usagecount ++#找出峰值if(mem_usage>max_mem){mem_mem=max_usagemax_time=$1}}END{avg_mem=total_mem/countprint"平均内存使用率:"sprintf(%.1f%%,avg_mem)print"最大内存使用率:"max_mem"%(时间:"max_time")"if(avg_mem>80){print "⚠️ 内存使用率偏高,建议检查内存泄漏"}else if (avg_mem>60){print "ℹ️ 内存使用率正常"}else{print "✅ 内存使用率较低,系统资源充足"}
}' system_metrics.txt#分析磁盘使用情况
echo -e "\n===磁盘使用情况==="
awk -F'|' '{#提取磁盘使用率disk_info=$4#简化处理,实际应用中需要解析具体的挂载点和使用率if (index(disk_info,"home=88")>0){high_disk_usage++}
}END{if(high_disk_usage>0){print "⚠️ /home 分区使用率较高 (88%),建议清理空间"}else {print "✅ 磁盘空间使用正常"}
}' systemc_metrics.txt#性能趋势预测
echo -e "\n===性能趋势预测==="
awk -F'|' ' NR>=20 {#分析最近四小时的cpu趋势split($,cpu_parts,":")cpu_usage=substr(cpu_parts[2],1,length(cpu_parts[2])-1)recent_cpu[NR]=cpu_usage
}END{#简单的线性趋势分析if(length(recent_cpu)>=4){sum=0for(i in recent_cpu){sum+=recent_cpu[i]}avg_recent=sum/length(recent_cpu)#如果最近平均值高于整体平均值,说明负载在上升overall_avg=50 #假设的整体平均值if(avg_recent>overall_avg+10){print "📈 负载呈上升趋势,建议关注系统性能"}else if (avg_recent<overall_avg-10){print "📉 负载呈下降趋势,系统趋于稳定"} else {print "➡️ 负载保持稳定"}}
}' system_metrics.txt#优化建议
echo -e "\n===系统优化建议==="
#综合分析各项指标给出建议
cpu_avg=$(awk -F'|' '{split($2,p,":");sum+=substr(p[2],1,length(p[2])-1)}END{print sum/NR}' system_metrics.txt)
mem_avg=$(awk -F'|' '{split($2,p,":");sum+=substr(p[2],1,length(p[2])-1)}END{print sum/NR}' system_metrics.txt)if(($(echo "$cpu_avg>70"|bc -l)));thenecho " 🔧 CPU使用率偏高,建议:"echo " - 检查高CPU消耗进程"echo " - 考虑增加CPU资源"echo " - 优化应用程序性能"
fiif(($(echo "$mem_avg>80" | bc -l)));thenecho " 🔧 内存使用率偏高,建议:"echo " - 检查内存泄漏"echo " - 增加物理内存"echo " - 优化应用内存使用"
fiecho " 📊 建议定期监控系统性能指标"
echo " 📊 建立性能基线,便于异常检测"
echo " 📊 制定容量规划策略"
