在日常工作中,经常会遇到需要把多个日志文件、配置文件或者数据文本合并成一个文件的情况。比如运维人员要分析一整天的服务器日志,而这些日志被按小时分割成了24个文件,一个个打开查看显然不现实。这时候,用Perl写个小脚本就能快速搞定。
\n\n基本思路
\nPerl对文件操作非常友好,利用其简洁的语法可以轻松遍历目录中的多个文件,并逐行读取内容写入新文件中。不需要额外安装模块,原生支持就足够应付大多数场景。
\n\n简单合并所有文本文件
\n假设你有一堆以 .txt 结尾的日志文件,存放在当前目录下,想要把它们全部合并成一个 all.log 文件。下面这个脚本就能完成任务:
\n#!/usr/bin/perl\nuse strict;\nuse warnings;\n\nopen my $out, '>', 'all.log' or die "无法创建输出文件: $!";\n\nfor my $file (glob "*.txt") {\n open my $in, '<', $file or warn "无法打开 $file: $!\\n";\n while (<$in>) {\n print $out $_;\n }\n close $in;\n}\n\nclose $out;\n\n添加文件分隔标记
\n有时候你会希望知道某段内容来自哪个原始文件,可以在每个文件开始前插入一个注释行作为标识:
\n#!/usr/bin/perl\nuse strict;\nuse warnings;\n\nopen my \$out, '>', 'merged.log' or die "无法创建输出文件: \$!";\n\nfor my \$file (glob "*.log") {\n print \$out "# 来源文件: \$file\\n";\n open my \$in, '<', \$file or warn "无法打开 \$file: \$!\\n";\n while (<\$in>) {\n print \$out $_;\n }\n close \$in;\n}\n\nclose \$out;\n\n按文件名排序合并
\n如果文件是按时间命名的,比如 access_01.log 到 access_24.log,直接用 glob 可能不会按顺序读取。加个 sort 就能保证顺序正确:
\nfor my \$file (sort glob "access_*.log") {\n\n跳过空文件
\n有些日志文件可能为空,不想让它们影响结果。可以在读取前判断大小:
\nnext unless -s \$file; # 跳过空文件\n\n处理大文件也不卡
\nPerl默认是逐行读取,内存占用很低,即使单个文件有几百MB也不会导致系统变慢。这比把整个文件加载进数组再写出去的方式更稳妥。
\n\n自动化整合到日常任务
\n把这个脚本保存为 merge_logs.pl,配合系统的定时任务(如cron),每天凌晨自动运行一次,就能把前一天的碎片日志整理成一个完整文件,省时又省心。
","seo_title":"Perl合并多个文件方法详解","seo_description":"介绍如何使用Perl脚本高效合并多个文本文件,适用于日志整合、数据汇总等场景,代码示例清晰,适合网络优化与自动化处理需求。","keywords":"Perl合并文件,Perl脚本,合并多个文本文件,日志合并,Perl文件操作"}