【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

bash 复制代码
#!/bin/bash
#备份文件管理脚本

#当前日期
current_date=$(date +%s)

#分析备份文件
echo "备份文件统计:"
awk '{
    #提取文件大小和日期
    size=$5;
    date_str=$6" "$7" "$8" "
    filename=$9

    #累计总大小
    total_size+=size
    file_count++

    #按日期分类
    dates[date_str]++

    # 按大小分类
    if (size>100000000){
        large_file++
    }else if (size>50000000){
        medium_file++
    }else {
        small_files++
    }

}END{
    print "  总文件数: " file_count
    print "  总大小: " int(total_size/1024/1024) " MB"
    print "  大文件 (>100MB): " large_files
    print "  中等文件 (50-100MB): " medium_files
    print "  小文件 (<50MB): " small_files
    
    print "\n按日期统计:"
    for (date in dates) {
        print "  " date ": " dates[date] " 个文件"
    }
}' backup_files.txt

#识别过期备份(假设保留三十天)
echo -e "\n===过期备份识别==="
awk -v current_date=$(date +%s)'{
    #提取文件日期
    mount=$6
    day=$7
    time=$8
    #简化日期处理(实际应用中需要更精确的日期计算)
    filename=$9
    if(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 "  ⚠️  备份文件占用空间较大,建议定期清理"
fi

echo "  💡 建议的备份保留策略:"
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

bash 复制代码
#!/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_usage
    count++

    #找出峰值
    if (cpu_usage>max_cpu){
         max_usage=cpu_usage
         max_time=$1
    }

    #找出最低值
    if(NR==1||cpu_usage<min_cpu){
        min_cpu=cpu_usage
        min_time =$1
    }

    #按时间段分类
    hour=substr($1,12,2)
    hourly_cpu[hour]+=cpu_usage
    hourly_count[hour]++
}
END{
    avg_cpu=total_cpu/count
    print"平均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_usage
    count ++

    #找出峰值
    if(mem_usage>max_mem){
        mem_mem=max_usage
        max_time=$1
    }

}END{
    avg_mem=total_mem/count
    print"平均内存使用率:"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=0
        for(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)));then
    echo "  🔧 CPU使用率偏高,建议:"
    echo "    - 检查高CPU消耗进程"
    echo "    - 考虑增加CPU资源"
    echo "    - 优化应用程序性能"
fi

if(($(echo "$mem_avg>80" | bc -l)));then
    echo "  🔧 内存使用率偏高,建议:"
    echo "    - 检查内存泄漏"
    echo "    - 增加物理内存"
    echo "    - 优化应用内存使用"
fi

echo "  📊 建议定期监控系统性能指标"
echo "  📊 建立性能基线,便于异常检测"
echo "  📊 制定容量规划策略"
相关推荐
咬_咬4 小时前
C++仿muduo库高并发服务器项目:Channel模块
linux·c++·channel·1024程序员节·muduo·高并发服务器
csdn_aspnet4 小时前
如何在 Ubuntu 24.04/22.04/20.04 上安装 MySQL 8.0
linux·mysql·ubuntu
Yyyy4824 小时前
Ubuntu22.04LTS基于cephadm快速部署Ceph Reef(18.2.X)集群
linux·服务器·ceph
北城笑笑4 小时前
Server 15 ,VMware ESXi 实战指南:Ubuntu 20.04.6 版本虚拟机静态 IP 配置、分辨率固定及远程访问实践
linux·运维·ubuntu·1024程序员节
or77iu_N5 小时前
Linux 查找文件
linux·运维·服务器
tan180°5 小时前
Linux网络UDP(10)
linux·网络·后端·udp·1024程序员节
<但凡.6 小时前
Linux修炼:基础IO(二)
linux·运维·服务器·1024程序员节
黑翼杰克斯6 小时前
关于buildroot文件系统中rootfs的内容,该怎么增删(瑞芯微rv1126b)
linux·音视频·1024程序员节
洛克大航海6 小时前
Ubuntu部署集群环境(3台)
linux·ubuntu·集群搭建