魏长东

weichangdong

东邪

perl命令行高级应用

用perl写后缀是pl的文件,可以实现很多很强大的功能。但是好多时候,处理一个文件,都喜欢直接敲命令来解决,而不是写一个文件,就像shell,awk,sed一样,往往一行命令,就可以do what you want to do。

  • 替换
perl -pi.bak -e 's/pgp/php/g' *.php

替换所有后缀名是php的文件里面的pgh为php,并备份(perl -pi -e 's/pgp/php/g' *.php 不备份)
  • 取出文件一部分

 

perl -lane 'print "@F[0..4] $F[6]"' file

显示字段0-4和字段6,字段的分隔符是空格。

如果字段分隔符不是空格而是冒号,则用:

perl -F: -lane 'print "@F[0..4]n"' /etc/passwd

不显示开头5行:

perl -ne 'print unless 1 .. 5' file

显示10行到14行:

perl -ne 'print if 10 .. 14' file

每行取前10个字符:

perl -lne 'print substr($_, 0, 10) = ""' file

每行丢弃前4个字符:

perl -lne 'print substr($_, 4) = ""' file
  • 搜索

 

查找wcd字符串:

perl -ne 'print if /wcd/' file

查找不含wcd字符串的行:

perl -ne 'print unless /wcd/' file

查找包含wcd或yy的行:

perl -ne 'print if /wcd/ || /yy/' file
  • 排序反转

 

文件按行排序:

perl -e 'print sort <>' file

相当于简单的sort命令。

文件按段落排序:

perl -00 -e 'print sort <>' file

多个文件按文件内容排序,并返回合并后的文件:

perl -0777 -e 'print sort <>' file1 file2

文件按行反转:

perl -e 'print reverse <>' file1
  • 命令行参数解释

 

-00 段落模式,即以连续换行为分隔符 -0777 禁用分隔符,即将整个文件作为一个记录 -a 自动分隔模式,用空格分隔$_并保存到@F中。相当于@F = split ”。分隔符可以使用-F参数指定 -F 指定-a的分隔符,可以使用正则表达式 -e 执行指定的脚本。 -i<扩展名> 原地替换文件,并将旧文件用指定的扩展名备份。不指定扩展名则不备份。 -l 对输入内容自动chomp,对输出内容自动添加换行 -n 自动循环,相当于 while(<>) { 脚本; } -p 自动循环+自动输出,相当于 while(<>) { 脚本; print; }