perl 学习小结

 

perl apache服务

启动 http 服务 /etc/rc.d/init.d/httpd start

let this service  startup with the OS by  typing “chkconfig --level 35 httpd  on”

运行目录 /var/www/cgi-bin/

locate  hello.pl by entering   “http://10.198.91.80/cgi-bin/hello.pl”   in IE

Httpd WEB服务器

 

访问文件时候的 500错误解决:

chmod a+rx  hello.pl  (change mode of  hello.pl and make everyone is able to read and execute hello.pl )

 

用户输入

sub user_input {

        my $input = '';

        $input = <STDIN>;

        chop($input);

        $input =~ //s*(/S+)/s*/;

        return $1;

}

 

 

查看模块是否可用

perl -e 'use Getopt::Long'

 

 

Getopt::Long模块的使用

#!/usr/bin/perl -w

  use Getopt::Long;

  my $data   = "file.dat";

  my $length = 24;

  my $verbose;

  my $result = GetOptions ("length=i" => /$length,    # numeric

                        "file=s"   => /$data,      # string

                        "verbose"  => /$verbose);  # flag 

  print "length = $length /n";

  print "file =  $data /n";

  print "verbose = $verbose/n";

 

 

 

[autozone@cdc-vita yhan]$ perl -w getopt.pl -length 2 -file "abc.txt"  -verbose 123 123 12321 34234  

 

length = 2

file =  abc.txt

verbose = 1  // 调用 -verbose  变量 verbose 值设为 1 ,默认不设置。

 

 

 

有关数组的库函


(1)sort--按字符顺序排序
    @array = ("this", "is", "a","test");
    @array2 = sort(@array); # @array2 = ("a","is", "test", "this")
    @array = (70, 100, 8);
    @array = sort(@array); # @array = (100, 70, 8) now


( 2)reverse--反转数组
    @array2 = reverse(@array);
    @array2 = reverse sort (@array);


(3)chop--数组去尾
    chop的意义是去掉 STDIN(键盘)输入字符串时最后一个字符 --换行符。而如果它作用到数组上,则将数组中每一个元素都做如此处理。
    @list = ("rabbit", "12345","quartz");
    chop (@list); # @list = ("rabbi", "1234","quart") now


( 4)join/split--连接 /拆分
    join的第一个参数是连接所用的中间字符,其余则为待连接的字符数组。
    $string = join(" ", "this", "is","a", "string"); # 结果为 "this is a string"
    @list = ("words","and");
    $string = join("::", @list, "colons"); #结果为 "words::and::colons"
    @array = split(/::/,$string); # @array = ("words","and", "colons") now

 

 

perl telnet模板使用小结

http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Telnet.pm


(1) missing opening delimiter of match operator at telnet_Test2.pl line 16

在匹配的 my $prompt = '/cdc-d2950l20:~ #/'; 中要添加 /   /

 

(2)Log 设定

$telnet->input_log("log 地址 ");

 

$telnet->input_log("/home/autozone/yhan/log");

 

 

(3)Prompt 要与 cmd 进行搭配

# 创建的使用需要制定对应的 $prompt

 

my $prompt = '/cdc-d2950l20:~ #/';

 

my $telnet=new Net::Telnet(Prompt=>"$prompt");

 

 

cdc-d2950l20:~ # ls

.Xauthority    .rhosts                                  bin

.bash_history  .ssh                                     file

.exrc          .suse_register.log                       mbox

.gnupg         .viminfo                                 vxexplore.tar.Z

.kbd           .wapi                                    yhan

.lesshst       VRTSexplorer

.qt            VRTSvita-SUT-1.0-09.00.x86_64_linux.rpm

 

 

(4) 使用 print () 要和 waitfor() 进行搭配。

比如:

$telnet->print(“ls”);

$telnet->waitfor(Match=>'/assword/', Timeout=>20);print $telnet->cmd("ls"); 

 

Use a combination of print() and waitfor() as an alternative to login() or cmd() when they don't do what you want.

 

 

目录操作

 

 

 

