perl单行脚本一般用来提取文件中部分内容或者删除某些部分。使用简单方便,简单介绍下如何操作。 因为大部分都使用windows,所以我们下面的实例以windows为主(Linux下请将“改',\”改“)

perl的安装

请注意:在windows下安装perl,无论是哪种方式,不要将其安装在含有中文或者空格的路径下,否则部分功能将不可用!!!

windows:

Windows下可以安装ActivePerl或者StrawBerry Perl,下面分别介绍。

ActivePerl

下载ActivePerl的5.16版本,安装。
windows中安装完按win+r快捷键,输入cmd,回车,在弹出界面中输入以下行即可

StrawBerry Perl

下载StrawBerry Perl ,这个是绿色便携版,解压即可使用 推荐
或者到官网上下载StrawBerry Perl请不要下载5.18版本或者5.10以前的版本,防止新版本不稳定和版本过老。
如果是安装包,可以直接安装后使用
如果是绿色版,解压下载的文件(解压后约290M),点击portableshell.bat文件,即可与命令行一样使用

Linux

Linux一般自带perl,不需要安装,不过版本可能比较低,可以下载新的版本。

perl脚本使用

简单介绍常见的应用:

首先说明命令选项,命令选项可以叠加,例如 -n -e 可以写成 -ne

常见命令选项:

 -l
    对输入内容自动chomp,对输出内容自动添加换行

-a
    对每行进行分割自动分隔模式,用空格分隔$_并保存到@F中。相当于@F = split ”。分隔符默认为空白,可以用-F/分隔符/指定

-n
    自动循环,相当于 while(<>) { 脚本; }

-e
    表示执行引号中的内容 (Linux下用单引号,windows下为双引号,且双引号中的双引号用\"表示)

-F
    /分隔符/ 表示在-a中使用分隔符分割

-p 
    自动循环+自动输出,相当于 while(<>) { 脚本; print $_; }, -p 开关更适用于对文件进行的 完全处理,而 -n 开关更适用于 选择性文件处理,这样的处理只需打印特定数据.

-0<数字>
    (用8进制表示)指定记录分隔符($/变量),默认为换行

-00
    段落模式,即以连续换行为分隔符

-0777
    禁用分隔符,即将整个文件作为一个记录

-i<扩展名>
    原地替换文件,并将旧文件用指定的扩展名备份。不指定扩展名则不备份。

其他说明:

$.表示行号

-a分割出来的字符串在$F[0],$F[1],$F[2]…

print为输出,和c中printf类似。使用方式为:print ”“

windows下glob名字需要在引号里加上:

BEGIN { @ARGV = map {glob} @ARGV }

去掉空白行

perl -ne "print if /./" 输入文件名>输出文件名

删除重复行

删除相邻的重复行

perl -ne "print unless $_ eq $t;$t=$_" 输入文件名>输出文件名

删除所有重复行

perl -ne "print if !$H{$_};$H{$_}=1" 输入文件名>输出文件名

提取指定行

显示第52行

perl -ne "print if 52..52" 输入文件名>输出文件名

显示部分文本——指定行号范围(从第8至第12行,含8和12行)

perl -ne "print if 8..12" 输入文件名>输出文件名

从第3行开始,每7行显示一次

perl -ne "print if $.%7==3" 输入文件名>输出文件名

按分割提取数据

实例1

数据

1.txt
0.19778E+03 0.19728E+03 0.20200E+03 0.21395E+03 0.22597E+03 0.23904E+03
0.25077E+03 0.26367E+03 0.26713E+03 0.26420E+03 0.25833E+03 0.25192E+03
0.24476E+03 0.23800E+03 0.23291E+03 0.22687E+03 0.21867E+03 0.21206E+03
0.20985E+03 0.20602E+03 0.19853E+03 0.19696E+03 0.19905E+03 0.20422E+03
0.21108E+03 0.21936E+03 0.22464E+03 0.22993E+03 0.23543E+03 0.24113E+03
0.24695E+03 0.25255E+03 0.25822E+03 0.26379E+03 0.26932E+03 0.27456E+03
0.27992E+03 0.28508E+03 0.28902E+03 0.29143E+03 0.29338E+03 0.29530E+03
0.18766E-06 0.11917E-05 0.27389E-05 0.32299E-05 0.36746E-05 0.39554E-05
0.39677E-05 0.39495E-05 0.38053E-05 0.36257E-05 0.34473E-05 0.32739E-05
0.31184E-05 0.30011E-05 0.30184E-05 0.28977E-05 0.26138E-05 0.24093E-05
0.23376E-05 0.22763E-05 0.22623E-05 0.22913E-05 0.25811E-05 0.45228E-05
0.11139E-04 0.32733E-04 0.59882E-04 0.98122E-04 0.15438E-03 0.23727E-03
0.38423E-03 0.56571E-03 0.86361E-03 0.12832E-02 0.19571E-02 0.28807E-02
0.40076E-02 0.56100E-02 0.77936E-02 0.93611E-02 0.11030E-01 0.12630E-01
 

提取奇数行的第 1、4列

perl  -lane "print \"$F[0] $F[3]\" if($.%2==1)" 1.txt>out.txt

提取第一行和3的倍数行

perl  -lane "print  if($.==1 or $.%3==0)" 1.txt>out.txt

说明:

以上文件是空格分隔的

-l表示print每次都在输出回车

-a表示用默认分隔符(空白)对每行进行分割

-n表示每次自动读取文件的一行

-e表示执行引号中的内容

1.txt为输入文件

out.txt为输出文件

print表示输出

\”$F[0] $F[3]\“表示,输出每行中的第1、4列

if($.%2==1)中,$.表示行号,%表示取模

if($.==1 or $.%3==0) 表示 第一行和3的倍数行,$.表示行号,或者用or,并且用 and

实例2

2.txt
0.19778E+03,0.19728E+03,0.20200E+03,0.21395E+03,0.22597E+03,0.23904E+03
0.25077E+03,0.26367E+03,0.26713E+03,0.26420E+03,0.25833E+03,0.25192E+03
0.24476E+03,0.23800E+03,0.23291E+03,0.22687E+03,0.21867E+03,0.21206E+03
0.20985E+03,0.20602E+03,0.19853E+03,0.19696E+03,0.19905E+03,0.20422E+03
0.21108E+03,0.21936E+03,0.22464E+03,0.22993E+03,0.23543E+03,0.24113E+03
0.24695E+03,0.25255E+03,0.25822E+03,0.26379E+03,0.26932E+03,0.27456E+03
0.27992E+03,0.28508E+03,0.28902E+03,0.29143E+03,0.29338E+03,0.29530E+03
0.18766E-06,0.11917E-05,0.27389E-05,0.32299E-05,0.36746E-05,0.39554E-05
0.39677E-05,0.39495E-05,0.38053E-05,0.36257E-05,0.34473E-05,0.32739E-05
0.31184E-05,0.30011E-05,0.30184E-05,0.28977E-05,0.26138E-05,0.24093E-05
0.23376E-05,0.22763E-05,0.22623E-05,0.22913E-05,0.25811E-05,0.45228E-05
0.11139E-04,0.32733E-04,0.59882E-04,0.98122E-04,0.15438E-03,0.23727E-03
0.38423E-03,0.56571E-03,0.86361E-03,0.12832E-02,0.19571E-02,0.28807E-02
0.40076E-02,0.56100E-02,0.77936E-02,0.93611E-02,0.11030E-01,0.12630E-01

文件以逗号分隔

提取奇数行的第 1、4列

perl -F/,/ -lane "print \"$F[0] $F[3]\" if($.%2==1)" 2.txt>out.txt

-F/,/ 表示以逗号分隔

处理文本

查找修改访问几天前 or 几天内的内容

perl -le 'print for grep { 7 > -M } glob "*"'

原地编辑文件,不备份,将文件中的aaa转为bbb,windows下-i要单独放最前面,e放到最后,否则会提示错误,linux下可以直接写-pie

perl -i -pe  "s/aaa/bbb/" filename 

用正则表达式修改所有某类型文件, BEGIN{@ARGV = map glob,@ARGV} 是windows下才需要添加的

perl  -i.bak  -pe "BEGIN{@ARGV = map glob,@ARGV} s/(windows)/$1&Linux/g"  *.txt

感谢老许,行列置换:

cat datafile | perl -MData::Dumper=Dumper -nale '$x->[$_]->[$n++] = $F[$_] for (0 .. $#F); END { print Dumper($x) }'