某日在网上溜达,看见一网友博客(http://rainbird.blog.51cto.com/211214/165779)上的两道题,作者说没有两年linux道行,很难做出其中三道。这里我们看看这些题究竟有多难(仅针对脚本编程)。
 
第一道:
 
 
 
- 取出/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?"$keyt$valn";?
 
  
  - }?
 
 
 
 
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就可以搞定的
 
 
 
- #!/usr/bin/perl?-w?
 
  
  - ?
 
  
  - use?strict;?
 
  
  - ?
 
  
  - my?(%A,%B);?
 
  
  - ?
 
  
  - open?my?$file,'employee.txt'?or?die?"$!n";?
 
  
  - ?
 
  
  - while?(?<$file>?)?{?
 
  
  - ???????chomp;?
 
  
  - ???????/^(d+)s+w+s+w+/;?
 
  
  - ???????$A{$1}?=?$_?if?$1?;?
 
  
  - }?
 
  
  - ?
 
  
  - close?$file;?
 
  
  - ?
 
  
  - open?$file,'bonus.txt'?or?die?"$!n";?
 
  
  - ?
 
  
  - while?(?<$file>?)?{?
 
  
  - ???????chomp;?
 
  
  - ???????/^(d+)s+($S+)/;?
 
  
  - ???????$B{$1}?=?$2?if?(?$1?||?$2?);?
 
  
  - }?
 
  
  - ?
 
  
  - close?$file;?
 
  
  - ?
 
  
  - for?my?$num?( keys?%A?)?{?
 
  
  - ?
 
  
  - ????if?(?exists?$B{$num}?)?{?
 
  
  - ????????$A{$num}?.=?"t$B{$num}";?
 
  
  - ????}?
 
  
  - ?
 
  
  - }?
 
  
  - ?
 
  
  - print?join?"n",sort values?%A;?
 
  
  - print qq/n/;?
 
 
 
 
output: 
 
 
 
- [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的冲动了没?