Perl单行命令详解
Perl以强大的单行命令处理能力著称,特别适合文本处理和系统管理任务。以下是Perl单行命令的全面指南:
一、基本语法结构
# 标准格式
perl [选项] -e '代码' [文件列表]
# 多个-e参数
perl -e '代码1' -e '代码2' 文件
# 从管道读取
cat file.txt | perl -ne '代码'
二、常用选项
| 选项 |
含义 |
示例 |
|---|
-e |
执行代码 |
perl -e 'print "Hello\n"' |
-n |
隐式循环读取输入 |
perl -ne 'print if /pattern/' file |
-p |
类似-n,但自动打印 |
perl -pe 's/foo/bar/' file |
-l |
自动处理换行符 |
perl -lne 'print $_ . "!"' |
-a |
自动分割到@F数组 |
perl -ane 'print $F[0]' |
-F |
指定分割符 |
perl -F: -ane 'print $F[0]' |
-i |
原地修改文件 |
perl -i.bak -pe 's/old/new/' file |
-M |
加载模块 |
perl -MData::Dumper -e '...' |
-E |
启用新特性 |
perl -E 'say "Hello"' |
三、实际应用示例
1. 文本处理
# 打印文件内容
perl -pe '1' file.txt
# 打印匹配行
perl -ne 'print if /pattern/' file.txt
# 打印不匹配行
perl -ne 'print unless /pattern/' file.txt
# 删除空白行
perl -ne 'print if /\S/' file.txt
# 替换文本(原地修改)
perl -i -pe 's/foo/bar/g' file.txt
# 创建备份并替换
perl -i.bak -pe 's/old/new/g' file.txt
# 首字母大写
perl -pe 's/(\w+)/\u$1/g' file.txt
# 行号
perl -pe '$_ = "$. $_"' file.txt
2. CSV/表格处理
# 提取第一列
perl -F, -lane 'print $F[0]' data.csv
# 提取最后一列
perl -F, -lane 'print $F[-1]' data.csv
# 过滤特定列大于某值的行
perl -F, -lane 'print if $F[2] > 100' data.csv
# 计算列的和
perl -F, -lane '$sum += $F[1]; END { print $sum }' data.csv
# 转置CSV
perl -F, -lane 'push @{$data[$.]}, @F; END { for $i (0..$#{$data[1]}) { print join(",", map { $data[$_][$i] } 1..$.) } }' file.csv
3. 系统管理
# 查找大文件(>100MB)
find . -type f | perl -ne 'chomp; $s = -s; print "$_\t$s\n" if $s > 100_000_000'
# 统计目录大小
du -sk * | perl -ane 'print "$F[1]\t", $F[0]/1024, "MB\n"'
# 进程监控
ps aux | perl -ane 'print if $F[2] > 5.0' # CPU使用>5%
# 批量重命名文件
perl -e 'for (@ARGV) { $new = s/(\.txt)/_backup$1/r; rename $_, $new }' *.txt
# 查找重复文件(通过MD5)
find . -type f -exec md5sum {} \; | perl -ane '$h{$F[0]}++; push @{$h{$F[0]}}, $F[1]; END { for (keys %h) { print join("\n", @{$h{$_}}) if @{$h{$_}} > 1 } }'
4. 数据处理
# 计算平均值
perl -lne '$sum += $_; $count++; END { print $sum/$count }' numbers.txt
# 排序去重
perl -ne '$h{$_}++; END { print sort keys %h }' file.txt
# 统计词频
perl -lpe 's/[^\w\s]//g' file.txt | perl -lane '$count{$_}++ for @F; END { for (sort {$count{$b} <=> $count{$a}} keys %count) { print "$_: $count{$_}" } }'
# JSON处理
echo '{"a":1,"b":2}' | perl -MJSON -ne '$j = decode_json($_); print $j->{a}'
# URL编解码
perl -MURI::Escape -ne 'print uri_unescape($_)' urls.txt
5. 高级技巧
# 模拟grep -A/B/C
perl -ne '$print = $after; print if $print; $print = $after = /pattern/ ? 3 : $after-1' # -A3
perl -ne 'push @lines, $_; shift @lines if @lines > 4; $print = /pattern/; print @lines if $print' # -B4
# 范围操作
perl -ne 'print if 10..20' # 打印10-20行
perl -ne 'print if /start/../end/' # 范围匹配
# 多文件处理
perl -i -pe 's/OLD/NEW/g; $. == 1 && print "Processing $ARGV\n"' *.txt
# 智能打印
perl -lpe '$_ = sprintf("%04d: %s", $., $_)' file.txt
# 二进制文件处理
perl -0777 -ne 'print unpack("H*", $_)' binary.file # 转十六进制
四、特殊变量参考
在单行命令中常用的特殊变量:
$_ # 当前行/默认变量
$. # 行号
$ARGV # 当前文件名
@F # -a选项分割后的数组
@ARGV # 命令行参数列表
%ENV # 环境变量
$^I # -i选项的备份扩展名
$1, $2... # 正则捕获组
五、实用模板
# 模板1:通用处理框架
perl -i.bak -lpe '
BEGIN { # 初始化代码 }
# 每行处理代码
s/pattern/replacement/g;
tr/A-Z/a-z/;
$_ = reverse $_ if condition;
END { # 结束代码 }
' file1 file2
# 模板2:复杂数据处理
perl -MList::Util=sum -lane '
next if /^#/; # 跳过注释
$total += sum(@F[1..3]);
push @rows, \@F;
END {
print "Total: $total";
# 更多END处理
}
' data.txt
六、性能优化技巧
使用-l处理换行:避免手动chomp
预编译正则:在循环外编译复杂正则
避免重复计算:缓存计算结果
尽早返回:使用
next跳过不需要的行
使用内置函数:避免调用外部命令
七、注意事项
引号转义:shell中正确处理引号
文件名包含空格:使用
--分隔选项和参数
错误处理:使用
eval或检查
$!
内存使用:大文件处理时注意内存
编码问题:使用
-C或
binmode处理编码
八、与其他工具结合
# 与find结合
find . -name "*.log" -exec perl -i -pe 's/error/warning/g' {} \;
# 与xargs结合
ls *.txt | xargs -I {} perl -i -pe 's/old/new/g' {}
# 在管道中使用
cat access.log | perl -ne 'print if /GET/' | perl -pe 's/.*GET //'
# 与awk/sed对比
# Perl可以替代大多数awk和sed任务,功能更强大
掌握Perl单行命令能极大提高文本处理效率,特别是在处理复杂格式或需要编程逻辑的任务时。建议从简单任务开始,逐步尝试更复杂的组合。