首页/系统/Linux 运维命令速查/perl 一行流处理文本
文本处理77 条

perl 一行流处理文本

比 sed 更强的单行处理:PCRE 级正则(\d、\K、非贪婪)随手可用,-i 原地改、-ne 逐行判断,脚本万能替补。

Linux 运维命令速查系统更新于 2026-10-13

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 复核差异,确认无误再分发,比逐台手敲命令更可控。

易错点

  • 单独使用 perl -i 而不带 -p/-n:程序会等待标准输入而不是原地替换,容易误以为命令卡死
  • 用 -0777 读入超大文件:内存占用与文件大小相当,可能触发 OOM,先确认文件规模
  • 直接对生产配置执行 -i 且不留备份:替换范围一旦写错就无法回退,应使用 -i.bak
  • 忽略行尾与编码差异:CRLF 文件与 UTF-8 多字节字符会让按字符处理的正则出现意外结果

数据来源与参考

  • man 1 perlrun(Perl 官方手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