天天手动处理重复任务头都大了?日志文件一堆堆,筛选数据要花半天?有个做运维的朋友跟我吐槽,每天光是批量改配置文件、统计访问日志就得占俩小时,下班都得拖半小时。其实啊,这些活儿完全可以用 Perl 脚本来自动化处理,写好一个脚本,点一下运行,喝杯茶的功夫就搞定了。今天兔子哥就带大家做三个超实用的自动化案例,每个案例都附完整代码,还有新手常踩的坑和学员反馈的优化技巧,看完你也能写出解放双手的脚本。
案例一:日志分析自动化 ——5 分钟统计访问 IP 次数,比 Excel 快 10 倍
日志分析是运维、运营常做的事,手动统计太费时间,用 Perl 脚本几行代码就能搞定。
需求场景:有个 Nginx 访问日志 access.log,格式是 “IP 时间 访问页面 状态码”,需要统计每个 IP 的访问次数,找出访问最频繁的前 3 个 IP。
实现步骤和代码:
perl
#!/usr/bin/perluse strict;use warnings;# 打开日志文件,记得处理错误open my $log_fh, "<", "access.log" or die "打不开日志文件:$!";my %ip_count; # 用哈希存IP和访问次数while (my $line = <$log_fh>) { # 逐行读取日志chomp $line; # 去掉换行符,避免干扰# 用正则提取IP(假设IP在每行开头)if ($line =~ /^(\d+\.\d+\.\d+\.\d+)/) {my $ip = $1;$ip_count{$ip}++; # 每匹配到一次IP,次数加1}}close $log_fh;# 按访问次数从高到低排序my @sorted_ips = sort { $ip_count{$b} <=> $ip_count{$a} } keys %ip_count;# 打印结果print "IP访问次数统计(前3名):\n";my $count = 0;foreach my $ip (@sorted_ips) {$count++;last if $count > 3; # 只打印前3个print "$ip:$ip_count{$ip}次\n";}学员实战反馈:有个学员用这个脚本处理每天的访问日志,之前手动用 Excel 筛选排序得 20 分钟,现在脚本运行 10 秒就出结果,他说 “每天能多喝两杯摸鱼茶了”。
避坑指南:日志格式不同的话,正则表达式要改。比如有的日志 IP 后面有空格或其他符号,正则里的
^(\d+\.\d+\.\d+\.\d+)要根据实际格式调整,不然会提取不到 IP。案例二:文件批量重命名 —— 给 1000 张图片按规则改名,再也不用手动改
处理照片、文档时,经常需要批量重命名,比如把 “IMG_001.jpg” 改成 “旅行_202405_001.jpg”,手动改到崩溃,脚本一键搞定。
需求场景:有个文件夹里全是图片,文件名乱七八糟,需要统一改成 “产品_序号.jpg”,序号从 001 开始。
实现步骤和代码:
perl
#!/usr/bin/perluse strict;use warnings;use File::Basename; # 处理文件名的模块use File::Copy; # 用于文件改名my $dir = "./photos"; # 图片所在文件夹my @files = glob("$dir/*.jpg"); # 获取所有jpg文件my $index = 1; # 序号从1开始foreach my $old_file (@files) {# 生成新文件名,用sprintf补零,确保序号是3位my $new_name = sprintf("产品_%03d.jpg", $index);my $new_file = "$dir/$new_name"; # 新文件完整路径# 改名操作if (move($old_file, $new_file)) {print "已改名:$old_file -> $new_file\n";} else {print "改名失败:$old_file,原因:$!\n";}$index++;}print "批量改名完成!共处理 ".($index-1)."个文件\n";实用技巧:有学员分享,改之前最好先备份文件,或者在脚本里加个测试模式,先打印要改的文件名,确认没问题再实际执行 move 操作。比如把 move 那行注释掉,换成 print " 准备改名:$old_file -> $new_file\n",测试无误再放开。
常见问题:如果文件夹里有非 jpg 文件,glob ("dir/*"),但要注意排除脚本本身和文件夹。
案例三:数据格式转换 —— 把 CSV 文件转成 Markdown 表格,写报告不用手动排版
做数据分析时,经常需要把 CSV 数据转成 Markdown 表格贴到报告里,手动对齐列太麻烦,脚本几秒钟搞定。
需求场景:有个用户数据 CSV 文件,格式是 “姓名,年龄,城市”,需要转成带表头的 Markdown 表格,方便插入文档。
实现步骤和代码:
perl
#!/usr/bin/perluse strict;use warnings;# 打开CSV文件和输出文件open my $csv_fh, "<", "users.csv" or die "打不开CSV:$!";open my $md_fh, ">", "users.md" or die "创建MD文件失败:$!";my $first_line = <$csv_fh>; # 读取表头行chomp $first_line;my @headers = split /,/, $first_line; # 拆分表头# 打印Markdown表头print $md_fh "| ".join(" | ", @headers)." |\n";# 打印分隔线(表头下面的横线)print $md_fh "| ".join(" | ", map { "-" x length($_) } @headers)." |\n";# 处理数据行while (my $line = <$csv_fh>) {chomp $line;my @data = split /,/, $line;print $md_fh "| ".join(" | ", @data)." |\n"; # 打印数据行}close $csv_fh;close $md_fh;print "CSV转Markdown完成,文件保存为users.md\n";效果展示:转换后的 Markdown 表格直接复制到文档里就能用,列会自动对齐。有个做运营的学员说,之前做周报转表格要花 15 分钟对齐,现在用脚本转完直接复制,周报效率都提高了。
优化建议:如果 CSV 里有逗号分隔的数据(比如 “姓名,张三,年龄,20”),简单的 split 会出错,这时候可以用 Text::CSV 模块处理,不过新手先掌握基础版,遇到复杂 CSV 再深入学模块。
写自动化脚本的 3 个实用技巧(学员总结)
- 先手动走一遍流程,再写脚本:有学员上来就写代码,结果漏了步骤,建议先手动做一次,把每个步骤记下来,再翻译成脚本命令。比如批量改名,先想清楚 “找到所有文件→确定新文件名→执行改名”,对应到脚本就是 glob→生成新名→move。
- 多用 print 调试:脚本没按预期运行时,在关键步骤加 print,输出变量值看看对不对。比如日志分析时,print "提取到的 IP:$ip\n",确认 IP 提取正确。
- 保存常用脚本模板:把日志分析、文件处理的脚本存成模板,下次改改路径、正则就能用,不用每次从头写。有学员建了个 “脚本模板库”,里面分门别类存着各种常用脚本,工作效率超高。
兔子哥觉得,Perl 脚本的魅力就在于 “短小精悍解决实际问题”,不用学多高深的语法,把这几个案例吃透,就能解决工作中大部分重复劳动。之前有个零基础学员,跟着练完这三个案例,一周内就写出了处理公司日报数据的脚本,被领导夸效率高。
其实自动化脚本不用追求完美,能解决自己的问题就行。刚开始写的脚本可能粗糙,但用着用着就会发现可以优化的地方,比如加错误处理、加参数配置。动手试试吧,当你发现以前两小时的活儿,脚本一分钟搞定,那种成就感真的会上瘾!
标签: access.log 自动化
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~