Perl一句话命令行编程中常用参数总结
工作中的线上环境有很多的perl命令行的类似一句话的命令,今天总结下perl的命令行编程的一些东西。
-e后面紧跟着引号里面的字符串是要执行的命令:
king@king:~$perl-e‘print“helloworld\n”‘ helloworld
如果是多个命令就可以使用多个-e,这里是不是想到了sed呢?但是要注意的是中间的哪个“;”.
king@king:~$perl-e‘print“helloworld\n”;'-e‘print“myfirstperlcommandlinescript\n”‘ helloworld myfirstperlcommandlinescript
-M导入要使用的模块:
king@king:~$perl-MLWP::Simple-e'printhead“http://www.chinacache.com”,”\n”‘ text/html;charset=utf-81337525116978307200Apache/2.2.3(CentOS)
另外-M可以判断某个模块是不是已经安装了
-m的功能和-M类似,区别在于-M模块名等同于use模块名,这样会把一些默认的函数或者其它东西引进过来,-m模块名则会关闭这些默认值,这样可以引入一些你只使用的函数;例如上面的例子:
换成-m的话就不会有任何输出;-m和-M通过=来引入某个模块的特别函数.
perl-MCGI='header,start_html'-e‘printheader,start_html'
-w等同于usewarnings
-n-p都会使用<>将所有@ARGV参数当作文件来逐行运行(有循环的意思哦,经常和其它参数一起处理文件),会将读入的内容隐式的逐一按行来遍历文件.每一行将缺省保存在$_;但-p会将内容“重复”打印出来,而-n更倾向与打印满足某种条件的行(这这里还有一些有用的变量比如$.表示当前行的行数):
king@king:~$catfile.txt A1 B2 C3 king@king:~$perl-p-e‘print‘file.txt A1 A1 B2 B2 C3 C3 king@king:~$perl-n-e‘print‘file.txt A1 B2 C3
看到这里是不是想到了sed的-n的特性:
king@king:~$sed-ne‘p'file.txt A1 B2 C3 king@king:~$sed-e‘p'file.txt A1 A1 B2 B2 C3 C3
-i将修改直接的写入文件,这个和sed也是一样的哦;
king@king:~$catfile.txt A1 B2 C3 king@king:~$perl-pi-e‘s/A/a/'file.txt king@king:~$catfile.txt a1 B2 C3
-a打开自动分离(split) 模式.空格是缺省的分离号.输入根据分离号被分离然后放入缺省数组@F.
king@king:~$perl-na-e‘print$F[1],”\n”‘file.txt 1 2 3
和awk是不是很像?还有更像的,那就是-F,和awk一样更改字段之间的分割符,默认是空格和tab;
king@king:~$perl-F':'-alne‘print$F[0],”“,$F[-1]if/bash$/'/etc/passwd root/bin/bash king/bin/bash guest-b0SIey/bin/bash
看到上面的那个-l的参数没?它的最主要的作用就是chomp字段和在每个输出的后面加上“\n”,让输出换行;是不是挺有用的呢?
有没有其它和awk有类似的地方呢?答案是肯定的,
BEGIN{},END{}是不是也很熟悉呢?
以下是一些常用的简单实例
#perl-pi-e's/aaa/bbb/'filename修改当前file文件中的文件,不生成中间文件,速度很快.记住-i开关,因为它让你原地编辑文件.
#perl-ne‘printif/^aaaaa/'filename象grep一样过滤文件中需要的内容.这个地方,使用了-n,所以一次是做一行的操作,直到整个文件读完.另外,在管道时,-n也会一样,来遍历管道送过来的内容.
#perl-n-e‘print“$.–$_”‘filename这个例子中的,没用-ne,只是命令写成了-n-e,其实一样,这个例子中,是给当前文件中的内容都加一个行号打印出来.注:$.表示当前行号
#perl-pe‘$_=“$.$_”‘filename这个其实和上面一样,分别只是使用了-p替换了-n,这个有个什么好处啦,别的地方都一样,但-p按行来遍历完文件后,会给$_打印出来.
大家还记得awk分割域(awk‘{i=NF–1;print$1+$i}')啊,是不是很方便,下面我们来看看perl
#perl-lane‘print$F[0]+$F[-2]‘这个神奇的地方在于-a,使用-a后.因为-n分行读进来,然后-a给数据分割成@F的数组. #perl-ne‘printif/^START$/../^END$/'打印正则中从$start到$end的地方 #perl-ne‘printif$.>=15;exitif$.>=17;'有效地打印数字范围中的行 #perl-p-i.bak-e‘s/\bfoo\b/bar/g'*.c原地修改-i开关的神奇之处在于它对@ARGV中的每个文件都用该脚本对该文件输出所产生的文件版本进行替代 #perl-ne‘printscalarreverse$_'test给文件中的内容反向排序,比如文件中有abc,就会变成cba