perl 一行流是什么
perl 一行流用 -p/-n 把脚本变成命令行上的文本处理器:-pe 逐行处理并输出,-ne 逐行过滤,-i 原地替换(可带备份后缀),-0777 整体读入以支持跨行匹配。最大优势是正则能力强且写法统一:\d、\s、非贪婪匹配、捕获组即写即用,不必像 grep 的基础正则那样反复核对转义。
基本信息
| 适用平台 | 几乎所有 Linux/Unix(perl 通常预装) |
|---|---|
| 常用开关 | -pe 逐行处理、-ne 逐行过滤、-i 原地替换、-0777 整体读入、-l 处理行尾 |
| 正则特性 | 支持 \d、\s、非贪婪 +?、命名捕获等 PCRE 风格写法 |
| 相关命令 | sed、awk、grep -P |
| 风险点 | -i 是原地写入,不可逆 |
典型使用场景
- 批量替换配置里的 IP、端口或路径(并保留备份)
- 从日志中提取字段生成报表
- 按复杂条件过滤日志行
- 跨行替换:把一整段配置块换掉
- sed 基础正则表达不了的复杂匹配
常用示例
常用示例
perl -pe 's/foo/bar/g' file.txt # 全局替换并输出到屏幕
perl -i.bak -pe 's/\d{4}-\d{2}-\d{2}/REDACTED/g' app.log # 原地替换并留 .bak 备份
perl -ne 'print if /\bERROR\b/' app.log # 逐行过滤,只打印命中的行
perl -ne 'print "$1\n" if /timeout=(\d+)ms/' app.log # 提取捕获组
perl -ne 'print if /^10\.0\.0\./ && !/health/' access.log # 多条件组合过滤
perl -0777 -pe 's/begin.*?end/SECTION/gs' big.txt # 跨行替换,-0777 整体读入
perl -lne 'print "$. $_" if /WARN/' app.log # 带行号输出,便于定位开关与用途
| 开关 | 作用 | 注意 |
|---|---|---|
| -p | 逐行处理并自动打印 | 常与 -e 的替换表达式搭配 |
| -n | 逐行处理但不自动打印 | 需要自己 print 的过滤场景 |
| -i | 原地替换 | 必须与 -p/-n 搭配,否则会等待键盘输入 |
| -i.bak | 原地替换同时保留备份 | 改生产配置的推荐做法 |
| -0777 | 整体读入文件 | 内存占用与文件等大,先估规模 |
| -l | 自动处理行尾换行 | 组合 print 时输出更干净 |
复杂匹配上 perl 的正则(\d、\s、非贪婪 +?、命名捕获)即写即用,比 grep 的基础正则在可读性和效率上省心得多,需要 PCRE 风格时它是稳妥选择。
-i 是原地写入且不可逆:先在副本上跑一遍确认替换范围与结果,再对生产文件执行,并保留 .bak 备份。
批量改多台机器的配置时,把一行流包成脚本并统一留备份与校验:替换后用 grep 或 git diff 复核差异,确认无误再分发,比逐台手敲命令更可控。