Perl命令行应用程序详解

perl - Practical Extraction and Report Language,Perl有很多命令行参数,通过它可以让你的程序更简练,并且可以写出很多只有一行命令的perl。在这篇文章里我们来了解一些常用的命令行参数。

命令行调用


代码如下:

perl [ -sTtuUWX ]
[ -hv ] [ -V[:configvar] ]
[ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ]
[ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ]
[ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ]
[ -C [number/list] ]
[ -P ]
[ -S ]
[ -x[dir] ]
[ -i[extension] ]
[ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...

[开关项描述]

-0

规定记录分隔符。

-0<数字>

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

-00

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

-0777

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

-a

与 -n 或者 -p 一起使用,负责打开自动拆分模式,用于对空白字符进行隐式拆分,用空格分隔$_并保存到@F中,相当于@F=split ''。分隔符可以使用-F参数指定例如:

代码如下:

date | perl -ane 'print "$F[0]\n"';

-c

只检查 Perl 脚本语法,而不执行脚本。

-d

对脚本打开 Perl调试器。

-D

设置 Perl 的调试标记(请先检查 Perl 的安装情况,确保已经安装了调试器),若要观察 Perl 是如何执行脚本的,可使用 -D14。

-e command

用于再命令行而不是在脚本中执行 Perl 命令。

-F pattern

规定拆分输入行时使用的模式。模式是位于斜杠、单引号或双引号之间的正则表达式。例如,-F/:+/ 表示在一个或多个冒号上拆分输入行,如果 -a 仍然起作用的话,则打开它。

-h

打印 Perl 的命令选项列表。

-i extension

在使用 <> 循环遍历文件时启用原位编辑模式。 如果没有规定扩展名的话,则原位修改各行内容,否则使用扩展名来修改输入文件名(以便充当备份文件),并使用原位编辑的原文件名创建输出文件。 这也是所有 print 语句选择的文件句柄。

-I directory
与 -P选项一起使用,负责告诉 C 预处理程序查找包含的文件,其默认目录包括 /usr/included、/usr/lib/perl 以及当前目录。

-1 digits
启用自动行结束处理。如果使用了 -n 或者 -p 选项,则去掉终止符。把位数(八进制) 赋值给 $\ ,并将行终止符添加到 print 语句中。如果没有规定位数的话,则将 $\ 设置为 $/ 的当前值。

-l
对输入内容自动chomp,对输出内容自动添加换行。使用 -l 有两个效果,第一自动 chomp 输入分隔号,第二 把$/ 值付给 $\ (这样 print 的时候就会自动在末尾加 \n)

代码如下:

-m [-] module
-M [-] module
-M [-] module'
-[mM] module =
arg [,arg]..
-m module

在执行 Perl 脚本之前执行 use 方法。

-M module
再执行 Perl 脚本之前执行 use 方法。如果添加附加的文本,则可使用引号。方括号中的短横线表示把 use 指令替换为 no。

-n
使 Perl 隐式地循环遍历指定的文件,并只打印规定的行。自动循环,相当于 while(<>) { 脚本; }

-p
使 Perl 隐式地循环遍历指定的文件,同时打印所有的行。自动循环+自动输出,相当于 while(<>) { 脚本; print; }

-P
使要运行的脚本在 Perl 编译之前通过 C 预处理程序。

-s
再脚本名之后、文件名参数之前启用开关项解析,并从@ARGV 数组中删除所有找到的开关项。将开关项设置为同名的标量型变量,并将标量赋值为 1 。例如,-abc 在脚本中将转换为 $abc。

-S
如果不支持 #!/usr/bin/perl 行,则让 Perl 在 PATH 环境变量中搜索脚本。

-T
强制打开“污染“ 检查,用于测试脚本,一般只用在 setuid 或 setgid 程序上。推荐自行检查 CGI 脚本。

-u
编译后产生脚本的核心转储(基于 UNIX 系统)。

-U
允许 Perl 执行不安全的操作,如果是超级用户的话,则断开目录链接。

-v
打印 Perl 的版本信息。

-V
打印最重要的 Perl 配置项和数组 @INC 中当前值的汇总。

-V:NAME
打印 NAME 的值,其中 NAME 是配置变量。

-w
打印警告信息,包括错误使用保留字、文件句柄、子例程等情况。

-W
启用所有警告,而不论是否已经用 no warnings 关闭了本地警告。

-x directory
忽略 #!/usr/bin/perl 行之前的任何文本。如果将目录名当作 -x 开关的参数,则 Perl 会在开始执行脚本之前自动切换到该目录。

-X
关闭所有警告。

每一行将缺省保存在 $_,-p 和 -n 一样,但是还会打印 $_ 的内容。

请注意:-p 开关和 -n 开关的使用。当您想显式打印数据时,使用 -n 开关。-p 开关隐式地将 print $_ 语句插入到 -n 开关所产生的循环中。因此,-p 开关更适用于对文件进行的完全处理,而 -n 开关更适用于选择性文件处理,这样的处理只需打印特定数据。

安全网参数
有三个参数我认为可以起到“安全网”的作用,因为它们可以让你避免犯错,特别是当你在使用 Perl 尝试一些特别聪明(或这愚蠢)的想法时,错误难免会发生。有经验的 Perl 程序员常常使用这三个参数来提前找到错误所在。

-c 是第一个。这个参数编译 Perl 程序但并不真正运行它,由此检查所有语法错误,每次修改 perl 程序之后我都会立刻使用它来找到任何语法错误。

代码如下:

$ perl -c program.pl

这保证了程序依然可以编译。很显然,当你输入一小段代码之后立即进行检查,比起一下子输入几百行代码然后开始 debug 要容易很多。

-W 是第二个参数。它会提示你任何潜在的bug。Perl 5.6.0 之后的版本已经用 use warnings; 替换了-w。你应该使用 use warnings 因为它要比 -w 更灵活。

-T 是第三个参数。它让 perl 出于了 taint 模式中。在这个模式里,Perl 会质疑任何程序外传来的数据。例如从命令行读取,外部文件里读取或是 CGI 程序里传来的数据。这些数据在 -T 模式里都会被 Tainted(污染),Tainted 数据不可以被用来和外部交互。例如使用在 system 调用和用作 open 的文件名,关于什么数据会被Tainted,请参阅perlsec 文档,那里有一个完整的列表。

要想使用 Tainted 的数据就必须 untaint这个数据。untaint是通过正则表达式来实现的,关于 taint 本身的内容足够写一篇单独的文章,所以这里我不会太多的讲述 taint 模式。如果你要编写的程序(例如 CGI 程序)需要从从用户那里接受不可知的输入,我推荐使有 taint 模式。

还有一个值得一提的参数是 -d,它将让 Perl 处于 Debugger 模式。这个话题内容非常多,我推荐阅读文档 ‘perldoc perldebug'或 Richard Foley 的 Perl Debugger Pocket Reference 一书.

使用模块
下面的几个 Perl 参数可以让短小的 Perl 程序很容易的在命令行上运行,-e 可以让 Perl代码在命令行上被编译器直接执行。例如,我们可以直接在命令行上运行“Hello World” 程序而不用把它写称 Perl 程序。

代码如下:

$ perl -e 'print "Hello World\n"'

多个 -e 也可以同时使用,运行顺序根据它出现的位置。

代码如下:

$ perl -e 'print "Hello ";' -e 'print "World\n"'

象所有的 Perl 程序一样,只有程序的最后一行不需要以 ; 结尾,你也可以用 -e 来引用模块,但 -M 让它变得更容易。

代码如下:

$ perl -MLWP::Simple -e 'print head "http://www.example.com"'

-M模块名和use 模块名一样。有些模块有默认的模块导入,如果你不想导入它们,你可以使用-m。-m模块名和 use module() 一样,关闭了默认的导入。例如下面这个例子,因为 head 函数是默认导入,而使用-m 时就不会执行,结果是没有输出。

代码如下:

$ perl -mLWP::Simple -e 'print head "http://www.example.com"'

-m 和 -M 有很多方便的语法来帮助你使用它们,你可以在 = 后面列出对 use 的各种参数。

代码如下:

$ perl -MCGI=:standard -e 'print header'

在这里,CGI.pm 的 :standard 被引入,header 函数因此可以使用。要引入多个参数可以通过使用引号和逗号。

代码如下:

$ perl -MCGI='header,start_html' -e 'print header,start_html'

这里我们引入了 header 和 start_html 函数。

Implicit Loops
-n 和 -p 增加了循环的功能,使你可以一行一行来处理文件。

代码如下:

$ perl -n -e 'some code' file1

这与下面的程序一样.
LINE:

代码如下:

while () {
# your code goes here
}

注意:打开命令行里的文件,一行行的读取,每一行将缺省保存在 $_。

代码如下:

$ perl -n -e 'print "$. - $_"' file

上面的这一行可以写成 LINE: while () { print ”$. – $_” } 输出当前行数 $. 和当前行 $_,-p可以让上面的程序变得更容易,-p 会输出 $_ 的内容,就像这样:

代码如下:

while () {
# your code goes here
} continue {
print or die "-p destination: $!\n";
}

continue 在这里保证 print 在每次循环都会被调用。使用 -p,我们的打印行数程序可以改为

代码如下:

$ perl -p -e '$_ = "$. - $_"' filename

这种情况下我们就不需要要明确地调用 print 函数了,因为 -p 选项已经调用了它。注意,LINE: 标签可以让我们直接跳到下一个输入记录,而不管你进入了多少层循环,使用 next LINE。

代码如下:

$ perl -n -e 'next LINE unless /pattern/; print $_'

当然,也可以这样写:

代码如下:

$ perl -n -e 'print unless /pattern/'

在更复杂的情况里,next LINE可以让你的代码更容易理解。如果想在循环的前后做些处理,可以使用 BEGIN或END block,下面的这一行代码可以计算 text 文件里的字数:

代码如下:

$ perl -ne 'END { print $t } @w = /(\w+)/g; $t += @w' file.txt

每一行所有匹配的字放入数组 @w,然后把 @w 的元素数目递加到$t,END block 里的 print 最后输出文件总字数。

还有两个参数可以让这个程序变得更简单,-a 打开自动分离 (split) 模式,空格是缺省的分离号,输入根据分离号被分离然后放入缺省数组 @F。由此,我们可以把上面的程序改写为:

代码如下:

$ perl -ane 'END {print $x} $x += @F' file.txt

你也可以通过 -F 把缺省的分离号改为你想要的.例如把分离号定为非字符:

代码如下:

$ perl -F'\W' -ane 'END {print $x} $x += @F' file.txt

下面通过 Unix password 文件来介绍一个复杂的例子。Unix password 是文本文件,每一行是一个用户记录,由冒号 ':'分离。第6列是用户的登录 shell 路径,我们可以得出每一个不同 shell 路径被多少个用户使用:

代码如下:

$ perl -F':' -ane 'chomp($F[6]); $s{$F[6]}++; END{print"$_:$s{$_}n" for keys %s}' /etc/passwd
$ perl -F':' -alne '$s{$F[6]}++;' -e 'END { foreach (keys %s){chomp($_);print "$_ \: $s{$_}"} }' /etc/passwd

有如下输出:

代码如下:

/usr/sbin/nologin : 3
/bin/sh : 18
/bin/sync : 1
/bin/bash : 2
/bin/false : 9

数据分隔符
我以前的文章里提到过 $/ 和 $\—输入,输出分隔号。$/ 用来分隔从文件句柄里读出的数据,缺省 $/ 分隔号是 \n,这样每次从文件句柄里就会一行行的读取。$\ 缺省是空字符,用来自动加到要 print 的数据尾端。这就是为什么很多时候 print 都要在末尾加上 \n,$/ 和 $\ 可与 -n -p 一起使用。在命令行上相对应为 -0 (零) 和 -l (这是 L)。-0 后面可以跟一个16 进制或8进制数值,这个值用来赋给 $/。-00 打开段落模式,-0777 打开slurp 模式(即可以一次把整个文件读入),这与把 $/ 设为空字符和 undef 一样效果。

单独使用 -l 有两个效果,第一自动 chomp 输入分隔号,第二 把$/ 值付给 $\ (这样 print 的时候就会自动在末尾加 \n)我个人常常使用 -l 参数,用来给每一个输出加 \n,例如:

代码如下:

$ perl -le 'print "Hello World"'

原位编辑
使用已有的参数我们可以写出很有效的命令行程序. 常见的Unix I/O 重定向:

代码如下:

$ perl -pe 'some code' output.txt

这个程序从 input.txt 读取数据,然后做一些处理再输出到 output.txt. 你当然也可以把输出重定向到同一个文件里。上面的程序可以通过 -i 参数做的更简单些。-i 把源文件更名然后从这个更名的源文件里读取,最后把处理后的数据写入源文件。如果 -i 后跟有其他字符串,这个字符串与源文件名合成后来生成一个新的文件名,此文件会被用来储存原始文件以免被 -i 参数覆盖。

这个例子把所有php字符替换为perl :

代码如下:

$ perl -i -pe 's/\bPHP\b/Perl/g' file.txt

程序读取文件的每一行,然后替换字符,处理后的数据重新写入(即覆盖) 源文件. 如果不想覆盖源文件,可以使用$perl -i.bak -

代码如下:

pe 's/\bPHP\b/Perl/g' file.txt

这里处理过的数据写入 file.txt ,file.txt.bak 是源文件的备份。

打开Perl的taint模式
1、该程序的输入数据来自外部数据源。
2、该程序所调用sub-shell或者函数影响到该程序之外其它东西。

你可以用“-T”开关来打开Perl的taint模式。当打开taint模式时,Perl就会进行执行检查以确保你的数据未被taint,如果不安全的使用了被taint的数据,就会发出严重错误。为了使你的数据不被taint,执行正则表达式来匹配数据并提取匹配部分。这样你就必须描述出你所期望的数据的内容以及格式,并只接受符合这一要求的数据。

例如,假设你期望收到一个单词字符(word characters,即字母数字以及下划线),那么下面的代码通过一个正则表达式(它只通过全部由单词字符组成字符串)会“蒸馏出”你的数据来:

代码如下:

if ($data =~ /^(\w+)$/) {
$data = $1;
} else {
die ”Error: tainted data found: $data\n”;
}

Perl命令行调试
缺省的Perl调试器就是perl解释器本身,另外还有图形界面的调试器。图形界面的调试器推荐ptkdb,这里不再进行介绍,下载安装以后用两次便会。所以这里主要介绍一下缺省的命令行调试器的用法,一般的调试,用下面这些命令已经足够了,这些命令说明也来自网上整理而成。

用 -d 命令行选项启动Perl解释器,例如:
perl -d test.pl 即进入Perl调试器的交互界面。

调试命令列表如下:(所有命令都在调试提示符下顶格输入,命令大小写有关)
h:显示调试器的帮助信息。
|h:以分页形式显示调试器的帮助信息。
h h:显示一个压缩的帮助信息。
h 调试命令:显示某个调试命令的帮助。
p 表达式:显示变量或表达式的值,不显示复杂变量嵌入的结构和数据。
x 表达式:显示变量或表达式的值,对较为复杂的变量,以一种可读形式显示嵌入的结构和数据。
V 包名 变量名列表:显示指定包内的所有(或部分)变量的值。(缺省的包名为 main)
X 变量名列表:显示当前包内所有(或部分)变量的值。

注:V、X命令中的变量名列表以空格分隔且变量名前应去掉$、@或%。

T:程序的调用栈回退一级。
s 表达式:单步执行,进入子函数。(step into)如果提供一个表达式并且表达式中包括函数调用,则单步进入该函数内。
n 表达式:单步执行,越过子函数。(step over)
c 行号/函数名:执行到某一行或某一个函数。
l:显示未执行的一窗(一屏)文件内容。
l min-max:显示第min到第max行的文件内容。
l 行号:显示指定行的内容。
l 函数名:显示指定函数的一窗(一屏)文件内容。
w 行号:显示某行周围一窗(一屏)文件内容。
f 文件名:切换到另一个文件。
/模式:在当前文件中向前(文件尾)查找匹配的字符串。
?模式:在当前文件中向后(文件头)查找匹配的字符串。
L:显示所有断点和附加操作。
S 模式:显示匹配(或不匹配,在模式前加!)的函数名。
t:切换跟踪模式。
t 表达式:跟踪执行表达式过程。
b 行号 条件:在某一行设置一个断点,当程序执行到该行并且条件满足时,产生中断。
b 函数名 条件:在某函数上设置一个断点,当程序执行到该函数并且条件满足时,产生中断。
b load 文件名:在某个文件的第一个可执行语句上设置一个断点。
d 行号:删除某一行的断点。
D:删除所有断点。
a 行号 命令:给程序的某一行加一个附加操作。在执行该行语句前先执行附加的操作。
A:删除所有已安装的附加操作。
W 表达式:增加一个监视项。
W:删除所有监视项。
O 选项名?:查询调试器可选项的值。
O 选项名=选项值:设置调试器可选项的值。
lt Perl语句:设置一个操作显示调试提示符前执行的操作。
ltlt Perl语句:增加一个显示调试提示符前执行的操作。
gt Perl语句:设置一个离开调试提示符(转入运行态)时执行的操作。
gtgt Perl语句:增加一个离开调试提示符(转入运行态)时执行的操作。
{ 调试命令:设置一个操作显示调试提示符前执行的操作。
{{ 调试命令:设置一个操作显示调试提示符前执行的操作。
注:上述Perl语句和调试命令均可输入多行,行尾以\转义。
!number:重新执行以前第number次执行的调试命令。
!-number:重新执行现在以前number次执行的调试命令。
!模式:重新执行以前执行过的与模式匹配的调试命令。
!!命令:不退出调试器执行一个shell命令。
H-number:显示以前执行的number条调试命令。如果省略number,则显示所有执行过的调试命令。
R:重新启动正在调试的程序。
q或^D:退出调试器。
|调试命令:将调试命令的输出分页显示。
||调试命令:类似|调试命令,适于有大量输出的调试命令,例如:|V main。
= 别名 值:给某个调试命令一个别名,例如:= quit q。

所有未识别的命令:当作插入的一条Perl语句执行。(使用eval)
Perl调试器的功能还有很多,可以设置很多选项来定制调试器的环境,它本身也是用Perl开发的,并且Perl发布中还有接口让你能开发其它的Perl调试器。如果要用Perl开发大的项目,有必要详细了解这些细节。使用调试器和设置调试器选项的例子请参考Perl发布中关于perldebug的文档。

更多信息
Perl有大量的命令行参数,这篇文章只是列举了最有用的一小部分,更详细的信息请参考“perlrun” 文档。

命令行的运用
用perl做命令行的一些简单的介绍,来替代sed、awk之类的软件。

Perl作为命令行实用程序,可以度参考ibm的这篇文章。作者提到的很重要的一点是:有经验的程序员不应回避快速而又难看的解决方案。

Perl单行命令示例
我们先看看perl如何接收用户的参数。如下,Dumper模块不用理会,只是它会给数据结构打印出来,shell给接收到的参数都放到了@ARGV这个数组。

代码如下:

perl -MData::Dumper -e 'print Dumper \@ARGV' a b -w
$VAR1 = [
'a',
'b',
'-w'
];

如上,perl可以直接接收到shell命令行的参数。“-e”后的任何内容并将它当作脚本来运行。“-M”参数表示获取其后的任何内容并将该内容作为模块导入,类似于正规脚本中的“use ModuleName”。我们可以看到象所有的 Perl 程序一样,只有程序的最后一行不需要以 ; 结尾。

注:-e在单行命令中非常的重要,做单行命令时一定要加入在使用perl的单行命令时要注意使用”,不要使用"",其实sed和awk也是一样,当然这只是一个建议,看下面的例子就能明白:

代码如下:

perl -e 'print "$$\n"'
5719

'$$'在perl中表示当前的pid,如果使用的是单引号,其中还可以放双引号,还有变量,重要的是,这些变量不用担心被shell转义。

代码如下:

perl -pi -e 's/aaa/bbb/' filename

修改当前file文件中的文件,不生成中间文件,速度很快.记住 -i 开关,因为它让你原地编辑文件。

代码如下:

perl -ne 'print if /^int/' 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 -lane 'print $F[0] + $F[-2]'

这个神奇的地方在于-a,使用-a后.因为-n分行读进来,然后-a给数据分割成@F的数组。

代码如下:

perl -ne 'print if /^START$/ .. /^END$/'

打印正则中从$start到$end的地方

代码如下:

perl -ne 'print if $. >= 15; exit if $. >= 17;'

有效地打印数字范围中的行

代码如下:

perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

原地修改 -i 开关的神奇之处在于它对 @ARGV 中的每个文件都用该脚本对该文件输出所产生的文件版本进行替代。

代码如下:

perl -ne 'print scalar reverse $_' test

给文件中的内容反向排序,比如文件中有fukai,就会变成iakuf.

替换
将所有C程序中的foo替换成bar,旧文件备份成.bak

代码如下:

perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

很强大的功能,特别是在大程序中做重构。记得只有在UltraEdit用过,如果你不想备份,就直接写成 perl -p -i -e 或者更简单 perl -pie

将每个文件中出现的数值都加一

代码如下:

perl -i.bak -pe 's/(\d+)/ 1 + $1 /ge' file1 file2 ....

将换行符\r\n替换成\n

代码如下:

perl -p -i -e 's/\r\n/\n/g' file

同dos2unix命令。

将换行符\n替换成\r\n

代码如下:

perl -pie 's/\n/\r\n/g' file

同unix2dos命令。

取出文件的一部分
显示字段0-4和字段6,字段的分隔符是空格

代码如下:

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

同 awk 'print $1, $2, $3, $4, $5, $7'。参数名称lane也很好记。

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

代码如下:

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

显示START和END之间的部分

代码如下:

perl -ne 'print if /^START$/ .. /^END$/' file

相反,不显示START和END之间的部分

代码如下:

perl -ne 'print unless /^START$/ .. /^END$/' file

显示开头50行:

代码如下:

perl -pe 'exit if $. > 50' file

同命令 head -n 50

不显示开头10行:

代码如下:

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

显示15行到17行:

代码如下:

perl -ne 'print if 15 .. 17' file

每行取前80个字符:

代码如下:

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

每行丢弃前10个字符:

代码如下:

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

搜索
查找comment字符串:

代码如下:

perl -ne 'print if /comment/' duptext

这个就是普通的grep命令了。

查找不含comment字符串的行:

代码如下:

perl -ne 'print unless /comment/' duptext

反向的grep,即grep -v。

查找包含comment或apple的行:

代码如下:

perl -ne 'print if /comment/ || /apple/' duptext

相同的功能就要用到egrep了,语法比较复杂……

计算
计算字段4和倒数第二字段之和:

代码如下:

perl -lane 'print $F[4] + $F[-2]'

要是用awk,就得写成 awk '{i=NF-1;print $5+$i}'

排序和反转
文件按行排序:

代码如下:

perl -e 'print sort <>' file

相当于简单的sort命令。

文件按段落排序:

代码如下:

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

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

代码如下:

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

文件按行反转:

代码如下:

perl -e 'print reverse <>' file1

相应的命令有吗?有,tac(cat的反转)

数值计算
10进制转16进制:

代码如下:

perl -ne 'printf "%x\n",$_'

10进制转8进制:

代码如下:

perl -ne 'printf "%o\n",$_'

16进制转10进制:

代码如下:

perl -ne 'print hex($_)."\n"'

8进制转10进制:

代码如下:

perl -ne 'print oct($_)."\n"'

简易计算器

代码如下:

perl -ne 'print eval($_)."\n"'

批量重命名文件
以下是在verycd网站下载的资料,现对其改名的例子:

代码如下:

$ ls
帝王之死001.mp3 帝王之死006.mp3
$ perl -MFile::Find -e 'find sub{ rename $_,substr($1,1,2).".mp3" if /(\d+)\.mp3$/;}, "." '
$ ls
01.mp3 06.mp3

$ ls
李斯傳奇 - 第001回.mp3
$ perl -MFile::Find -e 'find sub{ rename $_,$1.".mp3" if /(\d+)(.*)\.mp3$/;}, "." '
$ ls
001.mp3

$ ls
十二生肖妙品欣赏系列 01 子鼠精灵.pdf
$ perl -MFile::Find -e 'find sub{ rename $_,"$2$3".".pdf" if /(.*)\s(\d+)\s(.*)\.pdf$/;}, "." '
$ ls
01子鼠精灵.pdf

中文标点符号替换(中文在此占3个字符位)
女人当国$ ls
女人当国01:选秀入宫.mp3      女人当国16:“议政王”的奥妙.mp3

将'mp3'文件修改为:01.选秀入宫.mp3,像如下格式:
perl -MFile::Find -E 'find sub{ rename $_,"$1.$3".".mp3" if /(\d{2})([^u4E00-u9FA5]{3})(.*).mp3$/;}, "." '
女人当国$ ls
01.选秀入宫.mp3         13.京城风云动.mp3

...
秦琼:“战将”最终成“门神”(上).mp3
将'“”)'引号去掉
perl -MFile::Find -E 'find sub{ my $o=$_; s/“|”|)//g;rename $o,$_}, "." '

秦琼:战将最终成门神(上).mp3

将':('替换为'.'
perl -MFile::Find -E 'find sub{ my $o=$_; s/:|(|,/\./g;rename $o,$_}, "." '
秦琼.战将最终成门神.上.mp3

在数字编号后加入'.'
01石头里生出美猴王.mp3
perl -MFile::Find -E 'find sub{my $o=$_;s/(^\d+)/$1\./;rename $o,$_},"."'
01.石头里生出美猴王.mp3

将前置中文字符去掉
独立书店_01.台北.书店之城.1.mp3
perl -MFile::Find -E 'find sub{ my $o=$_; s/([^u4E00-u9FA5]{12}_)//g;rename $o,$_}, "." '
01.台北.书店之城.1.mp3

在命令行下查看当前目录下的目录
用于列出当前目录的目录:一级目录和所有目录。
使用内置的File::Find模块

代码如下:

perl -MFile::Find -E 'find sub{ print "$_," if(-d && length >1) }, $File::Find::prune = 1, "." '

这将会列出所有的目录,目前还写不出仅列出当前目录下一级目录。

使用File::Find::Rule模块实现起来最比较容易

代码如下:

perl -MFile::Find::Rule -E '@a=File::Find::Rule->directory->in(".");foreach(@a){say unless(/\/|\./)};'
perl -MFile::Find::Rule -E 'say for grep $_ ne ".", File::Find::Rule->maxdepth(1)->directory->in(".");'

对目录下的文件进行大小写修改

代码如下:

$ ls
CD1 CD2 CD3 CD4 CD5 CD6
$ perl -MFile::Find -e 'find sub{ rename $_,lc($1) if /(\w+\d$)/;}, "." '
$ ls
cd1 cd2 cd3 cd4 cd5 cd6

只是使用File::Find模块的find子例程来实现目录遍历,对符合条件的文件作重命名而已。

统计相关的tcp连接情况
查看ip尾数为9且端口为80的所有连接

代码如下:

netstat -naut|grep 9:80|perl -F'\s+' -alne '$F[4]=~/(.*)\:\d+/;$F[4]=$1;$s{$F[4]}++;' -e 'END { foreach (sort {$a<=>$b} keys %s){print "$_ \: $s{$_}"} }'

查看ip尾数为9且端口为80的所有连接,按连接数从多到少排列,显示前20个ip

代码如下:

netstat -naut|grep 9:80|perl -F'\s+' -alne '$F[4]=~/(.*)\:\d+/;$F[4]=$1;$s{$F[4]}++;' -e 'END {foreach (sort {$s{$b}<=>$s{$a}} keys %s){print "$_ \: $s{$_}"} }' |head -20

查看ip尾数为9且端口为80的所有连接,统计连接状态信息

代码如下:

netstat -naut|grep 9:80|perl -F'\s+' -alne '$s{$F[5]}++;' -e 'END { foreach (keys %s){chomp($_);print "$_ \: $s{$_}"} }'

统计一文本文件有多少行:

代码如下:

perl -le 'open FILE, "file_name"; @_=<FILE>; print $.'
perl -e 'print scalar(()=<>),"\n"' file_name
perl -wE'say~~(()=<>)' file_name
perl -e'print scalar(()=<>)' file_name
perl -lne 'END{print $.}' file_name
perl -le 'print $==()=<>' file_name
perl -ne 'print $. if eof' file_name

wc -l file_name
cat file_name |wc -l
more file_name |wc -l

注:经对一个包含六百多万行的文件进行处理,发现'wc -l'的效率是最好的。

其他
启动交互式perl:

代码如下:

perl -de 1

查看包含路径的内容:

代码如下:

perl -le 'print for @INC'

perl 生成随机密码
主要还是借用'rand'函数来实现。

代码如下:

$random = int( rand( $Y-$X+1 ) ) + $X;

下面的示例将会输出25-75之间的随机数:

代码如下:

$random = int( rand(51)) + 25;
print "$random\n";

The rand function returns a fractional number, from (and including) 0 up to (but not including) its argument. We give it an argument of 51 to get a number that can be 0 or more, but never 51 or more. We take the integer portion of this to get a number from 0 to 50, inclusive (50.99999.... will be turned
into 50 by int). We then add 25 to it to get a number from 25 to 75, inclusive.

从数组中随机返回元素

代码如下:

$elt = $array[ rand @array ];
$elt = $array[ int( rand(0+@array) ) ];

生成8位包含特殊的随机密码

代码如下:

@chars = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ % ^ & *) );
$password = join("", @chars[ map { rand @chars } ( 1 .. 8 ) ]);

可以据用户

代码如下:

use strict;
use warnings;
sub random_pwd {
    my $length = shift;
    my @chars = (0 .. 9, 'a' .. 'z', 'A' .. 'Z');
    return join '', @chars[ map rand @chars, 0 .. $length ];
}
print random_pwd(42);

生成42位长度的密码

代码如下:

use strict;
use warnings;
my @chars=("a".."z",0..9);

my $password="";
foreach(1..42){
  my $char=$chars[int(rand(@chars))];
  $char=uc($char) if rand() <0.5;
  $password.=$char;
}

print $password . "\n";

-------------------------------
my @chars = ('0'..'9', 'a'..'z', 'A'..'Z');
my $passwd =
   join '',
    map $chars[rand(@chars)],
     1..42;

调用String::Random模块来实现:

代码如下:

use strict;
use warnings;
use String::Random 'random_regex';

print random_regex('[a-zA-Z]{42}'), "\n";

使用perl in one line来完成:

代码如下:

perl -le "print map { ('a'..'z', 'A'..'Z', '0'..'9')[rand 62] } 1..42"

perl -le 'print map { ("a".."z")[rand 26] } 1..8'

perl -le 'print map { ("a".."z", 0..9)[rand 36] } 1..8'

perl -le 'print map { (q(a)..q(z))[rand(26)] } 1 .. 10'

相关问题参考:
--------------------------------------------------------------------------
Perl one-liner with single quote-perl命令行里处理单引号
示例如下:

代码如下:

echo "a,b" | perl -F',' -lane 'print $F[0];'
'a'

echo "a,b" | perl -F',' -lane 'print qq('$F[0]');'
[0]

echo "a,b" | perl -F',' -lane 'print q('$F[0]');'
[0]

以上三种方法都不能达到预期,可以使用'-w'参数来进行控制,但其在变量环境无法使用。

代码如下:

perl -lwe "print q( i'am );"
i'am

perl -lwe "$b=q( didn't ); print $b"

这里却没有了输出。

解决办法:
1、使用'\''转义。

代码如下:

echo "a,b" | perl -F',' -lane 'print "'\''$F[0]'\''";'
'a'

2、使用'''的ASCII码

代码如下:

echo "a,b" | perl -F',' -lane 'print "$F[0]\047";'
a'

echo "a,b" | perl -F',' -lane '$sq="\047"; print "$sq$F[0]$sq";'

(0)

相关推荐

  • perl 调试命令的相关知识小结

    缺省的Perl调试器就是perl解释器本身,另外还有图形界面的调试器.由于在开发程序时一般都使用telnet访问服务器,因此本文主要为大家介绍下缺省的命令行调试器的用法. 用-d命令行选项启动Perl解释器,例如:perl-dtest.pl即进入Perl调试器的交互界面. 调试命令列表:(所有命令都在调试提示符下顶格输入,命令大小写有关)h:显示调试器的帮助信息.|h:以分页形式显示调试器的帮助信息.hh:显示一个压缩的帮助信息.h调试命令:显示某个调试命令的帮助. Perl调试器用法中p表达式

  • Perl学习教程之单行命令详解

    前言 本文主要给大家介绍了关于Perl单行命令的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 与One-Liner相关的perl参数 -a 自动分隔模式,用空格分隔$并保存在@F中,也就是@F=split //, $ -F 指定-a的分隔符 -l 对输入的内容进行自动chomp,对输出的内容自动加换行符 -n 相当于while(<>) -e 执行命令,也就是脚本 -p 自动循环+输出,也就是while(<>){命令(脚本); print;} 记住以上几

  • Perl一句话命令行编程中常用参数总结

    工作中的线上环境有很多的perl命令行的类似一句话的命令,今天总结下perl的命令行编程的一些东西. -e 后面紧跟着引号里面的字符串是要执行的命令: 复制代码 代码如下: king@king:~$ perl -e 'print "hello world \n"' hello world 如果是多个命令就可以使用多个-e,这里是不是想到了sed呢?但是要注意的是中间的哪个";". 复制代码 代码如下: king@king:~$ perl -e 'print &quo

  • Perl命令行应用程序详解

    perl - Practical Extraction and Report Language,Perl有很多命令行参数,通过它可以让你的程序更简练,并且可以写出很多只有一行命令的perl.在这篇文章里我们来了解一些常用的命令行参数. 命令行调用 复制代码 代码如下: perl [ -sTtuUWX ] [ -hv ] [ -V[:configvar] ] [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ] [ -pna ] [ -Fpattern

  • Android中使用am命令实现在命令行启动程序详解

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码 代码如下: usage: am [subcommand] [options] start an Activity: am start [-D]         -D: enable debugging send a broadcast Intent: am broadcast start an Instrumentation: am instrument [flags]         -r

  • Python命令行解析模块详解

    本文研究的主要是Python命令行解析模块的相关内容,具体如下. Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块.下面就解读下这两种解析器. getopt模块 这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:].它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数).这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError). 这里重

  • Python argparse模块实现解析命令行参数方法详解

    argparse是Python的一个标准模块,用于解析命令行参数,即解析sys.argv中定义的参数.实现在:传送门 argparse模块还会自动生成帮助和使用信息,即在最后加-h或--help.当用户输入的参数无效时,会触发error,并给出出错原因. python test_argparse.py -h python test_argparse.py --help 使用argparse的步骤: 1.创建解析器:argparse.ArgumentParser(),ArgumentParser是

  • linux命令行批量创建目录详解

    linux命令行批量创建目录详解 以前一直用-p创建目录链,觉得很方便了. 在空目录/opt/app/myapp里创建src,再创建main,再创建java mkdir -p /opt/app/myapp/src/main/java 没想到还可以这样玩##¥%--&*( root@vm1:~/tmp# mkdir -p src/{{main,test}/{java,resources},main/webapp} root@vm1:~/tmp# tree . └── src ├── main │

  • node.js命令行教程图文详解

    本文先介绍原生的node.js实现命令行交互,了解原生的api,然后通过commander.js和inquirer.js实现一个完整的交互命令行工具. 项目地址 process (进程) process对象是一个全局变量,它提供了当前node.js进程的信息并对其控制.因为其是一个全局变量所以无需在文件中引入. 需要用到的几个api process.argv process.cwd() process.stdin process.stdout process.stdin.resume() pro

  • Windows 版本Git命令行的使用详解

    Git的使用基本教程 git安装 官网 msysgit.github.io(百度搜索git下载地址也行)下载 git安装(路径选择你的路径或者默认也行) 步骤中:出现选项注意选择Use git from git bash only(其他默认一路下一步就行了) 最后配置环境变量(目的就是在CDM窗口任意目录都可以执行git命令行) path:D:\Asoftware\java\Git\bin 详情请参考:https://www.jb51.net/article/191327.htm git配置账户

  • Python的命令行参数实例详解

    目录 0.命令行参数 1.sys.argv 2.getopt 2.1getopt.getopt方法 2.2Exceptiongetopt.GetoptError 3.argparse 总结 0. 命令行参数 通常,对于大型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这些命令行参数是提供给包含某种参数化信息的程序或脚本的参数.例如,在计算机视觉项目中,图像和不同类型的文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件. 命令行参数是参数化程序执行的一种常见

  • Python 命令行 prompt_toolkit 库详解

    目录 一. 使用 Bash 下常用快捷键 二. 实现查找历史命令 三. 根据历史输入自动提示 四. 实现输入的自动补全 Python 的第三方库 prompt_toolkit 用于打造交互式命令行,在交互式场景的使用中,prompt_toolkit 具有以下特点: 语法高亮 支持多行编辑 支持代码补全 支持自动提示 使用鼠标移动光标 支持查询历史 对 Unicode 支持良好 跨平台 支持 Emacs 与 Vi 风格的快捷键 prompt_toolkit 在使用前需要先进行安装: pip ins

  • linux shell命令行参数用法详解

    习惯使用linux命令行来管理linux系统,例如: 复制代码 代码如下: $ date 二 11 23 01:34:58 CST 1999  $ 用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统.命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字必须由空格或TAB隔开,格式如下:  复制代码 代码如下: $ Command Option Arguments 一,选项和参数 选项是包括一个或多个字母的代码,它前面有一个减号(减

随机推荐