无法从文件中获取正确的输出

时间:2016-02-16 12:27:06

标签: regex linux perl

好的,这是我的代码:Pastebin

我想要做的是从文件/ etc / passwd中读取并提取UID超过1000但小于65000的所有用户。对于这些用户,我还想打印出他们登录的次数。使用此当前代码,输出如下:

  

用户:15

     

用户:4

     

用户:4

这个问题是他们没有登录15次或4次,因为程序正在计算从“last”命令输出的每一行。因此,如果我运行命令“last -l user”,它将看起来像这样:

user     pts/0        :0               Mon Feb 15 19:49 - 19:49  (00:00)
user     :0           :0               Mon Feb 15 19:49 - 19:49  (00:00)

wtmp begins Tue Jan 26 13:52:13 2016

我感兴趣的部分是“用户:0”行,而不是其他行。这就是为什么程序输出数字4而不是1,就像它应该的那样。所以我想出了一个正则表达式,只得到我需要的部分,它看起来像这样:

\n(\w{1,9})\s+:0

但是我不能让它工作,我只会一直得到错误。 我希望有人可以帮助我。

3 个答案:

答案 0 :(得分:1)

我认为这个正则表达式会做你想做的事:m/^\w+\s+\:0\s+/

根据您发布的代码,这里有一些对我有用的代码...如果您有任何疑问,请告诉我们! :)

#!/usr/bin/perl

use Modern::Perl '2009';    # strict, warnings, 'say'

# Get a (read only) filehandle for /etc/passwd
open my $passwd, '<', '/etc/passwd' 
    or die "Failed to open /etc/passwd for reading: $!";

# Create a hash to store the results in
my %results;

# Loop through the passwd file
while ( my $lines = <$passwd> ) {
    my @user_details = split ':', $lines;

    my $user_id = $user_details[2];

    if ( $user_id >= 1000 && $user_id < 6500 ) {
        my $username = $user_details[0];

        # Run the 'last' command, store the output in an array
        my @last_lines = `last $username`;

        # Loop through the output from 'last'
        foreach my $line ( @last_lines ) {
            if ( $line =~ m/^\w+\s+\:0\s+/ ) {
                # Looks like a direct login - increment the login count
                $results{ $username }++;
            }
        }
    }
}

# Close the filehandle
close $passwd or die "Failed to close /etc/passwd after reading: $!";

# Loop through the hash keys outputting the direct login count for each username
foreach my $username ( keys %results ) {
    say $username, "\t", $results{ $username };
}

答案 1 :(得分:0)

所以答案是使用

my @lastbash = qx(last $_ | grep ":0 *:");
你的代码中的

答案 2 :(得分:0)

您问题的最短修复方法是通过“grep”运行“last”输出。

my @lastbash = qx(last $_ | grep ' :.* :');