天天看點

Perl輕松分析資料兩例

第一道:

取出/etc/passwd中shell出現的次數 

順便貼一下我的/etc/passwd檔案

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

bin:x:1:1:bin:/bin:/sbin/nologin 

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

adm:x:3:4:adm:/var/adm:/sbin/nologin 

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

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

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

halt:x:7:0:halt:/sbin:/sbin/halt 

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 

news:x:9:13:news:/etc/news: 

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 

operator:x:11:0:operator:/root:/sbin/nologin 

games:x:12:100:games:/usr/games:/sbin/nologin 

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin 

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 

nobody:x:99:99:Nobody:/:/sbin/nologin 

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin 

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin 

rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin 

mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin 

smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin 

oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin 

pcap:x:77:77::/var/arpwatch:/sbin/nologin 

dbus:x:81:81:System message bus:/:/sbin/nologin 

avahi:x:70:70:Avahi daemon:/:/sbin/nologin 

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin 

nfsnobody:x:4294967294:4294967294:Anonymous NFS User:/var/lib/nfs:/sbin/nologin 

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin 

avahi-autoipd:x:100:156:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin 

xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin 

ntp:x:38:38::/etc/ntp:/sbin/nologin 

這道題真的很簡單,要知道處理文本那可是Perl的強項。熟悉perl的童鞋,一個hash就能搞定。

#!/usr/bin/perl -w 

use strict; 

my %hash; 

open my $file,'<','/etc/passwd' or die "$!\n"; 

while ( <$file> ) { 

       chomp; 

       my @shell = split /:/; 

       if ( $shell[6] ) { 

          if ( exists $hash{$shell[6]} ) { 

              $hash{$shell[6]}++; 

          } else { 

              $hash{$shell[6]} = 1; 

          } 

      } 

close $file; 

while ( my ( $key,$val ) = each %hash ) { 

       print "$key\t$val\n"; 

output:

[root@Xen ~]# perl c.pl 

/sbin/halt      1 

/bin/sync       1 

/sbin/nologin   27 

/sbin/shutdown  1 

/bin/bash       1 

第二道:

employee檔案中記錄了工号和姓名

100 Jason Smith 

200 John Doe 

300 Sanjay Gupta 

400 Ashok Sharma  

bonus檔案中記錄工号和工資

100 $5,000 

200 $500 

300 $3,000 

400 $1,250  

要求把兩個檔案合并并輸出如下

處理結果:

400 ashok sharma $1,250 

100 jason smith  $5,000 

200 john doe  $500 

300 sanjay gupta  $3,000 

這道題也不是特别的難,兩個hash就可以搞定的

my (%A,%B); 

open my $file,'<','employee.txt' or die "$!\n"; 

       /^(\d+)\s+\w+\s+\w+/; 

       $A{$1} = $_ if $1 ; 

open $file,'<','bonus.txt' or die "$!\n"; 

       /^(\d+)\s+(\$\S+)/; 

       $B{$1} = $2 if ( $1 || $2 ); 

for my $num ( keys %A ) { 

    if ( exists $B{$num} ) { 

        $A{$num} .= "\t$B{$num}"; 

    } 

print join "\n",sort values %A; 

print qq/\n/; 

[root@Xen ~]# perl hebin.pl 

100 Jason Smith $5,000 

200 John Doe    $500 

300 Sanjay Gupta        $3,000 

400 Ashok Sharma        $1,250 

怎麼樣,看完上面的代碼,您有學習perl的沖動了沒?

本文轉自dongfang_09859 51CTO部落格,原文連結:http://blog.51cto.com/hellosa/596099,如需轉載請自行聯系原作者