perl的批处理

          一般情况 sed 也可以

       sed -i 's//.$//!/g' regular_express.txt

      # 上头的 -i 选项可以让你的 sed 直接去修改后面接的档案内容而不是由萤幕输出喔!

      # 这个范例是用在取代!请您自行 cat 该档案去查阅结果啰!

 

    Linux  perl系统下批量替换文件内

        find -name '要查找的文件名 ' | xargs perl -pi -e 's|被替换的字符串 |替换后的字符串 |g'

 perl -pi -e

Perl 命令中加上 -e 选项,后跟一行代码,就会像运行一个普通的 Perl 脚本那样运行该代码 .

从命令行中使用 Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作 .

 

批替换

#perl  -pi  -e’s/aaa/bbb/’  filename          

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

     


匹配一行并显示出来

#perl  -ne  ‘print  if  /^aaaaa/’  filename
grep 一样过滤文件中需要的内容 . 这个地方 , 使用了 -n, 所以一次是做一行的操作 , 直到整个文件读完 . 另外 , 在管道时 ,-n 也会一样 , 遍历管道送过来的内容 .

 

   给当前文章的添加一行号      

#perl  -n  -e  ‘print  "$.  –  $_"’  filename          

这个例子中的 , 没用 -ne, 只是命令写成了 -n  -e, 其实一样 , 这个例子中 , 是给当前文件中的内容都加一个行号打印出来 . :$. 表示当前行号

给当前文章的添加一行号      

#perl  -pe  ‘$_  =  "$.    $_"’  filename                 这个其实和上面一样 , 分别只是使用了 -p 替换了 -n, 这个有个什么好处啦 , 别的地方都一样 , -p 按行来遍历完文件后 , 会给 $_ 打印出来 .


代替 awk来使用

家还记得 awk 分割域 (awk  ‘{i  =  NF  –  1;  print  $1  +  $i}’) , 是不是很方便 , 下面我们来看看 perl
#perl  -lane  ‘print  $F[0]  +  $F[-2]‘          
这个神奇的地方在于 -a, 使用 -a . 因为 -n 分行读进来 , 然后 -a 给数据分割成 @F 的数组 .

 

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

#perl  -ne  ‘print  if  /^START$/  ..  /^END$/’    

 

有效地打印数字范围中的行
#perl  -ne  ‘print  if  $.  >=  15;  exit  if  $.  >=  17;’  

 

原地修改  -i   开关的神奇之处在于它对  @ARGV   中的每个文件都用该脚本对该文件输出所产生的文件版本进行替代
#perl  -p  -i.bak  -e  ’s//bfoo/b/bar/g’  *.c            

 

给文件中的内容反向排序 , 比如文件中有 fukai, 就会变成 iakuf
#perl  -ne  ‘print  scalar  reverse  $_’  test      

 

关于 sed grep的文字处理

 

[root@www ~]# sed [-nefr] [



动作

]




选项与参数:




-n  





:使用安静

(silent)



模式。在一般

 sed 



的用法中,所有来自

 STDIN 



      





的资料一般都会被列出到萤幕上。但如果加上

 -n 



参数后,则只有经过




      

sed 



特殊处理的那一行

(



或者动作

)



才会被列出来。




-e  





:直接在指令列模式上进行

 sed 



的动作编辑;




-f  





:直接将

 sed 



的动作写在一个档案内,

 -f filename 



则可以执行

 filename 



内的

 




      

sed 



动作;




-r  







sed 



的动作支援的是延伸型正规表示法的语法。

(



预设是基础正规表示法语法

)



-i  





:直接修改读取的档案内容,而不是由萤幕输出。




 



动作说明:

  

[n1[,n2]]function



n1, n2 



:不见得会存在,一般代表





选择进行动作的行数





,举例来说,如果我的动作




         





是需要在

 10 





 20 



行之间进行的,则

‘ 10,20[



动作行为

] ’



 



function 



有底下这些咚咚:




a   





:新增,

 a 



的后面可以接字串,而这些字串会在新的一行出现

(



目前的下一行

)








c   





:取代,

 c 



