LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1252|回复: 5

[已解决]请各位大虾帮我看看这个 perl 程序

[复制链接]
发表于 2007-2-14 20:48:22 | 显示全部楼层 |阅读模式
各位好!

这有个perl程序,是对last的输出做统计,统计用户总的登录时间和次数,并按字母顺序排序,可为什么我得不要想要的结果?没有任何输出,请各位大虾帮忙看看,谢谢!
  1. #!/usr/bin/perl -w
  2. while (<>) {
  3.     if (/^(\S*)\s*.*\((.*):(.*)\)$/) {
  4.         $hours{$1} += $2;
  5.         $minutes{$2} += $3;
  6.         $logins{$1}++;
  7.     }
  8. }
  9. foreach $user (sort (keys %hours)) {
  10.     $hours{$user} += int ($minutes{$user} / 60);
  11.     $minutes{$user} %= 60;
  12.     print "User $user, total login time ";
  13.     printf "%02d:%02d,", $hours{$user}, $minutes{$user};
  14.     print "total logins $logins{$user}\n";
  15. }
复制代码

last 的输出样例:
  1. jackie  pts/1    192.168.2.105  Sat Feb 3 15:54 - 16:20 (00:25)   
复制代码
发表于 2007-2-14 21:08:40 | 显示全部楼层
perl我看不懂,你怎么不用PHP呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-14 21:13:30 | 显示全部楼层
呵呵,我是初学Perl,因为Perl和系统管理的关系更密切一些,所以就选了Perl罗,谢谢你的回复!
回复 支持 反对

使用道具 举报

发表于 2007-2-15 00:40:27 | 显示全部楼层
只看了前面几行,后面的没看,你按我说的改改试试


  1. #!/usr/bin/perl -w

  2. while (<>) {
  3.     if (/^(\S*)\s*.*\((.*):(.*)\)$/) {
  4.         $hours{$1} += $2;
  5.         $minutes{$2} += $3; # should be $minutes{$[color="Red"]1[/color]} += $3;
  6.         $logins{$1}++;
  7.     }
  8. }
  9. foreach $user (sort (keys %hours)) {
  10.     print "test";
  11.     $hours{$user} += int ($minutes{$user} / 60);
  12.     $minutes{$user} %= 60;
  13.     print "User $user, total login time ";
  14.     printf "%02d:%02d,", $hours{$user}, $minutes{$user};
  15.     print "total logins $logins{$user}\n";
  16. }

复制代码
回复 支持 反对

使用道具 举报

发表于 2007-2-15 09:45:45 | 显示全部楼层
建议把*全部改成+。
你这样用*的习惯很容易出错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-15 10:08:40 | 显示全部楼层
谢谢楼上各位的回答,问题已经解决,问题出在我的linux的last的输出的每行最后不是以")"结尾,后面还多了四个空格!自然正则表达式匹配不到时间罗,最后的代码如下:

  1. #!/usr/bin/perl -w

  2. while (<>) {
  3.         if (/^(\S+).*\((\d*)\+?(\d\d):(\d\d)\)/) {
  4.                 $days{$1} += $2 ? $2 : 0;
  5.                 $hours{$1} += $3;
  6.                 $minutes{$1} += $4;
  7.                 $logins{$1}++;
  8.         }
  9. }
  10. foreach $user (sort(keys %hours)) {
  11.         $hours{$user} += $days{$user} * 24 + int($minutes{$user} / 60);
  12.         $minutes{$user} %= 60;
  13.         print "User $user, total login time ";
  14.         printf "%02d:%02d, ", $hours{$user}, $minutes{$user};
  15.         print "total logins $logins{$user}.\n";
  16. }
复制代码


详情见: http://bbs.chinaunix.net/viewthr ... &extra=page%3D1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表