的后面可以接字串,这些字串可以取代

 n1,n2 



之间的行!




d   





:删除,因为是删除啊,所以

 d 



后面通常不接任何咚咚;




i   





:插入,

 i 



的后面可以接字串,而这些字串会在新的一行出现

(



目前的上一行

)








p   





:列印,亦即将某个选择的资料印出。通常

 p 



会与参数

 sed -n 



一起运作~




s   





:取代,可以直接进行取代的工作哩!通常这个

 s 



的动作可以搭配




      





正规表示法!例如

 1,20s/old/new/g 



就是啦!




 

以行为单位的新增 /删除功能

 

范例一:将

 /etc/passwd 



的内容列出并且列印行号,同时,请将第

 2~5 



行删除!




[root@www ~]# nl /etc/passwd | sed '2,5d'
     

1  

root:x:0:0:root:/root:/bin/bash
     

6  

sync:x:5:0:sync:/sbin:/bin/sync
     

7  

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

 

 

范例二:承上题,在第二行后



(亦即是加在第三行

)加上

‘drink tea?’字样!





[root@www ~]# nl /etc/passwd | sed '2a drink tea'
     

1  

root:x:0:0:root:/root:/bin/bash
     

2  

bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
     

3  

daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

范例三:在第二行后面加入两行字,例如



‘Drink tea or .....’

‘drink beer?’



[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ....../

> drink beer ?'

     

1  

root:x:0:0:root:/root:/bin/bash
     

2  

bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
     

3  

daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(

后面省略

).....

 

以行为单位的取代与显示功能

范例四:我想将第



2-5行的内容取代成为

‘No 2-5 number’呢?





[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'

     

1  

root:x:0:0:root:/root:/bin/bash
No 2-5 number
     

6  

sync:x:5:0:sync:/sbin:/bin/sync
.....(

后面省略

).....

 

 

范例五:仅列出



 /etc/passwd 档案内的第

 5-7 





[root@www ~]# nl /etc/passwd | sed -n '5,7p'

     

5  

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     

6  

sync:x:5:0:sync:/sbin:/bin/sync
     

7  

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

 

部分资料的搜寻并取代的功能

sed 's/

要被取代的字串

/

新的字串

/g'

 

步骤一:先观察原始讯息,利用



 /sbin/ifconfig  

查询

 IP 为何?





[root@www ~]# /sbin/ifconfig eth0

eth0      

Link encap:Ethernet  

HWaddr 00:90:CC:A6:34:84
          

inet addr:192.168.1.100  

Bcast:192.168.1.255  

Mask:255.255.255.0

          

inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
          

UP BROADCAST RUNNING MULTICAST  

MTU:1500  

Metric:1
.....(

以下省略

).....

# 

因为我们还没有讲到

 IP 

,这里你先有个概念即可啊!我们的重点在第二行,



# 

也就是

 192.168.1.100 

那一行而已!先利用关键字捉出那一行!



 
 



 



步骤二:利用关键字配合



 grep 撷取出关键的一行资料





[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr'

          

inet addr

:192.168.1.100  

Bcast:192.168.1.255  

Mask:255.255.255.0
# 

当场仅剩下一行!接下来,我们要将开始到

 addr: 

通通删除,就是像底下这样:



# inet addr:192.168.1.100  

Bcast:192.168.1.255  

Mask:255.255.255.0

# 

上面的删除关键在于

‘ ^.*inet addr: ’

啦!正规表示法出现!

 ^_^

 

 

步骤三:将



 IP 前面的部分予以删除





[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | /

>  

sed 's/^.*addr://g'

192.168.1.100  

Bcast:192.168.1.255  

Mask:255.255.255.0
# 

仔细与上个步骤比较一下,前面的部分不见了!接下来则是删除后续的部分,亦即:



# 192.168.1.100  

Bcast:192.168.1.255  

Mask:255.255.255.0

# 

此时所需的正规表示法为:

‘ Bcast.*$ ’

就是啦!



 

 

 

步骤四:将



 IP 后面的部分予以删除





[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | /

>  

sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

192.168.1.100

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值